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

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

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

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

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

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

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

这就是为什么您会在例如Microchip应用程序库中找到ROM和RAM操作的重复function的原因:

 BYTE* TCPPutString(TCP_SOCKET hTCP, BYTE* Data); ROM BYTE* TCPPutROMString(TCP_SOCKET hTCP, ROM BYTE* Data); 

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

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

添加到mizo的答案(我无法评论,因为我主要回答Arduino.SE和EE.SE)

XC8编译器还具有在运行时确定适当地址空间的function。

是的,Hi-Tech PICC-18做到了这一点,但并不是唯一能够做到这一点的编译器。

虽然我可以理解目前是否可能无法切换编译器。


因此,您可能希望在string.h使用以下函数

 /** @name memcpypgm2ram * The {\bf memcpypgm2ram} function performs a {\bf memcpy} where * {\bf s1} points to data memory and {\bf s2} points to program * memory. * @param s1 pointer to destination in data memory * @param s2 pointer to source in program memory * @param n number of characters to copy */ void *memcpypgm2ram (auto void *s1, auto const MEM_MODEL rom void *s2, auto sizeram_t n); /** @name memcpyram2pgm * The {\bf memcpyram2pgm} function performs a {\bf memcpy} where {\bf s1} * points to program memory and {\bf s2} point to data memory. * @param s1 pointer to destination in program memory * @param s2 pointer to source in data memory * @param n number of characters to copy */ MEM_MODEL rom void *memcpyram2pgm (auto MEM_MODEL rom void *s1, auto const void *s2, auto sizeram_t n); 

你可以使你的function像:

 void YourStringFunction(ramstring); void YourStringFunctionAccpetingRom(romstring){ YourStringFunction(memcpypgm2ram(romstring)); } 

^这不是实际的代码,更多的伪代码。 另外,我不确定它是否有效。