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

标签 embedded

我对开机重置有疑问:

1.据我所知,微 Controller 是硬连线的,从某个特定的内存位置开始,比如上电时从 0000H 开始。在 0000h,是否为复位(堆栈指针和程序计数器等的初始化)编写了中断服务程序,或者复位地址在 0000h(比如 7000),以便微 Controller 跳转到 7000 地址并在那里写入堆栈和 PC 的初始化.

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

3. 堆栈指针和程序计数器如何初始化为各自的初始地址,因为上电时微 Controller 未处于将地址放入堆栈指针和程序计数器寄存器的状态(直到重置服务程序才完成初始化).

  1. 考虑到所有可能性,重置服务例程的步骤应该是什么?

提前致谢

最佳答案

引用您的编号:

  1. 硬件重置过程取决于处理器,将在该部件的数据表或引用手册中进行完整描述,但您的描述通常是这种情况 - 不同的架构可能会有细微的差异.

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

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

关于embedded - 复位时嵌入式系统会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7355798/

相关文章:

c - 如何在微处理器/ Controller 上制作卷轴?

c++ - 当 std::atomic<T>::is_always_lock_free 为 false 时,std::atomic<T> 对于中断是否安全?

c - 删除外部 FLASH

c - 发生段错误时如何知道程序访问了哪个非法地址

c - 确定在嵌入式 C 中运行时使用哪个变量

关于在常数后使用 U 和 UL 进行正确计算的困惑

c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?

c++ - 在 Linux 中,recv() 有效但 recvmsg() 无效

c - 当变量在中断例程中改变时,是否真的需要 volatile 关键字

c - 微 Controller 编程要学什么语言?