スタートアップコード
リセットから main() までの間に実行され、Cが前提とするメモリの状態を実際に成立させるコード。
Cは、初期値つきのグローバル変数はその値を持ち、それ以外はゼロで始まると約束している。デスクトップではOSのローダーがこれを整えるが、ベアメタルでは誰もやってくれないので、スタートアップコードが担う。.data セクションをフラッシュからRAMへコピーし、.bss をゼロクリアし、クロックを設定し、C++のコンストラクタを実行して、最後に main を呼ぶ。各アドレスはリンカスクリプトで定義されたシンボルから得る。
crt0(C runtime zero)という名はUnixに由来する。Cortex-Mのエントリポイントは Reset_Handler で、ベクタテーブルから見つかる。スタックポインタはハードウェアが自分でロードするので、全体をCで書くこともできる。ベンダーは通常アセンブリファイルで提供するが、グローバル変数が頑として初期値を保持しなくなるまで、誰もそれを読まない。