私はハーフデュプレックスバスドライバを持っています。そこで何かを送信してから、応答を得るのに多くの時間を待たなければなりません。この待ち時間の間、私はプロセッサに何か貴重な作業をさせたいので、私は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*/
}
}
ええ私はあまりにも過去のコマンドをサスペンドしていましたが、一定の期間中も一時停止したいと思っています。 私の最新のアイデアは、comを拡張することです。バスドライバ(この場合はmodbusドライバ)にデフォルトの引数を指定します。呼び出し元がデフォルト引数のtrueを使用する場合、関数は応答を待つときに遅延時間を返します。次に、この遅延時間はおそらくvTaskDelay()などで直接呼び出し側によって使用される可能性があります。 – Martin
someFunction()内からvTaskDelay()を呼び出すことができるようですが、RTOSはsomeFunction()というタスクを自動的に追跡してハンドルを送信する必要はありません。きちんとした実際には、一度に1つのタスクしか実行されないため、RTOSは中断するタスクを認識します。 これで簡単になります。今では、基本的にすべてのArduinoのdelay()をvTaskDelay()と置き換えることができます。 – Martin
はい、できます。私はまだ、一定期間待機するのではなく、イベント駆動型のシステムを使用する方が良いと思っています。あなたのシリアル(またはイーサネット)ドライバがModbusからの応答をいつ受信したかを知っておくべきです。 (私は過去にかなり広くmodbusで作業しています) –