程序计数器如何递增

How Program counter increment

我们使用 STM32 和 TI 控制器。我想在控制器中知道程序计数器是如何工作的,因为我知道它将指向下一条需要执行的指令。 如果是这样,当我们转储代码时,它将在复位后存储在闪存中程序将从复位向量开始table然后移动到主代码。

  1. 如果程序从复位向量开始table那么PC会指向Flash地址吗?
  2. 在主应用PC的运行处是点RAM地址。怎么样?
  3. PC 何时移动到 RAM 位置?
  4. 代码存储在闪存位置和 PC 指向 RAM 位置....这是怎么发生的?代码何时移动到 RAM 位置?
  5. 如果移动到 RAM,它将存储在哪里?在哪个部分(分段)?
  6. 谁来决定?

以上疑惑请大家帮忙理解

首先,请看一下这个文档:

https://en.wikipedia.org/wiki/Program_counter

程序计数器在硬件中实现并存储为微控制器寄存器。它指向的位置取决于您的软件是如何组织的。如果将代码放入闪存,它会指向闪存,如果将代码放入 RAM,它将指向 RAM。您可以使用链接描述文件控制程序的存储位置。

PC的当前位置由程序流控制,即-微控制器执行的最后一条指令。也可以通过中断改变。

如果您的程序存储在闪存中并且 PC 指向 RAM,那么您的部分代码可能会被复制到 RAM 并从那里执行。不看真实代码很难判断。

PC 是一个寄存器,不是闪存或 RAM 的一部分。 PC 的初始化可能不同于微控制器。例如,在 tm4c129encpdt(第 97 页)的文档中,您可以找到:

The Program Counter (PC) is register R15, and it contains the current program address. On reset, the processor loads the PC with the value of the reset vector, which is at address 0x0000.0004. Bit 0 of the reset vector is loaded into the THUMB bit of the EPSR at reset and must be 1. The PC register can be accessed in either privileged or unprivileged mode.

通常执行的代码在闪存中。但是把它放在RAM中并从那里执行是没有问题的。

If it move to RAM, where it will stores? on which section(segmentation)?

PC存放指令的地址。这取决于您将放置此代码的位置。

Who will decide that?

在简单的应用程序中,它会自动发生,您无需考虑这一点。无论如何,当我们想从 RAM 执行代码时,很容易想象一个简单的情况:假设您有一个更新过程,并且您不想关心旧的更新功能是否会将旧软件正确更新为新软件。您可以通过 UART / SPI 等发送更新函数并从 RAM 执行它。

一般来说,程序计数器载入复位向量或载入硬连线起始地址,具体取决于体系结构。对于STM32等ARM Cortex-M设备来说,就是前者。对于大多数指令,程序计数器会自动递增到下一条指令,分支和跳转指令会将程序计数器直接修改为特定的目标地址(有条件或无条件)。

If program start from the reset vector table then PC will point the Flash address?

至少在 STM32 上,这取决于 BOOT0/BOOT1 引脚设置的启动模式;它可以从片上掩模 ROM 引导加载程序、片上闪存或片上 SRAM 引导 - 请阅读用户手册。关于 "TI controllers",TI 制造了许多具有不同架构的控制器,而您一直没有具体说明 - bootstrapping 可能每个控制器都不同 - 再次阅读用户手册。

At the running of the main application PC is point RAM address. How? When PC move to the RAM location?

仅当您的应用程序位于 RAM 中时,重置向量将指向 RAM 或引导加载程序,或者 运行 时间启动代码已分支或跳转到 RAM 地址,这才是正确的。 STM32 代码通常 运行s 来自闪存而不是 RAM;这样 运行 速度更快,因为闪存和 RAM 在不同的总线(哈佛架构)上,允许同时获取数据和指令。 运行 RAM 中的代码会减慢执行速度。

Code is stored in flash location and PC pointing RAM location.... how is this happening? When code is move to the RAM location?

这不一定是正确的,在 STM32 的情况下,很少是正确的 - 代码可以从闪存中存储和执行。从 RAM 执行的控制器在 ROM 中有 bootstrap 代码,可将可执行代码复制(重新定位)到 RAM,然后跳转到它。

If it move to RAM, where it will stores? on which section(segmentation)?

Who will decide that?

链接器确定了这一点,然后它又由链接器脚本控制。对于 GNU 工具,这通常具有 .ld 文件扩展名,其他工具链不同。