我正在使用Em::Blocks IDE为ARM Cortex-M3微控制器STM32F4编写裸机C软件。
以下是startup_stm32f429x的内容。包含在 IDE 中的 S 文件。
- 在第 169 到 192 行,您会看到
.data
部分填充了初始值。 - 在第 199 行,它分支到
_start
符号,该符号在我的 GCC 工具链的 crt0.s 文件中定义 - 在第 211 到 223 行提供了它自己的代码来清除
.bss
部分。(在这里,_start
再次被定义,但很弱。因此,此代码仅在未在其他任何地方定义_start
符号的情况下处于活动状态。
我的问题是:
- 为什么启动文件提供用于初始化
.data
和清除.bss
的代码?我以为这就是crt0.s的工作?! - 正如我所提到的,清除
.bss
的代码似乎仅在缺少crt0.s的情况下处于活动状态。- 这听起来像crt0.s有时可能会丢失。为什么缺少crt0.s?为什么你不能依靠它的可用性?在什么情况下会丢失?
- 与此相反,为什么
.data
部分的初始化始终处于活动状态,而与 crt0.s 是否可用无关?
更新
我刚刚读到,设置异常向量是crt0.s负责的另一件事。再说一遍:为什么在我的启动文件中在第 41 行到 151 行完成?
正是因为如果您不需要GCC的功能,则不想在裸机微控制器上使用GCC的CRT0。如果您不使用 crt0,那么您将不得不自己做。