答案 0 :(得分:2)
我的经验是AVR,因此您的里程可能会有所不同。
通常,程序计数器从0开始,因此第一条指令位于闪存的第一个位置。这也是向量表的位置,或处理器在各种类型的中断发生时硬连线跳转到的地址。
这些地址只相隔几个字节,只留下足够的空间用于跳转指令到闪存中的其他地方。地址0也是复位中断的向量。也就是说,它是处理器在按下重置时跳转到的位置。
复位中断向量将跳转到C运行时,一些代码添加到C程序的开头。它在RAM中初始化全局变量,并在跳转到代码的main函数之前设置堆栈指针等。
向量表,C运行时和代码由编译器组合在一起,自定义表和运行时以适合您的代码。例如,如果包含中断处理程序,则跳转到该中断处理程序将插入到该类型中断位置的向量表中。
PC上没有BIOS。外围设备不会自动初始化。您必须在自己的代码中为要使用的每个外围设备执行此操作。
答案 1 :(得分:1)
对于类似这样的东西,你可以将软件看作是平行的软件。在重置(实际上在期间)之后,诸如起始地址和状态机的状态之类的项被初始化为作者想要的值。然后它在复位后开始计时并遍历代码,为简单的情况可能是零状态的地址被提取,然后当提取结束时该指令被解码并执行,等等。
关于你的问题,断电和正常执行之间的区别在于,在上电复位后,处理器的状态被置于特定状态,之后处理器的状态需要做一段时间使用已执行到该点的代码。
外围逻辑以相同的方式工作,但不一定(必然)有一个运行代码的处理器,尽管有些外设可以。然后,最终运行时的启动代码和/或操作系统会熄灭并初始化外围设备。