11

組み込みボードで作業していますが、同じの起動コード(C/アセンブリ)の流れがわかりません。

組み込みシステムの場合、起動アクションによって実行される一般的なモジュール/ステップについて説明できますか?

高レベルの概要 (アルゴリズム) だけで十分です。すべての例を歓迎します。

/関羽__

4

5 に答える 5

27
  1. CPU はパワーオン リセットを取得し、定義されたポイント (リセット ベクトル、フラッシュの先頭、ROM など) にジャンプします。
  2. スタートアップ コード (crt - C ランタイム) が実行されます。これは、コンパイラ/libc によって生成される重要なコードであり、次のことを実行します。
    1. 外部メモリを構成してオンにします (絶対に必要な場合、それ以外の場合は後のユーザー コード用に残します)。
    2. スタック ポインタを確立する
    3. .bss セグメントをクリアします (通常)。.bss初期化されていない (またはゼロ化された) グローバル メモリ領域の名前です。初期化値を持たない (0 を超える) グローバル変数、配列などはここに配置されます。マイクロコントローラでの一般的な方法は、この領域をループして、起動時にすべてのバイトを 0 に設定することです。
    4. .text の末尾から非 const .data をコピーします。ほとんどのマイクロコントローラーはフラッシュから実行されるため、変数データをそこに保存することはできません。などのステートメントint thisGlobal = 5;の場合、 の値をthisGlobal永続領域 (通常は、リンカーによって生成されたフラッシュ内のプログラムの後) から RAM にコピーする必要があります。これは、静的な値、および関数内の静的な値に適用されます。未定義のままの値はコピーされませんが、代わりにステップ 2 の一部としてクリアされます。
    5. 他の静的初期化子を実行します。
    6. 電話main()

ここから、コードが実行されます。通常、CPU は割り込みオフ状態のままになります (プラットフォームによって異なります)。

于 2010-08-03T04:58:57.320 に答える
3

かなり自由回答形式の質問ですが、ここに私が拾ったいくつかのことがあります。

超単純なプロセッサの場合、真のスタートアップ コードはありません。CPU に電力が供給され、メモリ内の最初の命令の実行が開始されます。

少し上には、avr や pic のような mcu があります。これらには起動コードがほとんどありません。実際に行う必要がある唯一のことは、適切なアドレスで割り込みジャンプ テーブルを設定することです。その後は、アプリケーション コード (唯一のプログラム) が処理を行います。幸いなことに、開発者は通常、これらのことについて心配する必要はありません。それがlibcの目的です。

その後、単純な腕ベースのチップのようなものがあります。avr や pic よりも複雑ですが、それでも非常にシンプルです。これらはまた、割り込みテーブルをセットアップし、クロックが正しく設定されていることを確認し、必要なオンチップ コンポーネント (基本割り込みなど) を開始する必要があります。Atmel のこの pdf を見てください。ARM 7 チップの起動手順が詳しく説明されています。

食物連鎖のさらに上には、フル稼働の PC (x86、amd64 など) があります。これらの起動コードは実際には BIOS であり、恐ろしく複雑です。

于 2010-08-03T05:14:13.340 に答える
1

C/C++用スタートアップコードの機能

  1. すべての割り込みを無効にします
  2. 初期化されたデータを ROM から RAM にコピーします。
  3. 初期化されていないデータ領域はゼロに設定されます。
  4. スタックにスペースを割り当てて初期化します
  5. プロセッサのスタック ポインタを初期化します
  6. ヒープを作成して初期化します
  7. すべてのグローバル変数のコンストラクターと初期化子を実行します (C++ のみ)
  8. 割り込みを有効にします
  9. メインコール
于 2015-06-09T08:04:31.620 に答える
1

大きな問題は、組み込みシステムがオペレーティング システムを実行するかどうかです。一般に、オペレーティング システムを実行するか、何らかの形式の制御の反転を開始する必要があります (学校のプロジェクトで覚えている例は、RL-ARM またはオープン ソースの tcp/ip を使用して要求をリッスンする telnet でした)。スタックしてから、接続が確立されたとき/データが受信されたときに実行されるコールバックを持っていた)、または独自の制御ループに入る (メニューを表示して、キーが押されるまでループするなど)。

于 2010-08-03T04:58:15.917 に答える
0

では「BOOT LOADER」はどこに配置されているのでしょうか?スタートアップコードの前に配置する必要がありますよね?私の理解によると、リセットベクターから制御はブートローダーに行きます。そこでコードは、データがコントローラ/プロセッサにフラッシュ/ダウンロードされるのを期待する短い期間待機します。データが検出されない場合、コントロールは theatrus で指定された次のステップに転送されます。しかし、私の疑問は、BOOT LOADER のコードを書き直せるかどうかです。例: UART ブートローダを ETHERNET/CAN ブートローダに変更できますか、または任意のプロトコルを使用して送信されたデータがゲートウェイを使用して UART に変換されてからフラッシュされます。

于 2010-08-03T09:19:55.743 に答える