【问题标题】:Create task with multiple queues in FreeRTOS?在 FreeRTOS 中创建具有多个队列的任务?
【发布时间】:2013-07-15 12:29:14
【问题描述】:

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

【问题讨论】:

    标签: c freertos


    【解决方案1】:

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

    【讨论】:

    • 伙计,我在那里犯了一些愚蠢的错误。谢谢!就队列的全局变量情况而言,多个 .c/.h 文件仍然可以(在头文件中使用 extern)?
    • 如果这些队列不应该共享,那么为每个任务分配一个队列,如果它们要共享,那么可能需要一些同步。希望你不会很快写飞机固件:)
    • 将队列声明放在带有 extern 的头文件中是一种很好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多