2016-06-24 4 views
-1

私は2つのタスク(task1とtask2)を持っています。 CANからのメッセージを受け取ったら、もう一度タスクを再開する必要があります。どのようなアイデア?FreeRTOSの再起動の仕方

私はこの問題を解決しました。

volatile uint8_t restart = 0; 
extern void task1(void *pvParameters) 
{ 
    UNUSED(pvParameters); 
    const portTickType xDelayTime = 5/portTICK_RATE_MS; 

    int16_t stop = 0; 
    int16_t fast= 0; 

    for (;;) 
    { 
     if (xQueueReceive(can_message, &stop, 100) == pdPASS) 
      restart = 1; 
     vTaskDelay(xDelayTime); 
    } 
} 

extern void task2(void *pvParameters) 
{ 
    UNUSED(pvParameters); 
    const portTickType xDelayTime = 15/portTICK_RATE_MS; 

    for (;;) 
    { 
    /*inits of task, vatiable set,...*/ 
     while(restart != 1) 
     { 
     /*function loop*/ 
     restart = 0; 
     } 
     vTaskDelay(xDelayTime); 
    } 
} 
+0

あなたはこれまでに並行性について何か聞いたことがありますか?あなたはまた、私は、思うに、 'while(restart!= 1)'ループに遅れを入れてスケジューラを緩和する必要があると思います。答えはあなたの質問を編集するのではなく、回答として投稿する必要があります。 – LPs

答えて

0

最初の質問は、そのようにしたい理由です。本当にタスクを削除して再作成したいのですか?タスクの開始に再び分岐しますか?タスクを削除して再作成するのは効率が悪く、ほとんど必要ありません。

タスクを削除して再作成するとしたら、あるタスクが別のタスクを再開したい場合、そのタスクを削除してもう一度作成するだけで済みます。

一方で、1つのタスクを削除して再作成したい場合、その達成方法の1つはxTimerPendFunctionCall()です。 ()パラメータを

void vPendableFunction(void * pvParameter1, uint32_t ulParameter2) 
{ 
    [xTaskCreate][2](whatever); 
} 

を、タスクが最初に適切なxTimerPendFunctionCall上記のように機能してxTimerPendFunctionCall()を呼び出した場合は、それ自体を再作成したい場合:

あなたはほど再起動するタスクを作成する機能を実装その後、それ自身を削除する。 '保留'された関数は、タスクを再度実行して作成します。