Добавление к ответу mizo (я не могу комментировать, так как я в основном отвечаю на Arduino.SE и EE.SE)
Компилятор XC8 также имеет функцию определения подходящего адресного пространства во время выполнения.
Так что да, 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);
И вы можете сделать свою функцию такой:
void YourStringFunction(ramstring);
void YourStringFunctionAccpetingRom(romstring){
YourStringFunction(memcpypgm2ram(romstring));
}
^ Это не фактический код, скорее псевдо-код. Кроме того, я не уверен, что это эффективно.