2016-11-08 121 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. 啓用空閒任務並實現該方法的調用。