4

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

4

1 回答 1

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 全局变量。对于嵌入式系统,我认为这样做没有任何问题......我知道他们在学校教你避免使用全局变量,但在这种情况下,将变量设为全局变量和静态变量是个好主意,因为它们由任务。

于 2013-07-17T05:41:40.437 回答