私はあなたの記述された問題を最初に取っています
私が解釈したように、あなたの目標は、USBからコマンドを受信することによって、LED、リレーなどのGPIOを出力するデバイスを作成することです。この単純なタスクでは、アプローチは問題ないようです(USBレイヤーがそれで動作できる場合)十分に)。
ただし、優先順位付けの問題が存在します。この場合、(ケーブルの反対側からのデータで) USB 側を過負荷にし、それを処理する割り込みが、GPIO を処理するタイマーによってトリガーされる割り込みよりも優先度が高くなる可能性があります。 GPIO 側はティックを見逃す可能性があります (他の人が説明したように、割り込みはキューに入れることができません)。
あなたの場合、これは何が考えられるかについてです。
一般的なガイダンス
「割り込みハンドラーでできるだけ時間を費やさない」という理由は、他の人が言ったことです.OSはキューなどを実現するかもしれませんが、ハードウェア割り込みはそのような概念を提供しません。割り込みの原因となるイベントが発生すると、CPU はハンドラーに入ります。次に、そのソースを処理するまで (UART の場合の受信保持レジスタの読み取りなど)、そのイベントの以降の発生は失われます。この時点の後、ハンドラーを終了するまで、イベントが発生したかどうかを受け取ることができますが、回数はわかりません (CPU がまだハンドラーを処理している間にイベントが再び発生した場合、関連する割り込みラインが再びアクティブになります。より優先度の高いものが待機していない場合、CPU はすぐにハンドラーに再び入ります)。
上記では、8 ビット プロセッサと AVR 32 ビット (私はこれらの経験があります) で観察できる一般的な概念について説明しました。
このような低レベル システム (OS なし、1 つの「バックグラウンド」タスク、およびいくつかの割り込み) を設計する場合、各優先度レベルで何が行われるかを理解することが基本です (そのようなシステムを使用する場合)。一般に、最もリアルタイムで重要なタスクを最高の優先度にし、それらのタスクを迅速に提供することに最大限の注意を払いますが、優先度レベルを低くするとよりリラックスできます。
別の側面から、通常は設計段階で、システムが割り込みの失敗にどのように反応するかを計画することができます。通信回線を通過する重要なデータには適切なチェックサムが必要です。特に重要なタイマーは、イベント カウントからではなく、カウント レジスタから取得する必要があります。
割り込みのもう 1 つの厄介な部分は、その非同期性です。関連するロックを適切に設計しないと、最終的には何かが壊れてしまい、デバッグしなければならない可哀想な魂に悪夢をもたらします。また、「割り込みハンドラーに費やす時間をできるだけ短くする」ステートメントは、割り込みコードを適度に短く保つことを奨励しています。これは、この問題について考慮するコードも少なくなることを意味します。RTOS によって支援されるマルチタスクも使用している場合は、この部分を知っておく必要があります (ただし、いくつかの違いがあります: 優先度の高い割り込みハンドラーのコードは、優先度の低いハンドラーのコードに対する保護を必要としません)。
必要な非同期タスクに関してアーキテクチャを適切に設計できれば、(マルチタスクがないという観点から) OS なしで移動する方が、より優れたソリューションであることが証明される可能性さえあります。適切に設計するには、より多くのことを考える必要がありますが、後でロック関連の問題ははるかに少なくなります。私は、単一のバックグラウンド「タスク」で設計された中規模のセーフティ クリティカルなプロジェクトを、中断が非常に少なく、ほとんど中断せずにやり遂げました。それらに関する経験とメンテナンスの要求 (特にバグの追跡) は、社内の他のプロジェクトと比較して非常に満足のいくものでした。マルチタスクの概念に基づいて構築されています。