本人最近在用 LPC2138 做开发,需要用它的片内 Flash 存储一些数据,目前在线读写的问题已经基本解决了。
在默认的情况下,程序的代码是从Flash的基址开始的,我想请教一下时候有办法改变程序代码的在Flash中的起始地址?
先谢谢各位了!
6 个解决方案
#1
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。
烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。
烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。
#2
可否说得详细一些,HEX文件的话要如何通过编译器指定位置呢?
#3
bin文件的话我试过指定其他的地址,但是这样子程序就不能执行了。
PS:烧写程序我用的是 H-JTAG
#4
子程序不能运行的原因是:编译器在编译代码段时,是以你编译器指定的基地址(base address)为基线,进行分配子函数地址的。假设你原编译器设定你编译器的基地址为0,生成代码后,子程序APP1的地址为:0X000020000;现在你把该BIN文件烧到0X000010000区,你代码中的子程序APP1的地址依然会是0X000020000,而实际上你子程序APP1的存储位置已经变为:0X000020000+0X000010000了。
故而子程序不能运行。
#5
编译器一般都会有一个BASE ADDRESS选项的设置,比如:KEIL 的Target标签页下的Read/Only Memory Areas;ADS 的ARM Linker选项下的Output标签页下的RO Base。或者通过分散加载方式定义编译后代码段的相对存储地址。
若还有什么问题,你可以加我的QQ:1564629520
#6
#1
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。
烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。
烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。
#2
可否说得详细一些,HEX文件的话要如何通过编译器指定位置呢?
#3
bin文件的话我试过指定其他的地址,但是这样子程序就不能执行了。
PS:烧写程序我用的是 H-JTAG
#4
子程序不能运行的原因是:编译器在编译代码段时,是以你编译器指定的基地址(base address)为基线,进行分配子函数地址的。假设你原编译器设定你编译器的基地址为0,生成代码后,子程序APP1的地址为:0X000020000;现在你把该BIN文件烧到0X000010000区,你代码中的子程序APP1的地址依然会是0X000020000,而实际上你子程序APP1的存储位置已经变为:0X000020000+0X000010000了。
故而子程序不能运行。
#5
编译器一般都会有一个BASE ADDRESS选项的设置,比如:KEIL 的Target标签页下的Read/Only Memory Areas;ADS 的ARM Linker选项下的Output标签页下的RO Base。或者通过分散加载方式定义编译后代码段的相对存储地址。
若还有什么问题,你可以加我的QQ:1564629520