我在向 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/