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

rou*_*urn 4 c freertos

我在向FreeRTOS中的任务发送多个队列时遇到问题.

我已经尝试过创建一个结构来保存它们:

typedef struct
{
    xQueueHandle buttonQueue;
    xQueueHandle OLEDQueue;
} xQueues;
Run Code Online (Sandbox Code Playgroud)

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

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

并在任务中像这样访问它:

static void vGetAltitude(void *pvParameters) {
    xQueues *xADCQueues = ( xQueues * ) pvParameters;
    xQueueHandle xOLEDQueue = xADCQueues->OLEDQueue;
    xQueueHandle xButtonQueue = xADCQueues->buttonQueue;
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ata 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 );
}
Run Code Online (Sandbox Code Playgroud)

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