我正在使用VisualGFX为我的STM32F429i-Discovery板开发用户界面。 VisualGFX内置了freeRTOS用法,创建了GUITask来处理GUI操作。然后我尝试使用freeRTOS中的xTaskCreate API函数创建一个名为ControllerTask的新任务,该函数与用于创建GUITask的函数相同。
然而,只要我创建第二个任务,GUITask就会在我的GUI上显示一些奇怪的值,并且没有任何功能。
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 (;;);
上面的代码显示了这两个任务的创建。 GUITask的优先级高于ControllerTask的优先级。下一段代码显示了Task实现。
static void GUITask(void* params)
{
touchgfx::HAL::getInstance()->taskEntry();
}
static void ControllerTask(void* params)
{
while(1)
{
vTaskDelay(3000);
}
}
可以看出,此时ControllerTask的实现仅在每次切换到任务时延迟约3秒。
但是,GUITask卡住了,无法进行GUI更新或交互。
答案 0 :(得分:0)
基本上可能发生的是taskEntry()函数永远不会返回,因此永远不会通过使用vTaskDelay或其他Queue调用向内核返回处理时间。
void taskEntry()虚拟主事件循环。将等待VSYNC 信号,然后处理下一帧。从GUI调用此函数 任务。
注意此功能永远不会返回!在HALSDL2中重新实现,和 HALSDL。
如果两个任务具有相同的优先级,或者touchgfx具有更高的优先级,则会卡住。
要解决这个问题,有两种方法。
是用优先级实现任务,并将该任务设置为all的最低优先级。
启用空闲任务并对该方法实施调用。