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

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

最佳答案

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

关于在 FreeRTOS 中创建具有多个队列的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17691558/

相关文章:

c++ - FreeRTOS STM32 链接器堆栈大小与任务堆栈大小

c - Visual Studio 8 的 C 源代码上出现错误 C2491

c++ - 用于嵌入式 Linux 的非 GPL C/C++ XMPP 客户端库

C编程,动态分配+链表

无法解决 C 中的 snprintf 警告

c - 考虑使用粒子电子作为过程 Controller

embedded - blackfin bf561 FreeRTOS 实现在加载任务时在运行时失败

c - 扩展结构数组

c++ - 如何在 log(n) 或更短时间内计算此序列的第 n 个元素?

c - 随机硬故障 - STM32F4 - FreeRTOS