【问题标题】:How Program counter increment程序计数器如何递增
【发布时间】:2017-07-24 04:28:23
【问题描述】:

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

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

请帮忙理解以上疑惑。

【问题讨论】:

  • 我不明白你。什么电脑?你问的是 uC 还是 PC 电脑。
  • @PeterJ 我相信他在谈论程序计数器(PC)寄存器。

标签: embedded stm32 controllers flash-memory


【解决方案1】:

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

如果程序从复位向量表开始,那么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 文件扩展名,其他工具链有所不同。

【讨论】:

  • 许多较新的 STM32 都有一大块 Core Coupled Memory,从那里执行代码通常(如果不是总是)比从闪存快。然后,数据应存储在常规 SRAM 中,而不是存储在 CCM 中。
  • @Colin__s :是的,因为那是在另一条单独的总线上。然而,它也是一种有限的资源; SRAM 比闪存占用更多​​的裸片空间。增益可能很小,因为 STM32 有一个闪存加速器,通常允许从闪存执行零等待状态。此外,如果您将数据和代码一起放入 CCM,那么由于总线争用,它会再次变慢;因此,要实现潜力,就必须小心谨慎。 ST 声称闪存和 CCM 执行速度均为 1.25MIPS/MHz,但仍声称 CCM 执行速度更快;他们似乎都想要这两种方式 - 看起来营销部门编写了他们的规格。
  • @Colin__s :我怀疑使用 CCM 的真正好处是由于它不能用于 DMA,因此具有完全确定的访问时间。
  • 是的,我怀疑这是因为没有争用。
  • @Colin__s 有些甚至有两个独立的,有自己的公共汽车。无论如何,我通常在那里放置变量和堆栈,除非我需要在那里有一些代码(但这是一个非常不寻常的)
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    程序计数器 (PC) 是寄存器 R15,它包含当前程序地址。复位时,处理器向 PC 加载复位向量的值,该向量位于地址 0x0000.0004。复位向量的位 0 加载到 EPSR 的 THUMB 位 复位时,必须为 1。 个人电脑 登记 可以在特权或非特权模式下访问。

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

    如果它移动到 RAM,它将存储在哪里?在哪个部分(分段)?

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

    谁来决定?

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

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多