2012-11-17 17 views
0

C18编译器允许程序存储器中的变量与ROM限定符一起使用,但Hi-Tech C似乎不太愿意最大限度地利用Havard体系结构。那么有没有办法用Hi-Tech C编译器在程序存储器中创建数据缓冲区(我已准备好降低访问速度)。程序存储器中的Hitech C数据缓冲区

我已经看到psect的可能性的迹象,但没有任何工作实现。

回答

2

默认情况下,HI-TECH PICC18编译器将声明为const的对象放置到程序空间中。像C18的RAM/ROM没有特别的限定词,需要:

3.5.3对象的程序空间

const对象通常都放在程序空间。在PIC18器件上,程序空间为 字节宽,编译器在每个字节位置存储一个字符,并使用表 读取指令读取值。所有const -quali fi ed数据对象和字符串文字被放置在const psect。 const psect位于RAM上限以上的地址,因为RAM和const指令使用该地址来确定是否需要访问ROM或RAM。

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

far指针可以用来取消引用程序存储器:

3.4.12.2 CONST和远指针

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

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

+0

Microchip实际上似乎是在提升程序存储器中的数据。你有没有看过他们的应用笔记AN 548和AN 556.那么引导加载程序和USB缓冲区呢? – Vishnu

+0

这对于上电复位后需要仍然存在的任何数据都很有用。我正在使用这些原则来存储程序存储器中的配置数据。正如你所提到的,另一个应用是引导程序。对于USB缓冲区,我一直使用数据存储器(RAM)。 – mizo

+0

我非常感谢您的耐心和真正有帮助的答案。 C18的ram&ram选项让我感到困惑,但坚持标准(就像Hitech一样),并在必要时(明智地)使用ASM TABLWT和TABLRD。另外,它提到我的程序存储器的100,000次写入/擦除周期对于缓冲区来说有点太低。 – Vishnu