【问题标题】:Hitech C data buffers in program memory程序存储器中的 Hitech C 数据缓冲区
【发布时间】:2012-11-17 13:21:34
【问题描述】:

C18 编译器允许在带有 ROM 限定符的程序存储器中使用变量,但 Hi-Tech C 似乎不太愿意充分利用 Havard 架构。那么有没有办法使用 Hi-Tech C 编译器在程序内存中创建数据缓冲区(我准备妥协访问速度)。

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

【问题讨论】:

    标签: c variables microcontroller microchip pic18


    【解决方案1】:

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

    3.5.3 程序空间中的对象

    const 对象通常放置在程序空间中。在 PIC18 器件上,程序空间为 字节范围内,编译器在每个字节位置存储一个字符,并使用表读取值 阅读说明。所有const 限定的数据对象和字符串文字都放在const psect 中。 const psect 放置在高于 RAM 上限的地址,因为 RAM 和 const 指针使用此地址来确定是否需要访问 ROM 或 RAM。

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

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

    3.4.12.2 常量和远指针

    constfar 指针可以是 16 位或 24 位宽。它们的大小可以通过--CP=24 切换 或--CP=16 命令行选项。用于取消引用它们的代码也会随着它们的大小而变化。 一个项目中的所有模块必须使用相同的指针大小。 指向far 的指针与指向const 的指针相同,除了指向far 的指针可用于 写到他们持有的地址。指向const 对象的指针不能用作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 位指针时,最重要的实现位(位号 21) 的TBLPTRU 寄存器可能会被覆盖。该位可用于启用访问 PIC18 器件的配置区域。如果从手写加载表指针寄存器 汇编代码,在执行表读取之前不对第 21 位的状态做任何假设 或编写说明。

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

    【讨论】:

    • Microchip实际上似乎在提升程序存储器中的数据。你看过他们的应用笔记 AN 548 和 AN 556。还有引导加载程序和 USB 缓冲区呢?!
    • 这对于需要在上电复位后仍然存在的任何数据很有用。我正在使用这些原则来存储例如程序存储器中的配置数据。正如您所提到的,另一个应用程序是引导加载程序。对于 USB 缓冲区,我一直很好地使用数据存储器 (RAM)。
    • 非常感谢您的耐心和非常有帮助的回答。 C18 的 ram 和 rom 选项让我有点困惑,但坚持标准(就像 Hitech 所做的那样)并在必要时(明智地)使用 ASM TABLWT 和 TABLRD。我还想到,程序存储器的 100,000 次写入/擦除周期对于缓冲区来说有点太低了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多