裸机C:为什么某些IDE启动文件会做crt0.s无论如何都会处理的事情



我正在使用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,那么您将不得不自己做。

相关内容

最新更新