RTOSを使用していますか?一般に、このタイプのことは、割り込みによって何らかの作業を行うように通知される優先度の高いスレッドを持つことによって処理されます。
RTOS を使用しておらず、少数のタスクしかなく、割り込みによって開始される作業がリソースをあまり消費しない場合は、優先度の高い作業を割り込みハンドラーのコンテキストで実行するのが最も簡単かもしれません。これらの条件が満たされない場合、あなたが話していることを実装することは、基本的なマルチタスク OS 自体の始まりになります。それ自体が興味深いプロジェクトになる可能性がありますが、単に作業を完了させたい場合は、単純な RTOS を検討することをお勧めします。
あなたが行っている作業についていくつかの詳細を述べたので、過去に同様の問題をどのように処理したかの概要を以下に示します。
UART 経由で受信したデータを処理するために、タスクを完全にサポートしていない単純なシステム (つまり、タスクは単純なwhile
ループでラウンドロビン処理される) を扱うときに使用した 1 つの方法は、共有キューを使用することです。 UART から受信したデータ用。UART 割り込みが発生すると、UART の RDR (受信データ レジスタ) からデータが読み取られ、キューに入れられます。キュー ポインターが破損しないようにこれに対処する秘訣は、キュー ポインターを慎重に揮発性にし、割り込みハンドラーのみがテール ポインターを変更し、データを読み取る「フォアグラウンド」タスクのみが変更されるようにすることです。キューをオフにすると、ヘッド ポインターが変更されました。高レベルの概要:
シーケンスの問題がないことを確認するために 、queue.head
および でqueue.tail
あることを確認してください(または、これらのビットをアセンブリに書き込みます)。volatile
ここで、UART 受信データ キューが、フォアグラウンド タスクが実行される機会を得る前に受信できるすべてのバイトを保持するのに十分な大きさであることを確認してください。フォアグラウンド タスクは、「メッセージ プロセッサ」タスクに渡すメッセージを構築するために、データをキューから独自のバッファにプルする必要があります。