我们与STM32和TI控制器合作。我想在控制器中知道程序计数器是如何工作的,因为我知道它将指向下一条指令需要执行。 如果是这样,当我们转储代码时,它将存储在Flash存储器中,重置程序将从复位向量表开始,然后移动到主代码。
请帮助理解上述疑惑。
答案 0 :(得分:2)
通常,程序计数器加载了复位向量,或者根据架构加载了硬连线的起始地址。对于ARM Cortex-M设备(如STM32),它是前者。对于大多数指令,程序计数器自动递增到下一条指令,分支和跳转指令直接将程序计数器修改为特定的目标地址(有条件地或无条件地)。
如果程序从复位向量表开始,那么PC会指向Flash地址吗?
在STM32上至少取决于BOOT0 / BOOT1引脚设置的引导模式;它可以从片上掩模ROM启动加载器,片上闪存或片上SRAM启动 - 阅读用户手册。对于" TI控制器",TI制造了许多具有不同架构的控制器,并且您已经非特定 - 每个控制器的引导可能不同 - 再次阅读用户手册。
在运行主应用程序时,PC是点RAM地址。怎么样? 当PC移动到RAM位置时?
只有你的应用程序位于RAM中,其中复位向量指向RAM或引导加载程序或运行时启动代码已分支或跳转到RAM地址。 STM32代码通常从闪存而不是RAM运行;它以更快的速度运行,因为闪存和RAM位于不同的总线(哈佛架构)上,允许同时进行数据和指令获取。从RAM运行代码会减慢执行速度。
代码存储在闪存位置和PC指向RAM位置....这是怎么回事?当代码移动到RAM位置时?
这不一定是真的,在STM32的情况下,它很少是真的 - 代码可以从闪存中存储和执行。从RAM执行的控制器在ROM中具有引导代码,可将可执行代码复制(重定位)到RAM,然后跳转到它。
如果它移动到RAM,它将存储在哪里?在哪个部分(细分)?
谁来决定?
链接器确定它,然后由链接描述文件指示它。对于GNU工具,这通常具有.ld文件扩展名,其他工具链不同。
答案 1 :(得分:1)
首先,请看一下这个文档:
https://en.wikipedia.org/wiki/Program_counter
程序计数器在硬件中实现并存储为微控制器寄存器。它指向的地方是您的软件组织方式。如果你把你的代码放到flash中,它会指向flash,如果你把它放到RAM中就会指向RAM。您可以使用链接描述文件控制程序的存储位置。
PC的当前位置由程序流控制,即 - 由微控制器执行的最后一条指令。它也可以通过中断来改变。
如果您的程序存储在闪存中并且PC指向RAM,则可能会将部分代码复制到RAM并从那里执行。没有看真实的代码就很难分辨。
答案 2 :(得分:1)
PC是一个寄存器,不属于闪存或RAM。 PC的初始化可能与微控制器不同。例如,在tm4c129encpdt(第97页)的文档中,您可以找到:
程序计数器(PC)是寄存器R15,它包含当前程序地址。复位时,处理器使用复位向量的值加载PC,复位向量的地址为0x0000.0004。复位向量的位0装入EPSR的THUMB位 在重置时必须是1. 个人计算机 寄存器 可以在特权模式或非特权模式下访问。
通常执行的代码在flash中。但将它放在RAM中并从那里执行它没有问题。
如果它移动到RAM,它将存储在哪里?在哪个部分(细分)?
PC存储指令的地址。这取决于您将放置此代码的位置。
谁来决定?
在简单的应用程序中,它会自动发生,您不需要考虑这一点。无论如何,当我们想要从RAM执行代码时,很容易想象一个简单的情况:假设您有一个更新程序,并且您不想关心旧的更新功能是否将旧软件更新为新的软件正确。您可以通过UART / SPI等发送更新功能,并从RAM中执行。