此答案仅针对 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 字节:
- 计算 FLASH 地址单元的范围(必须是偶数)。
- 范围除以 2 得到指令字数。
- 将指令字数乘以 3 即为 FLASH 存储器的字节数。
对于大多数实际用途而言,FLASH 存储器使用的字节数几乎没有用,尽管分配或空闲的指令字数更有用。