FreeRTOS任务在声明第二个任务后很快就会卡住

时间:2016-11-08 22:28:08

标签: embedded freertos

我正在使用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更新或交互。

1 个答案:

答案 0 :(得分:0)

基本上可能发生的是taskEntry()函数永远不会返回,因此永远不会通过使用vTaskDelay或其他Queue调用向内核返回处理时间。

  

void taskEntry()虚拟主事件循环。将等待VSYNC   信号,然后处理下一帧。从GUI调用此函数   任务。

     

注意此功能永远不会返回!在HALSDL2中重新实现,和   HALSDL。

如果两个任务具有相同的优先级,或者touchgfx具有更高的优先级,则会卡住。

要解决这个问题,有两种方法。

  1. 是用优先级实现任务,并将该任务设置为all的最低优先级。

  2. 启用空闲任务并对该方法实施调用。