組み込みボードで作業していますが、同じの起動コード(C/アセンブリ)の流れがわかりません。
組み込みシステムの場合、起動アクションによって実行される一般的なモジュール/ステップについて説明できますか?
高レベルの概要 (アルゴリズム) だけで十分です。すべての例を歓迎します。
/関羽__
組み込みボードで作業していますが、同じの起動コード(C/アセンブリ)の流れがわかりません。
組み込みシステムの場合、起動アクションによって実行される一般的なモジュール/ステップについて説明できますか?
高レベルの概要 (アルゴリズム) だけで十分です。すべての例を歓迎します。
/関羽__
.bss
初期化されていない (またはゼロ化された) グローバル メモリ領域の名前です。初期化値を持たない (0 を超える) グローバル変数、配列などはここに配置されます。マイクロコントローラでの一般的な方法は、この領域をループして、起動時にすべてのバイトを 0 に設定することです。int thisGlobal = 5;
の場合、 の値をthisGlobal
永続領域 (通常は、リンカーによって生成されたフラッシュ内のプログラムの後) から RAM にコピーする必要があります。これは、静的な値、および関数内の静的な値に適用されます。未定義のままの値はコピーされませんが、代わりにステップ 2 の一部としてクリアされます。main()
ここから、コードが実行されます。通常、CPU は割り込みオフ状態のままになります (プラットフォームによって異なります)。
かなり自由回答形式の質問ですが、ここに私が拾ったいくつかのことがあります。
超単純なプロセッサの場合、真のスタートアップ コードはありません。CPU に電力が供給され、メモリ内の最初の命令の実行が開始されます。
少し上には、avr や pic のような mcu があります。これらには起動コードがほとんどありません。実際に行う必要がある唯一のことは、適切なアドレスで割り込みジャンプ テーブルを設定することです。その後は、アプリケーション コード (唯一のプログラム) が処理を行います。幸いなことに、開発者は通常、これらのことについて心配する必要はありません。それがlibcの目的です。
その後、単純な腕ベースのチップのようなものがあります。avr や pic よりも複雑ですが、それでも非常にシンプルです。これらはまた、割り込みテーブルをセットアップし、クロックが正しく設定されていることを確認し、必要なオンチップ コンポーネント (基本割り込みなど) を開始する必要があります。Atmel のこの pdf を見てください。ARM 7 チップの起動手順が詳しく説明されています。
食物連鎖のさらに上には、フル稼働の PC (x86、amd64 など) があります。これらの起動コードは実際には BIOS であり、恐ろしく複雑です。
C/C++用スタートアップコードの機能
大きな問題は、組み込みシステムがオペレーティング システムを実行するかどうかです。一般に、オペレーティング システムを実行するか、何らかの形式の制御の反転を開始する必要があります (学校のプロジェクトで覚えている例は、RL-ARM またはオープン ソースの tcp/ip を使用して要求をリッスンする telnet でした)。スタックしてから、接続が確立されたとき/データが受信されたときに実行されるコールバックを持っていた)、または独自の制御ループに入る (メニューを表示して、キーが押されるまでループするなど)。
では「BOOT LOADER」はどこに配置されているのでしょうか?スタートアップコードの前に配置する必要がありますよね?私の理解によると、リセットベクターから制御はブートローダーに行きます。そこでコードは、データがコントローラ/プロセッサにフラッシュ/ダウンロードされるのを期待する短い期間待機します。データが検出されない場合、コントロールは theatrus で指定された次のステップに転送されます。しかし、私の疑問は、BOOT LOADER のコードを書き直せるかどうかです。例: UART ブートローダを ETHERNET/CAN ブートローダに変更できますか、または任意のプロトコルを使用して送信されたデータがゲートウェイを使用して UART に変換されてからフラッシュされます。