ブロガーMindtechnistをフォローするか、[ Linux C/C++/Python Community ] に参加して、Linux、C、C++、Python、Matlab、ロボット モーション コントロール、マルチロボット コラボレーション、インテリジェントな最適化アルゴリズム、フィルター推定、マルチセンサーを学び、共有することを歓迎します。情報融合、機械学習、人工知能およびその他の関連分野の知識と技術。
組み込みソフトウェアの設計
1. 組込みソフトウェアシステム
2 つの組み込みソフトウェア システム:
- ロジック ソフトウェア: EOS (組み込みオペレーティング システム) はなく、組み込みソフトウェアはハードウェア上で直接実行されます。
- EOS ベースのソフトウェア: EOS 上で動作します。
①回転構造
ソフトウェアでは、ループ構造コードは 1 つだけ実行され、ループ コードは条件を順番に問い合わせて、対応する分岐を実行します。その利点は、構造が単純で、構造の中断がなく、データ共有がなく、メインループが各 IO デバイスを順番にチェックしてサービスを提供するだけであることです。欠点としては、IO 機能ごとに必要な応答速度が異なり、ラウンドロビン構造の保証が難しいこと、分岐処理時間が第 2 レベルに達すると、オペレーティング システムの応答が遅くなる、デバイス数が増加すると、タイム スライスが遅くなる可能性があることです。が小さくなり、単一ブランチの応答が小さくなり、速度が遅く、CPU がフルスピードで動作すると、消費電力が相対的に大きくなり、バッテリ駆動のシステムでは耐えられなくなります。主な用途は電子レンジ、電話、電子玩具などです。
②断続機能付き回転構造
割り込みプログラムはハードウェアの特に緊急のニーズを処理し、イベント到着フラグを設定します。メイン ループはこれらのフラグをポーリングし、ニーズに応じて処理します。これはフロントエンドとバックエンドのシステムであり、ポーリング プログラムは特定の処理を担当するバックグラウンドであり、割り込みプログラムはサービス リクエストのチェックを支援するフォアグラウンドです。ラウンドロビン構造との違いは、優先度の高いリクエストはタイムリーに応答されるのに対し、ラウンドロビン構造は順番に応答することしかできないことです。
③タイマー割り込みによるローテーション構造
低電力モードを導入しました。
④割り込み(イベント)駆動方式
后台 -- 主程序 -- 初始化系统 -- 进入低功耗模式
⑤関数キューのスケジューリング構造
割り込みプログラムはトランザクションを処理せず、対応する関数ポインターを関数ポインター キューに追加するだけです。メイン プログラムは、キューから対応するポインターを読み取り、関連する関数を呼び出すだけです。main 関数は順番に実行されなくなりましたが、キューを読み取って優先されます。
2. 割り込み機構とISRの設計
動作中、EOS は主に次の 2 つの方法で外部イベントに迅速に応答します。
- クエリ方式: スループットが低下し、消費電力が増加しますが、クエリを継続する必要があります。
- 割り込みモード。
①遮断機構
割り込みメカニズムは、プロセッサがシステム実行中にランダムに発生する外部イベントに迅速に応答するための非同期メカニズムです。割り込み発生後、プロセッサは割り込み要求(IRQ)を認識し、割り込み要求に対応する割り込みサービスプログラムに自動的にジャンプして実行します。
割り込み検出、割り込み応答、割り込み処理までをプロセッサ単独で完結できます。
割り込みはハードウェアのメカニズムであり、オペレーティング システムが使用されているかどうかとは直接関係ありません。
これはマクロ レベルのクエリ メカニズムではなく、ミクロ レベルのハードウェア クエリ メカニズムです。
検出:
- 可屏蔽中断:可通过响应寄存器来关闭中断;
- 不可屏蔽中断NMT:不可通过寄存器来操作;
応答:
- 直接中断:处理器查到中断,直接跳转到ISR入口;
- 寄存器间接中断:通过寄存器寻址间接跳转;
- 向量中断:查询中断向量表中的偏移量;
対処する:
- 禁止/恢复中断
- 保存/恢复上下文
- 轮询设备的中断状态寄存器,逻辑处理
②EOS端末管理
ハードウェア割り込み、ソフトウェア割り込み、例外など、プログラムの通常の実行フローに変化を引き起こす可能性のあるイベントは、割り込みまたは例外として広く定義されます。
EOS カーネルには、割り込み引き継ぎプログラムと、割り込みベクタ テーブルにマッピングされた仮想割り込みベクタ テーブルがあり、割り込みが発生した後、割り込み引き継ぎプログラムは割り込みイベントを受信し、仮想割り込みベクタ テーブルにクエリを実行して、対応する割り込みサービス ルーチン。
割り込みサービス ルーチンを実行する前に、引き継ぎプログラムはコンテキスト情報を保存し、割り込みスタック内の開始位置を設定します。
割り込みサービス ルーチンは、割り込まれたタスクのスタックを使用できますが、信頼性を向上させるために、カーネルは通常、すべての割り込みルーチンに対して個別の割り込みスタックを定義します。
割り込みサービス ルーチンが完了すると、引き継ぎプログラムはコンテキストとスタックを復元し、以前に割り込まれたタスクにプロセッサを復元するか、割り込みサービス ルーチンの実行を継続します。
③ 割り込みプログラミング規則
规则1:中断程序不能调用任何可能会阻塞自己的RTOS服务
规则2:确保RTOS调用返回中断程序
规则3:避免执行分配、释放内存的操作
3. データ共有
アトミック操作は最小単位であり、分割することはできません
disable();
/*临界区,不可产生中断*/
enable();
4. ウォッチドッグタスク
ウォッチドッグ タスク TWDG をデプロイして、システム内の重要なタスクのグループを検出します。ウォッチドッグは、キャラクターが失敗するとシステム全体が失敗すると判断するロジックを使用します。ウォッチドッグは、検出されたタスクに定期的に検出信号を送信したり、これらのタスクによってアップロードされたステータスを定期的に収集して、検出された各タスクが正常に実行されているかどうかを検出したりすることができ、障害が発生した場合、ソフトウェアはウォッチドッグ回路を通じて位置を特定するかリセットします。
①複数の監視方法
一般的な実装方法:
TWDG は i 番目に検出されたタスク Ti と変数 f_WDi を共有し、Ti がf_WDi++
演算を実行し、TWDG がf_WDi--
演算を実行して、f_WDi が前回の値より小さいかどうかを判断し、小さければ Ti タスクは失敗します。
タスク間通信メカニズム: TWDG タスクは Ti タスクにメッセージを送信し、タスクからのフィードバックを待ち、フィードバックに従ってステータスを決定します。
信頼性の点では、ウォッチドッグ タスクはハードウェア ウォッチドッグ回路よりも優れています。
5. コード共有 - 再入可能な関数
text段:只读,存放程序代码,编译时确定。
data段:静态存储区,存放在编译阶段(而不是运行时)就能确定的数据,存放赋了初值的全局变量、静态变量、常量。
bss段:存放定义但未赋值的全局变量和静态变量。
コードの再入性
純粋なコードとも呼ばれるリエントラント コードは、マルチタスク組み込みシステムの信頼性に影響を与える重要な側面です。その本質は変数とリソースの共有であり、複数のタスクから同時にコードを呼び出して実行することはできない、つまりリエントランシーの問題です。
リエントラント関数は、複数のタスクから呼び出すことができる関数です。リエントラント関数は、データ エラーを心配することなく、複数のタスクから同時に呼び出すことができます。非リエントラント非リトラント関数は、関数の相互排他が保証されるか、セマフォが使用されるか、コードの重要なセクションで割り込みが無効にされない限り、複数のタスクで共有することはできません。リエントラント関数はいつでも中断でき、データを失うことなく後で再開できます。リエントラント関数は、ローカル変数を使用するか、グローバル変数を使用するときに独自のデータを保護します。
関数がリエントラントかどうかを判断するための基本ルールは次のとおりです。
①一个可重入函数一般用于原子的方法使用变量,除非这些变量存储再调用这个函数的堆栈中或者这些变量是任务的私有变量;
②一个可重入函数一般不调用其他不可重入的函数;
③一个可重入函数一般不用于非原子的方法使用硬件;