2016-07-11 15 views
0

私はハーフデュプレックスバスドライバを持っています。そこで何かを送信してから、応答を得るのに多くの時間を待たなければなりません。この待ち時間の間、私はプロセッサに何か貴重な作業をさせたいので、私はFreeRTOSやvTaskDelay()などの使用を考えています。FreeRTOSは別の機能からタスクを中断します

これを行う1つの方法は、一部の送受信部分でドライバを分割することです。送信後、発信者に戻ります。その後、発信者は一定時間後に受信部を中断して処理を行います。

しかし、今日のようにユーザの観点から見ると1つのタスクである場合、抽象度はより細かくなります。したがって、タスク内の機能がタスク自体を中断することは可能でしょうか?私はあなたが正しい方法でプログラムの流れを制御についてうとしていることを確認していないが同様

void someTask() 
{ 
    while(true){ 
     someFunction(&someTask(), arg 1, arg 2,...); 
     otherStuff(); 
} 


} 

void someFunction(*someSortOfReferenceToWhateverTaskWhoCalled, arg1, arg2 ...) 
{ 
    if(something) 
    { 

     /*Use the pointer or whatever to suspend the task that called this      function*/ 
    } 

} 

答えて

0

はvTaskSuspend、http://www.freertos.org/a00130.html

用FreeRTOSのAPIリファレンスを見てください。待ち行列、イベント、遅延などでタスクを中断することができます。

たとえば、シリアル通信では、データをキューに送りますが、いっぱいになると中断します。データをキューに入れて送信したり、データをキューに入れたりする割り込みを送信したり、データを処理する準備ができていると言うイベントをタスクに送信したりすると、タスクはウェイクアップしてデータを処理したり、 。

私の考えでは、どのタスクでも1つのサスペンドポイントしか持たないことが重要だと思います。これは厳しいルールではありませんが、ほとんどの状況であなたの人生を楽にします。

ほとんどのRTOSに共通の他の多くのタスク制御メカニズムがあります。

FreeRTOSのウェブサイトをよく見て、デモをいくつか試してみてください。 Webには汎用RTOSチュートリアルもたくさんあります。それは、ほとんどのRTOSの基本的な機能をどのように使用するかを学ぶ価値があります。実際にはそれほど複雑ではありません。

+0

ええ私はあまりにも過去のコマンドをサスペンドしていましたが、一定の期間中も一時停止したいと思っています。 私の最新のアイデアは、comを拡張することです。バスドライバ(この場合はmodbusドライバ)にデフォルトの引数を指定します。呼び出し元がデフォルト引数のtrueを使用する場合、関数は応答を待つときに遅延時間を返します。次に、この遅延時間はおそらくvTaskDelay()などで直接呼び出し側によって使用される可能性があります。 – Martin

+0

someFunction()内からvTaskDelay()を呼び出すことができるようですが、RTOSはsomeFunction()というタスクを自動的に追跡してハンドルを送信する必要はありません。きちんとした実際には、一度に1つのタスクしか実行されないため、RTOSは中断するタスクを認識します。 これで簡単になります。今では、基本的にすべてのArduinoのdelay()をvTaskDelay()と置き換えることができます。 – Martin

+0

はい、できます。私はまだ、一定期間待機するのではなく、イベント駆動型のシステムを使用する方が良いと思っています。あなたのシリアル(またはイーサネット)ドライバがModbusからの応答をいつ受信したかを知っておくべきです。 (私は過去にかなり広くmodbusで作業しています) –

関連する問題