2016-11-08 46 views
1

VisualGFXを使用して、STM32F429iディスカバリー・ボードのユーザー・インターフェースを開発しています。 VisualGFXはfreeRTOSの使用法を組み込み、GUITaskを作成してGUI操作を処理します。私は、GUITaskを作成するのと同じ機能を持つfreeRTOSからxTaskCreate API関数を使ってControllerTaskという新しいタスクを作成しようとしています。FreeRTOS 2番目のタスクが宣言されるとすぐにタスクが停止する

ただし、この2番目のタスクを作成すると、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 (;;); 

上記のコードは、2つのタスクの作成を示しています。 GUITaskの優先度は、ControllerTaskの優先度より高くなっています。次のコードは、タスクの実装を示しています。時間におけるこの時点でControllerTaskの実装のみ約3秒間それが切り替えられるたびに、タスクを遅らせるさ分かるよう

 static void GUITask(void* params) 
     { 
      touchgfx::HAL::getInstance()->taskEntry(); 
     } 

    static void ControllerTask(void* params) 
    { 
     while(1) 
     { 
     vTaskDelay(3000); 
     } 
    } 

ただし、GUITaskが停止し、GUIの更新や対話ができません。

+1

'xTaskCreate'の戻り値を確認しましたか? –

+0

@jpruger、私はそれをチェックしていない。どうすればいいのですか ?そしてそれは何でしょうか? – 4DaMouf

+1

あなたは[The man](http://www.freertos.org/a00125.html)を見ましたか? – LPs

答えて

0

taskEntry()関数は決して返されないので、vTaskDelayや他のQueue呼び出しを使用してカーネルに処理時間を返すことはありません。

void taskEntry()virtualメインイベントループ。 VSYNC 信号を待ち、次のフレームを処理します。 GUIの タスクからこの関数を呼び出します。

メモこの関数は決して戻りません! HALSDL2で再実装し、 HALSDLで再実装しました。

両方のタスクの優先度が同じ場合、またはtouchgfxの優先度が高い場合は、スタックしてしまいます。

この問題を解決するには2通りの方法があります。

  1. 優先度を指定してタスクを実装し、すべての優先度が最も低いタスクを設定します。

  2. アイドルタスクを有効にし、そのメソッドで呼び出しを実装します。

関連する問題