C中的微控制器启动代码是什么?何时/为什么/如何修改?

The*_*ast -1 microcontroller assembly startup

这是关于启动代码的一般问题.我知道它就像引导程序或重置或上电后运行的第一件事,它调用主函数.

但我想知道它的主要/核心功能.

例如(在谷歌搜索),

重置目标系统后立即执行启动代码.Keil启动代码按顺序执行(可选)以下操作:

? Clears internal data memory
? Clears external data memory
? Clears paged external data memory
? Initializes the small model reentrant stack and pointer
? Initializes the large model reentrant stack and pointer
? Initializes the compact model reentrant stack and pointer
? Initializes the 8051 hardware stack pointer
? Transfers control to code that initializes global variables or to the main C function if
there are no initialized global variables
Run Code Online (Sandbox Code Playgroud)

Nb:启动代码总是用汇编语言编写,因为它取决于CPU目标.

谢谢你的时间

Ira*_*ter 5

所有计算机程序都在假设它们执行的世界被设置为符合其期望的情况下工作.

假设你有一个程序P,它假定当P开始时变量X的值为零.

如果将程序P作为代码启动点放入微处理器中,它将无法工作....因为X的值不能保证为零.(RAM内存位置往往会包含垃圾.)

您通过插入使假设成立的启动代码来解决该问题,例如,您将代码置于启动时将变量X归零,然后将控制传递给您的程序.无论您的程序需要什么假设,您都需要在启动代码中实现.

现在我写了一个非常一般的描述.当我们谈论真正的微处理器时,通常必须满足低级别的假设:

  • 如果机器有一个堆栈指针,它指向一些真实的内存,而不是持有垃圾
  • 所需的任何I/O端口或特殊硬件都"可以使用"(它们通常需要配置;考虑存储区选择寄存器或优先级中断控制器)
  • 您的程序的位置是已知的

如果需要这三个假设,启动代码将通过以下方式解决它们:

  • 使用已知的常量加载SP寄存器是RAM地址
  • 执行特殊指令或将各种魔术常量写入必要的I/O端口以配置它们以供使用
  • 将PC设置为程序的已知位置(通常是JMP xxxx指令)

每个MCU控制器程序对世界都有不同的假设.您自定义代码以启动代码以满足这些假设.

通常,这些假设并不多,而且很多MCU程序都可以通过精心挑选的小型程序来实现.因此,启动指令往往与程序分开处理(否则,您可以简单地将它们添加到您的程序中,有时人们会这样做).