Embedded 一旦宣布第二个任务,FreeRTOS任务就会陷入困境
我正在使用VisualGFX为我的STM32F429i发现板开发一个用户界面。VisualGFX内置了freeRTOS,并创建了一个GUITask来处理GUI操作。然后,我尝试使用freeRTOS的xTaskCreate API函数创建一个名为ControllerTask的新任务,该函数与用于创建GUITask的函数相同 然而,当我创建第二个任务时,GUITask就会在我的GUI上显示一些奇怪的值,并且没有任何功能Embedded 一旦宣布第二个任务,FreeRTOS任务就会陷入困境,embedded,freertos,Embedded,Freertos,我正在使用VisualGFX为我的STM32F429i发现板开发一个用户界面。VisualGFX内置了freeRTOS,并创建了一个GUITask来处理GUI操作。然后,我尝试使用freeRTOS的xTaskCreate API函数创建一个名为ControllerTask的新任务,该函数与用于创建GUITask的函数相同 然而,当我创建第二个任务时,GUITask就会在我的GUI上显示一些奇怪的值,并且没有任何功能 int main(void){ ... xTaskCre
int main(void){
...
xTaskCreate(GUITask, (TASKCREATE_NAME_TYPE)"GUITask",
configGUI_TASK_STK_SIZE,
NULL,
configGUI_TASK_PRIORITY,
NULL);
xTaskCreate (ControllerTask, (TASKCREATE_NAME_TYPE)"ControllerTask",
configController_TASK_STK_SIZE,
NULL,
configController_TASK_PRIORITY,
NULL);
vTaskStartScheduler();
for (;;);
上面的代码显示了这两个任务的创建。GuitTask的优先级高于ControllerTask。下一段代码显示了任务的实现
static void GUITask(void* params)
{
touchgfx::HAL::getInstance()->taskEntry();
}
static void ControllerTask(void* params)
{
while(1)
{
vTaskDelay(3000);
}
}
可以看出,此时ControllerTask的实现只会在每次切换到时将任务延迟大约3秒
但是,GUITask会被卡住,无法进行GUI更新或交互。基本上可能发生的情况是,taskEntry()函数永远不会返回,因此也不会通过使用vTaskDelay或其他队列调用将处理时间回馈给内核 void taskEntry()虚拟主事件循环。将等待VSYNC 信号,然后处理下一帧。从GUI调用此函数 任务 注意这个函数永远不会返回!在HALSDL2中重新实现,以及 哈尔斯德尔 如果两个任务具有相同的优先级,或者如果您的touchgfx具有更高的优先级,您将被卡住 要解决这个问题,有两种方法
基本上,可能发生的情况是,taskEntry()函数永远不会返回,因此也不会通过使用vTaskDelay或其他队列调用将处理时间回馈给内核 void taskEntry()虚拟主事件循环。将等待VSYNC 信号,然后处理下一帧。从GUI调用此函数 任务 注意这个函数永远不会返回!在HALSDL2中重新实现,以及 哈尔斯德尔 如果两个任务具有相同的优先级,或者如果您的touchgfx具有更高的优先级,您将被卡住 要解决这个问题,有两种方法
您是否检查了
xTaskCreate
的返回值?@DKrueger,我没有检查。我该怎么做?应该是什么?你看到了吗……你是在问如何检查函数的返回值吗?这是一个非常基本的C问题,如果您不熟悉C,使用RTOS可能不是最好的起点。您是否阅读过xTaskCreate()的API文档,因为它显示了正在测试的返回值?您还可以实现malloc()failed hook(Google it),如果分配失败,它将被触发,或者根本不使用动态分配。您是否检查了xTaskCreate
的返回值?@DKrueger,我没有检查。我该怎么做?应该是什么?你看到了吗……你是在问如何检查函数的返回值吗?这是一个非常基本的C问题,如果您不熟悉C,使用RTOS可能不是最好的起点。您是否阅读过xTaskCreate()的API文档,因为它显示了正在测试的返回值?您还可以实现malloc()failed hook(googleit),如果分配失败,就会触发它,或者根本不使用动态分配。