【问题标题】:Length difference between bytes and pc unit字节和pc单位之间的长度差异
【发布时间】:2018-11-26 09:07:00
【问题描述】:

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

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

而且这两个确实可以不同(例如 0x1EC8 和 0x2700)。

大家知道这两者的区别吗?计算方法?

[编辑]: 见.text部分

【问题讨论】:

标签: embedded pic


【解决方案1】:

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

【讨论】:

  • 没有指令长度是12位!
  • 指令长度取决于PIC。 PIC24 的指令长度为 24 位。
  • 是的,我使用的是 PIC24FJ256GB110
【解决方案2】:

我刚刚浏览了一些书籍并得到了这些解释,它可能对你有用。

字节:

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

摘自书中:here

PC 单位:

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

摘自书中:here

页码:52

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

希望对你有帮助:)

【讨论】:

  • PIC(具有 MIPS 内核的 PIC32 除外)PC 递增 1,而不是 2,跳过指令除外(根据条件递增 1 或 2)。
【解决方案3】:

此答案仅针对 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. 将指令字数乘以 3 即为 FLASH 存储器的字节数。

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 感谢您的解释,但是长度按顺序和长度(PC单位)
    • 两者差别太大了我刚刚加了个截图,也许对理解pb有帮助
    • 这个答案是无稽之谈 - 输出来自 PIC 编译器的链接器,与磁盘存储无关。在这种情况下,PC 指的是程序计数器,而 PIC 设备的指令字不是 8 位的倍数。
    • @LeLaboureur : 如果你不同意这个答案(你这样做是对的),你为什么接受它?
    • 您或许应该删除原始答案并留下编辑 - 在答案中留下不正确的信息没有任何意义。也就是说,编辑也不准确。这取决于具体的 PIC 系列,但是对于具有 12 位和 14 位指令字的那些,指令存储器只能以这些单元寻址,因此字节大小与绝对地址无关。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多