2016-11-08 86 views
1

我正在使用VisualGFX为我的STM32F429i-Discovery板开发用户界面。 VisualGFX内置了freeRTOS用法,创建一个GUITask来处理GUI操作。然后,我尝试使用freeRTOS中的xTaskCreate API函数创建一个名为ControllerTask的新任务,这与创建GUITask的功能相同。FreeRTOS宣布第二个任务后即刻卡住

但是,只要我创建第二个任务,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

您是否检查过'xTaskCreate'的返回值? –

+0

@DKrueger,我没有检查过。我该怎么做 ?它应该是什么? – 4DaMouf

+1

您是否看到[The man](http://www.freertos.org/a00125.html).... – LPs

回答

0

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

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

注意此函数永不返回!在HALSDL2中重新实现,和 HALSDL。

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

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

  1. 是要执行具有优先级的任务,并将该任务设置为全部最低优先级。

  2. 启用空闲任务并实现该方法的调用。