特别是要解决使用C18编译器将变量绑定到PIC18上闪存中特定地址的问题,请在安装编译器的doc目录中的hlpC18ug.chm中参考“ Pragmas”一节。
为此,您需要在内存中定义一个新的“节”并将其绑定到起始地址,以便
#pragma romdata serial_no_section=0x1700
这将创建一个名为“ serial_no_section”的新节,该节从闪存(程序)存储器中的地址0x1700开始(因为我们在#pragma中定义了“ romdata”)。
在#pragma行之后,直接定义变量,因此:
#pragma romdata serial_no_section=0x1700
const rom int mySerialNumber = 0x1234;
#pragma romdata
现在,存储器中的地址0x1700处有0x12,地址0x1701处有0x34(因为PIC18使用little-endian模型)。“ const rom”确保编译器知道这是const变量类型,并且该变量位于“ rom”内存中,因此需要通过表读取指令进行访问。
最后#pragma romdata
一条语句确保链接器认为合适时,将随后的所有变量声明链接到默认内存部分,而不要在“ serial_no_section”部分中继续进行。
现在,所有代码都可以简单地引用变量“ mySerialNumber”,并且您确切知道序列号可以在内存中找到的地址。
编辑十六进制代码可能会有些困难,因为您需要为所编辑的每一行计算校验和。我正在研究一个C ++类,以对Intel HEX文件进行解码和编码,这应该使此操作更容易,但尚未完成。解码文件有效,尚未进行再次编码。该项目(如果您有兴趣的话)在这里https://github.com/codinghead/Intel-HEX-Class
希望这可以帮助