2013-07-17 25 views
4

我无法将多个队列发送到FreeRTOS中的任务。在FreeRTOS中创建多个队列的任务?

我试图创建一个结构来牵制他们就像这样:

typedef struct 
{ 
    xQueueHandle buttonQueue; 
    xQueueHandle OLEDQueue; 
} xQueues; 

,然后将它发送到这样的任务:

void vStartADCtasks(xQueueHandle xButtonQueuex, QueueHandle xOLEDQueue) 
{ 
    xQueues xADCQueues = { xOLEDQueue, xButtonQueue }; 
    xTaskCreate(vGetAltitude, "Get Altitude", 240, (void *) &xADCQueues, 2, NULL); 
} 

,并在任务访问它是这样的:

static void vGetAltitude(void *pvParameters) { 
    xQueues *xADCQueues = (xQueues *) pvParameters; 
    xQueueHandle xOLEDQueue = xADCQueues->OLEDQueue; 
    xQueueHandle xButtonQueue = xADCQueues->buttonQueue; 

但这不起作用。有小费吗?我想我的更一般的问题是如何绕过多个.c文件之间的队列。即。创建它和一个文件,但能够在另一个文件中的任务中使用它?

回答

4

你有3个错误。首先,当你尝试初始化xADCQueues时,你已经交换了队列的顺序。其次,您应该将xADCQueues作为第四个参数传递给xTaskCreate。第三,你的xADCQueues结构体是在堆栈上创建的,这意味着vStartADCtasks返回后,该结构体被销毁并被覆盖。

与此

xQueues xADCQueues; 
void vStartADCtasks(xQueueHandle xOLEDQueue, xQueueHandle xButtonQueue) 
{ 
    xADCQueues.buttonQueue = xButtonQueue; 
    xADCQueues.OLEDQueue = xOLEDQueue; 
    xTaskCreate(vGetAltitude, "Get Altitude", 240, (void *) &xADCQueues, 2, NULL); 
} 

更换你vStartADCtasks或不打扰创造xADCQueues所有,但只是使xButtonQueue和xOLEDQueue全局变量。我没有看到为嵌入式系统做这件事有什么问题......我知道他们在学校教你避免全局变量,但在这种情况下,将变量设为全局变量和静态变量是一个好主意,因为它们由任务。

+0

我在那里犯了一些愚蠢的错误。谢谢!根据队列的全局变量情况,多个.c/.h文件仍然可以(在头文件中使用extern)? – routeburn

+0

如果不应共享那些队列,则为每个任务分配一个队列,如果要共享这些队列,则可能需要一些同步。希望你不会很快写出飞机固件:) – iabdalkader

+0

用extern将队列声明放在头文件中是一个很好的方法。 –