字节与pc单位之间的长度差

时间:2018-11-26 09:07:01

标签: embedded pic

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

  • 长度(PC单位)
  • 长度(字节)

这两个可以真正不同(例如0x1EC8和0x2700)。

你们中有人知道两者之间的区别吗?计算它们的方法?

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

enter image description here

4 个答案:

答案 0 :(得分:2)

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

enter image description here

答案 1 :(得分:0)

我刚看过几本书,得到了这些解释,这对您可能有用。

  

字节:

     

MPLAB始终生成一个最小的代码块    C编译器

     

从书中摘录:here

  

PC单位:

     

可能是程序计数器单位。说明:16位   每个指令字使设备PC递增2(并非在所有情况下,请查阅一些书籍以了解PIC中PC递增的情况)

     

从书中摘录:here

     

页码:52

因此,它们的大小可能不相同。通常,字节大小将大于PC单元。

希望这会有所帮助:)

答案 2 :(得分:0)

此答案仅针对PIC24,dsPIC30和dsPIC33系列中的Microchip PIC器件。

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

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

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

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

还有其他访问指令存储器的方法,但它们与擦除和写入指令存储器有关,因此与该答案无关。

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

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

因此,我已经描述了24位PIC中存储器总线的形状,但是我没有回答您的问题。

Microchip文档不能很好地描述这一点。它挥舞着很多手,掩盖了有用的细节。

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

这种“对指令存储器的处理”是为了使访问该存储器空间以更快,更轻松地读取常量数据,从而为其创建C编译器代码生成器。很难说这是真的。

因此,总而言之,每个指令字有3个字节的FLASH。每个指令字由2个地址单元表示。

要将地址单位转换为FLASH字节:

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

尽管分配或释放的指令字数更有用,但对于大多数实际用途而言,FLASH存储器使用的字节数几乎没有用。

答案 3 :(得分:-2)

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

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

术语PC单元是一种在指令宽度大于8位的设备中谈论地址的有用方法,特别是用于调试(映射文件,地址,偏移量,大小等)时,但我强烈建议您使用始终以PC单位或始终以字节为单位,以避免愚蠢的错误。

请记住,有几个Microchip运算符使用PC单元而不是字节,例如.sizeof.。因此,这类运算符不会以字节为单位报告您的大小,因此您必须知道如果要转换为字节,则使用uC的体系结构。