首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序内存中的Hitech C数据缓冲区

程序内存中的Hitech C数据缓冲区
EN

Stack Overflow用户
提问于 2012-11-17 21:21:35
回答 1查看 1.2K关注 0票数 0

C18编译器允许程序内存中的变量使用ROM限定符,但高科技C似乎不太愿意最大限度地利用Havard体系结构。那么,有没有一种方法可以用高科技C编译器在程序内存中创建数据缓冲区(我已经准备好牺牲访问速度)。

我已经看到了使用psect的可能性的迹象,但没有任何有效的实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-19 02:17:11

默认情况下,HI-TECH PICC18编译器将声明为const的对象放入程序空间。不需要像C18的RAM/ROM这样的特殊限定符:

程序空间中的

3.5.3对象

const对象通常放在程序空间中。在PIC18设备上,程序空间是字节宽度的,编译器为每个字节位置存储一个字符,并使用表读取指令读取值。所有const-qualified数据对象和字符串文字都放在const psect中。由于内存和const指针使用此地址来确定是否需要访问constconst,因此RAM被放置在内存上限以上的地址。

请注意,将频繁更新的数据放入微控制器的闪存中可能不是一个好主意,因为闪存的编程/擦除周期有限。

far指针可用于取消对程序内存的引用:

3.4.12.2常量和远指针

constfar指针可以是16位或24位宽。它们的大小可以使用--CP=24--CP=16命令行选项进行切换。用于取消引用它们的代码也会随着它们的大小而变化。项目中的所有模块必须使用相同的指针大小。指向far的指针与指向const的指针相同,不同之处在于指向far的指针可以用来写入它们保存的地址。指向const对象的指针不能用于写入,因为const qualifier强制该对象是只读的。16位宽的constfar指针可以访问所有随机存取存储器区域和大部分程序空间。在运行时,当取消引用时,将检查指针的内容。对于RAM上限以上的地址,使用表读或表写指令访问程序空间。RAM上限以下的地址访问数据空间。即使指向const的指针所保存的地址在内存中,内存位置也不能改变。默认链接器选项始终将const数据放在数据空间上限以上的地址,以便在取消引用指针时访问正确的内存空间。如果所选目标设备具有64k字节以上的程序空间内存,则只能使用16位宽的指针访问较低的64k字节。假设所有需要解引用的程序空间对象都在较低的64k字节中,则仍然可以使用指向constfar对象的16位指针。指针大小越小,所需的RAM越少,生成的代码也就越少,因此应尽可能使用。24位宽的constfar指针可以访问所有随机存取存储器区域和所有程序空间。在运行时,当取消引用时,将检查指针的内容。如果地址中的位号21被设置,则该地址被假定为RAM地址。然后,地址的位数21被忽略。如果位数21被清除,则假定该地址是程序空间中的对象,并且使用表读或表写指令来执行访问。同样,不允许使用指向const的指针写入对象。请注意,当取消引用24位指针时,TBLPTRU寄存器的最重要的fi不能实现的位(位号21)可能会被覆盖。此位可用于启用对PIC18设备的配置fi配置区域的访问。如果从手写汇编代码加载表指针寄存器,则在执行表读取或写入指令之前,不要假设位数21的状态。

引用自HI-TECH PICC18 v9.51手册。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13430970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档