ここでの多種多様な答え...主にさまざまな方法で問題に対処しています。
私はさまざまな言語で組み込みの低レベルのソフトウェアとファームウェアを25年以上書いてきました-主にC(ただし、途中でAda、Occam2、PL / M、およびさまざまなアセンブラーに流用しています)。
長い間考え、試行錯誤を重ねた結果、かなり迅速に結果を取得し、テストラッパーとハーネスを簡単に作成できる方法に落ち着きました(値を追加します!)
メソッドは次のようになります。
使用する主要な周辺機器ごとに、ドライバーまたはハードウェアアブストラクションコードユニットを作成します。また、プロセッサを初期化し、すべてをセットアップするための1つを作成します(これにより、フレンドリーな環境になります)。通常、小型の組み込みプロセッサ(AVRを例に)には、このようなユニットが10〜20個ありますが、すべて小型です。これらは、初期化、スケーリングされていないメモリバッファへのA / D変換、ビット単位の出力、プッシュボタン入力(サンプリングされたデバウンスなし)、パルス幅変調ドライバ、UART /シンプルシリアルドライバ、割り込みおよび小さなI / Oバッファの単位です。EEPROM、EPROM、またはその他のI2C / SPIデバイス用のI2CまたはSPIドライバーなど、さらにいくつかあります。
次に、ハードウェアアブストラクション(HAL)/ドライバーユニットごとに、テストプログラムを作成します。これは、シリアルポート(UART)とプロセッサの初期化に依存しています。したがって、最初のテストプログラムでは、これら2つのユニットのみを使用し、基本的な入出力を行うだけです。これにより、プロセッサを起動できること、およびシリアルI / Oが動作する基本的なデバッグサポートがあることをテストできます。それが機能するようになったら(そしてその後のみ)、他のHALテストプログラムを開発し、それらを既知の正常なUARTおよびINITユニットの上に構築します。したがって、ビット単位の入力を読み取り、シリアルデバッグ端末でこれらを適切な形式(16進数、10進数など)で表示するためのテストプログラムを用意することができます。その後、EEPROMやEPROMのテストプログラムなど、より大きく複雑なものに移行できます。これらのメニューのほとんどを駆動するので、実行するテストを選択して実行し、結果を確認できます。私はそれをスクリプティングできませんが、通常はしません
すべてのHALを実行したら、通常のタイマーティックを取得する方法を見つけます。これは通常、4〜20ミリ秒のレートです。これは、割り込みで生成された定期的なものでなければなりません。カウンターのロールオーバー/オーバーフローは通常、これを行う方法です。割り込みハンドラは、バイトサイズ「セマフォ」をインクリメントします。この時点で、必要に応じて電源管理をいじることもできます。セマフォの考え方は、その値が> 0の場合、「メインループ」を実行する必要があるということです。
EXECUTIVEはメインループを実行します。セマフォが0以外になるのを待つだけです(この詳細を抽象化します)。この時点で、これらのティック(ティックレートを知っているcos)をカウントするカウンターで遊んで、現在のエグゼクティブティックが1秒、1分、および他の一般的な間隔であるかどうかを示すフラグを設定できます使いたいかもしれません。幹部は、セマフォが> 0であることを認識すると、すべての「アプリケーション」プロセス「更新」機能を介して単一のパスを実行します。
アプリケーションプロセスは互いに効果的に並んでおり、「更新」ティックによって定期的に実行されます。これは、エグゼクティブによって呼び出される単なる機能です。これは、非常にシンプルな自家製RTOSを備えた、貧弱なマルチタスクであり、すべてのアプリケーションが入って、少しの作業をして終了することに依存しています。アプリケーションは独自の状態変数を維持する必要があり、公平性を強制するプリエンプティブなオペレーティングシステムがないため、長時間の計算を実行できません。明らかに、アプリケーションの実行時間(累積)は、主要なティック期間よりも短くする必要があります。
上記のアプローチは簡単に拡張できるため、通信スタックを追加して非同期で実行し、通信メッセージをアプリケーションに配信できます(それぞれに「rx_message_handler」である新しい関数を追加し、メッセージディスパッチャーを記述します)どのアプリケーションにディスパッチするかを指定します)。
このアプローチは、名前を付けたいほとんどすべての通信システムで機能します。多くのプロプライエタリシステム、オープンスタンダードコミュニケーションシステムで機能します(実際に機能します)。TCP/ IPスタックでも機能します。
また、明確に定義されたインターフェースを備えたモジュール式の部品で構築されるという利点もあります。いつでもピースを出し入れでき、別のピースに置き換えることができます。途中の各ポイントで、既知の適切な下位層パーツ(以下のもの)に基づいてテストハーネスまたはハンドラーを追加できます。設計の約30%から50%が、通常かなり簡単に追加できる特別に作成された単体テストを追加することで利益を得られることがわかりました。
私はこれをさらに一歩進め(これを行った他の誰かからニックネームを付けました)、HALレイヤーをPCの同等のものに置き換えました。したがって、たとえば、PCでC / C ++およびwinformsなどを使用し、コードを慎重に記述することにより、各インターフェイスをエミュレートでき(たとえば、EEPROM = PCメモリに読み込まれたディスクファイル)、PCで組み込みアプリケーション全体を実行できます。使いやすいデバッグ環境を使用する機能は、膨大な時間と労力を節約できます。通常、このような労力を正当化できるのは、本当に大きなプロジェクトだけです。
上記の説明は、組み込みプラットフォームでの作業方法に固有のものではありません-同様のことを行う多くの商業組織に出くわしました。通常、実装方法は大きく異なりますが、原則はほとんど同じです。
上記が少し風味を与えることを願っています...このアプローチは、数kBで実行される小型の組み込みシステムで、積極的なバッテリー管理を行い、100K以上のソースラインの永久電源で動作するモンスターまで機能します。Windows CEなどの大きなOSで「埋め込み」を実行する場合、上記のすべては完全に重要ではありません。しかし、それはとにかく実際の組み込みプログラミングではありません。