我可以在Microchip C18中创建一个接受ram和rom指针的函数吗?

And*_*eKR 9 c microcontroller pointers pic

当我声明一个接受的函数const char*并且我传递一个字符串文字时,我得到一个

警告:[2066]类型限定符在分配中不匹配

因为字符串文字是rom const char*.反过来也是这样.

尽管PIC是哈佛架构,但内存被映射到一个连续的地址空间,因此理论上应该可以以相同的方式支持ram和rom指针.可能我必须使用rom指针,因为它们是24位而ram指针是16位.

但是,只是将a转换const char*为a const rom char*不起作用.

miz*_*izo 5

不幸的是,这是 Microchip C18 编译器的固有限制。C18 中的指针可以指向 ROM 或 RAM,但不能同时指向两者。

这就是为什么您会在Microchip 应用程序库等中找到 ROM 和 RAM 操作的重复函数:

BYTE* TCPPutString(TCP_SOCKET hTCP, BYTE* Data);
ROM BYTE* TCPPutROMString(TCP_SOCKET hTCP, ROM BYTE* Data);
Run Code Online (Sandbox Code Playgroud)

Hi-Tech PICC-18 编译器具有在运行时确定的适当地址空间,这允许更灵活的指针使用。这是我放弃 C18 而选择 PICC-18 的原因之一。

请参阅此问题的答案以及 John Temples 的高科技 PICC-18 和 MPLAB C18 比较,了解更多信息。