我对由于通电而重置感到怀疑:

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

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

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

  • 在考虑所有可能性的情况下,重置服务例程应采取哪些步骤?

  • 提前致谢

    最佳答案

    关于您的编号:

  • 硬件复位过程取决于处理器,并将在该器件的数据手册或参考手册中进行全面描述,但通常情况下您的描述-不同的体系结构可能会有细微的变化。
  • 虽然某些微控制器包括基于ROM的引导加载程序,其中可能包含启动代码,但通常此类引导加载程序仅用于通过通信端口加载代码,以直接对闪存进行编程,也可以将辅助引导加载程序加载并执行到RAM然后编程闪存。就C运行时启动而言,它要么随编译器/工具链一起提供,要么由您自己在汇编器中编写。通常,即使编译器供应商提供了启动代码,启动代码也会作为源文件提供,以便与您的应用程序进行汇编和链接。编译器供应商不能总是知道诸如内存映射,SDRAM映射和时序,处理器时钟速度或硬件中使用了哪种振荡器晶体之类的信息,因此启动代码通常需要通过必须针对其实现的初始化存根进行定制或扩展。您的硬件。
  • 实际上,在ARM Cortex-M设备上,初始PC和堆栈指针实际上是由硬件加载的,它们存储在复位地址并在加电时加载。但是,通常情况下您是对的,复位地址要么包含启动代码,要么包含启动代码的向量,在Cortex之前的ARM体系结构中,复位地址实际上包含跳转指令,而不是真正的向量地址。 。无论哪种方式,C / C++运行时的启动代码都必须至少初始化堆栈指针,初始化静态数据,执行任何必要的C库初始化并跳转到main()。对于C++,它还必须在调用main()之前执行任何全局静态对象的构造函数。
  • 10-04 10:48