bytes 和 pc 单位的长度差异

Length difference between bytes and pc unit

我目前正在使用 Microchip 系统,但遇到了程序长度问题。编译时我可以看到两个不同的长度:

而且这两个可能真的不同(例如 0x1EC8 和 0x2700)。

你们知道两者的区别吗?计算方法?

[编辑]: 请参阅 .text 部分

PC 表示程序计数器,因此在这种情况下,大小以程序计数器为单位给出(这取决于指令的长度,它决定了 PC 可以指向的可能地址的数量)。在另一种情况下,它仅表示以字节为单位的大小。

在像 Microchip PIC24 这样的恒定宽度指令中(可以与您的示例相匹配),指令宽度为 3 个字节,即 PC(从不奇数)每条指令(16 位数据)递增 2。因此,字节长度与 PC 单位长度之间的关系是 3/2,在您的示例中,0x1b0 字节的 .text 部分将等效于 0x1b0 * (2 / 3) = 288 PC-Units

术语 PC 单元是一种有用的方式来描述指令宽度大于 8 位的设备中的地址,特别是对于调试(映射文件、地址、偏移量、大小等),但我强烈推荐你始终以 PC 为单位或以字节为单位工作,以避免愚蠢的错误。

请记住,一些 Microchip 运算符使用 PC 单位而不是字节,例如 .sizeof.,因此这些运算符不会以字节为单位报告您的大小,因此您必须如果您想转换为字节,请了解您的 uC 架构。

我刚刚翻了一些书,得到了这些解释,可能对你有用。

Bytes:

There is a minimum block of code that is always generated by the MPLAB C compiler

Taken from the book: here

PC Units:

It may be Program Counter units. It is indicated that, The 16-bit device PC increments by 2 for each instruction word (Not in all cases, please refer some books for PC increment in PICs)

Taken from the book: here

Page No: 52

因此,它们的尺寸可能不同。大多数字节大小将大于 PC 单位。

希望对您有所帮助:)

也许看看 PIC24FJ128GA:
每条指令为 24 位或三个字节。用户闪存程序存储器从 0x200 开始,长度为 0x155FC(以程序计数器为单位)。每个偶数 PC 有两个字节,每个奇数 PC 只有一个字节。所以总的用户程序内存是0x155FC * 1.5 = 131322 = 128.2K-byte.

此答案仅关注 PIC24、dsPIC30 和 dsPIC33 系列中的 Microchip PIC 器件。

这种类型的控制器具有用于指令和数据存储器的独立地址总线。

数据存储器组织为 16 位字,可按字节寻址。

指令存储器组织为 24 位字。

当从指令存储器中获取操作码时,会立即读取所有 24 位。 但是还有其他寻址模式允许使用数据存储器可用的寻址模式读取指令存储器的一部分。

还有一些其他方法可以访问指令内存,但它们是关于擦除和写入指令内存的,因此与此答案无关。

当控制器仅使用程序计数器获取指令时,只有偶数地址是可能的,但是可以使用间接寻址获取指令。开发人员应谨慎使用此方法进行控制传输,如 CALL 和 GOTO,因为当目标地址为奇数时可能会发生地址错误陷阱。

由于我不完全理解使用数据存储器可用模式可见的指令存储器部分只能访问指令字的低 16 位,无法以这种方式访问​​高 8 位。

所以我已经描述了 24 位 PIC 中内存总线的形状,但我没有回答你的问题。

Microchip 文档没有很好地描述这一点。它做了很多挥手动作并掩盖了有用的细节。

本质上,可寻址内存的每个字都有2个地址单元。在数据存储器中,这代表 2 个字节的 RAM,对于指令存储器,这代表 3 个字节的 FLASH,但是这 3 个字节中有 2 个字节是可见的。

这种对指令内存的处理方式是 "supposed" 以便访问此内存 space 以便更快地读取常量数据并更轻松地为其创建 C 编译器代码生成器。很难说是真的。

所以总结起来每个指令字有3个字节的FLASH。每个指令字由 2 个地址单元表示。

从地址单位转换为FLASH的字节:

  1. 统计FLASH地址单元的范围(必须为偶数)
  2. 将范围除以 2 得到指令字数。
  3. 指令字数乘以3即为FLASH存储器的字节数

对于大多数实际用途,FLASH 存储器使用的字节数用处不大,但分配或释放的指令字数更有用。