复位时嵌入式系统会发生什么?

Pho*_*ish 4 embedded startup reset

我对由于加电而重置有疑问:

  1. 据我所知,微控制器通过硬连线在上电时从某个特定的存储位置(例如 0000H)开始。在0000h处,是否编写中断服务程序进行复位(堆栈指针和程序计数器等的初始化)或复位地址位于0000h(例如7000),以便微控制器跳转到7000地址并写入堆栈和PC的初始化。

  2. 这个复位服务程序是谁写的?微控制器芯片制造商(Intel 或 microchip 等)或任何程序员都可以更改此复位服务例程(例如,程序员在上电复位时将 PC 从 7000h 更改为 4000h,导致第一条指令从 4000 获取,而不是7000)。

  3. 当上电时,堆栈指针和程序计数器如何初始化为各自的初始地址,微控制器不处于将地址放入堆栈指针和程序计数器寄存器的状态(直到复位服务程序才进行初始化)。

  4. 考虑到所有可能性,重置服务例程中应该采取哪些步骤?

Cli*_*ord 5

参考您的编号:

  1. 硬件重置过程取决于处理器,并将在该部件的数据表或参考手册中完整描述,但您的描述通常是这样的 - 不同的架构可能有细微的变化。

  2. 虽然一些微控制器包括基于 ROM 的引导加载程序,其中可能包含启动代码,但通常此类引导加载程序仅用于通过通信端口加载代码,或者直接对闪存进行编程,或者加载并执行 RAM 中的辅助引导加载程序,然后程序闪存。就 C 运行时启动而言,这要么由编译器/工具链提供,要么您自己用汇编程序编写。通常,即使编译器供应商提供了启动代码,它也会作为源代码提供,以便与您的应用程序进行汇编和链接。编译器供应商并不总是知道内存映射、SDRAM 映射和时序、处理器时钟速度或硬件中使用的振荡器晶体等信息,因此启动代码通常需要通过必须实现的初始化存根进行定制或扩展。你的硬件。

  3. 事实上,在 ARM Cortex-M 设备上,初始 PC 和堆栈指针实际上是由硬件加载的,它们存储在复位地址处并在上电时加载。然而,在一般情况下,你是对的,复位地址要么包含启动代码,要么包含启动代码的向量,在 Cortex 之前的 ARM 架构上,复位地址实际上包含跳转指令而不是真正的向量地址。无论哪种方式,C/C++ 运行时的启动代码必须至少初始化堆栈指针、初始化静态数据、执行任何必要的 C 库初始化并跳转到 main()。对于 C++,它还必须在调用 main() 之前执行任何全局静态对象的构造函数。