我在向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文件之间传递队列.即.创建它和一个文件,但能够在另一个文件的任务中使用它吗?
你有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全局变量.我没有看到嵌入式系统这样做有什么问题...我知道他们在学校教你避免全局变量,但在这种情况下,最好将变量设为全局和静态,因为它们是由共享的任务.