【发布时间】:2012-11-17 13:21:34
【问题描述】:
C18 编译器允许在带有 ROM 限定符的程序存储器中使用变量,但 Hi-Tech C 似乎不太愿意充分利用 Havard 架构。那么有没有办法使用 Hi-Tech C 编译器在程序内存中创建数据缓冲区(我准备妥协访问速度)。
我已经看到了使用 psect 的可能性的迹象,但没有任何可行的实现。
【问题讨论】:
标签: c variables microcontroller microchip pic18
C18 编译器允许在带有 ROM 限定符的程序存储器中使用变量,但 Hi-Tech C 似乎不太愿意充分利用 Havard 架构。那么有没有办法使用 Hi-Tech C 编译器在程序内存中创建数据缓冲区(我准备妥协访问速度)。
我已经看到了使用 psect 的可能性的迹象,但没有任何可行的实现。
【问题讨论】:
标签: c variables microcontroller microchip pic18
HI-TECH PICC18 编译器默认将声明为const 的对象放入程序空间。不需要像 C18 的 RAM/ROM 这样的特殊限定符:
3.5.3 程序空间中的对象
const对象通常放置在程序空间中。在 PIC18 器件上,程序空间为 字节范围内,编译器在每个字节位置存储一个字符,并使用表读取值 阅读说明。所有const限定的数据对象和字符串文字都放在constpsect 中。constpsect 放置在高于 RAM 上限的地址,因为 RAM 和const指针使用此地址来确定是否需要访问 ROM 或 RAM。
请注意,将频繁更新的数据放入微控制器的闪存可能不是一个好主意,因为闪存的编程/擦除周期数有限。
far 指针可用于取消引用程序内存:
3.4.12.2 常量和远指针
const和far指针可以是 16 位或 24 位宽。它们的大小可以通过--CP=24切换 或--CP=16命令行选项。用于取消引用它们的代码也会随着它们的大小而变化。 一个项目中的所有模块必须使用相同的指针大小。 指向far的指针与指向const的指针相同,除了指向far的指针可用于 写到他们持有的地址。指向const对象的指针不能用作const限定符强制对象是只读的。const和far16 位宽的指针可以访问所有 RAM 区域和大部分程序 空间。在运行时取消引用时,会检查指针的内容。以上地址 RAM 的上限 使用表读或表写指令访问程序空间。 低于 RAM 上限的地址访问数据空间。即使指针持有的地址const在 RAM 中,RAM 位置可能不会更改。 默认链接器选项始终将const数据放置在数据上限之上的地址 空间,以便在使用指针取消引用时访问正确的内存空间。 如果选择的目标器件有超过 64k 字节的程序空间存储器,那么只有 可以使用 16 位宽的指针访问较低的 64k 字节。前提是所有程序空间对象 需要取消引用的是较低的 64k 字节,指向const和far对象的 16 位指针 仍然可以使用。较小的指针大小导致所需的 RAM 和生成的代码更少,并且 所以应该尽可能使用。const和far24 位宽的指针可以访问所有 RAM 区域和所有程序 空间。在运行时取消引用时,会检查指针的内容。如果位号 21 在地址被设置时,该地址被假定为一个RAM地址。地址的第 21 位是 然后忽略。如果第 21 位被清除,则地址被假定为程序中的对象 空间和访问是使用表读取或表写入指令执行的。再次,没有写入 对象被允许使用指向const的指针。 请注意,当取消引用 24 位指针时,最重要的实现位(位号 21) 的TBLPTRU寄存器可能会被覆盖。该位可用于启用访问 PIC18 器件的配置区域。如果从手写加载表指针寄存器 汇编代码,在执行表读取之前不对第 21 位的状态做任何假设 或编写说明。
引用来自HI-TECH PICC18 v9.51手册。
【讨论】: