4
Cortex M3 .bss領域の初期化用のベアメタルスタートアップコード
ここから着想を得て、腕皮質M3のベアメタルスタートアップコードを開発しました。ただし、次の問題が発生します。main.cでunsigned char型など、初期化されていないグローバル変数を宣言するとします。 #include ... unsigned char var; ... int main() { ... } これにより、STM32 f103の.bss領域は、_BSS_START = 0x20000000で始まり、_BSS_END = 0x20000001で終わります。さて、スタートアップコード unsigned int * bss_start_p = &_BSS_START; unsigned int * bss_end_p = &_BSS_END; while(bss_start_p != bss_end_p) { *bss_start_p = 0; bss_start_p++; } .bss領域全体をゼロに初期化しようとします。ただし、そのwhileループ内では、ポインターは4バイトで増加します。したがって、1ステップ後にbss_start_p = 0x20000004なので、無限ループなどにつながるbss_end_pとは常に異なります。 これに対する標準的な解決策はありますか?どういうわけか、.bss領域の次元を4の倍数に「強制」すると思いますか?または、unsigned charへのポインターを使用して.bss領域をウォークスルーする必要がありますか?おそらく次のようなものです: unsigned char * bss_start_p = …