C18编译器允许程序内存中的变量使用ROM限定符,但高科技C似乎不太愿意最大限度地利用Havard体系结构。那么,有没有一种方法可以用高科技C编译器在程序内存中创建数据缓冲区(我已经准备好牺牲访问速度)。
我已经看到了使用psect的可能性的迹象,但没有任何有效的实现。
发布于 2012-11-19 02:17:11
默认情况下,HI-TECH PICC18编译器将声明为const的对象放入程序空间。不需要像C18的RAM/ROM这样的特殊限定符:
程序空间中的
3.5.3对象
const对象通常放在程序空间中。在PIC18设备上,程序空间是字节宽度的,编译器为每个字节位置存储一个字符,并使用表读取指令读取值。所有const-qualified数据对象和字符串文字都放在const psect中。由于内存和const指针使用此地址来确定是否需要访问const或const,因此RAM被放置在内存上限以上的地址。
请注意,将频繁更新的数据放入微控制器的闪存中可能不是一个好主意,因为闪存的编程/擦除周期有限。
far指针可用于取消对程序内存的引用:
3.4.12.2常量和远指针
const和far指针可以是16位或24位宽。它们的大小可以使用--CP=24或--CP=16命令行选项进行切换。用于取消引用它们的代码也会随着它们的大小而变化。项目中的所有模块必须使用相同的指针大小。指向far的指针与指向const的指针相同,不同之处在于指向far的指针可以用来写入它们保存的地址。指向const对象的指针不能用于写入,因为const qualifier强制该对象是只读的。16位宽的const和far指针可以访问所有随机存取存储器区域和大部分程序空间。在运行时,当取消引用时,将检查指针的内容。对于RAM上限以上的地址,使用表读或表写指令访问程序空间。RAM上限以下的地址访问数据空间。即使指向const的指针所保存的地址在内存中,内存位置也不能改变。默认链接器选项始终将const数据放在数据空间上限以上的地址,以便在取消引用指针时访问正确的内存空间。如果所选目标设备具有64k字节以上的程序空间内存,则只能使用16位宽的指针访问较低的64k字节。假设所有需要解引用的程序空间对象都在较低的64k字节中,则仍然可以使用指向const和far对象的16位指针。指针大小越小,所需的RAM越少,生成的代码也就越少,因此应尽可能使用。24位宽的const和far指针可以访问所有随机存取存储器区域和所有程序空间。在运行时,当取消引用时,将检查指针的内容。如果地址中的位号21被设置,则该地址被假定为RAM地址。然后,地址的位数21被忽略。如果位数21被清除,则假定该地址是程序空间中的对象,并且使用表读或表写指令来执行访问。同样,不允许使用指向const的指针写入对象。请注意,当取消引用24位指针时,TBLPTRU寄存器的最重要的fi不能实现的位(位号21)可能会被覆盖。此位可用于启用对PIC18设备的配置fi配置区域的访问。如果从手写汇编代码加载表指针寄存器,则在执行表读取或写入指令之前,不要假设位数21的状态。
引用自HI-TECH PICC18 v9.51手册。
https://stackoverflow.com/questions/13430970
复制相似问题