在FreeRTOS中创建多个队列的任务?

时间:2013-07-17 05:08:34

标签: c 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文件之间传递队列。即。创建它和一个文件,但能够在另一个文件的任务中使用它吗?

1 个答案:

答案 0 :(得分:5)

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

用这个

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

或根本不打扰创建xADCQueues,而只是制作xButtonQueue和xOLEDQueue全局变量。我没有看到嵌入式系统这样做有什么问题...我知道他们在学校教你避免全局变量,但在这种情况下,最好将变量设为全局和静态,因为它们是由共享的任务。