[求助]做ARM开发如何修改程序代码在片内Flash的地址?

时间:2022-07-16 04:53:11
大家好!

本人最近在用 LPC2138 做开发,需要用它的片内 Flash 存储一些数据,目前在线读写的问题已经基本解决了。

在默认的情况下,程序的代码是从Flash的基址开始的,我想请教一下时候有办法改变程序代码的在Flash中的起始地址?

先谢谢各位了!

6 个解决方案

#1


烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

#2


引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

可否说得详细一些,HEX文件的话要如何通过编译器指定位置呢?

#3


引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

bin文件的话我试过指定其他的地址,但是这样子程序就不能执行了。
PS:烧写程序我用的是 H-JTAG

#4


引用 3 楼 it_mac 的回复:
引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译……

子程序不能运行的原因是:编译器在编译代码段时,是以你编译器指定的基地址(base address)为基线,进行分配子函数地址的。假设你原编译器设定你编译器的基地址为0,生成代码后,子程序APP1的地址为:0X000020000;现在你把该BIN文件烧到0X000010000区,你代码中的子程序APP1的地址依然会是0X000020000,而实际上你子程序APP1的存储位置已经变为:0X000020000+0X000010000了。
故而子程序不能运行。

#5


引用 2 楼 it_mac 的回复:
引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译……

编译器一般都会有一个BASE ADDRESS选项的设置,比如:KEIL 的Target标签页下的Read/Only Memory Areas;ADS 的ARM Linker选项下的Output标签页下的RO Base。或者通过分散加载方式定义编译后代码段的相对存储地址。
若还有什么问题,你可以加我的QQ:1564629520

#6


该回复于2012-04-20 08:23:58被版主删除

#1


烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

#2


引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

可否说得详细一些,HEX文件的话要如何通过编译器指定位置呢?

#3


引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译器指定代码烧写的相对位置即可。

bin文件的话我试过指定其他的地址,但是这样子程序就不能执行了。
PS:烧写程序我用的是 H-JTAG

#4


引用 3 楼 it_mac 的回复:
引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译……

子程序不能运行的原因是:编译器在编译代码段时,是以你编译器指定的基地址(base address)为基线,进行分配子函数地址的。假设你原编译器设定你编译器的基地址为0,生成代码后,子程序APP1的地址为:0X000020000;现在你把该BIN文件烧到0X000010000区,你代码中的子程序APP1的地址依然会是0X000020000,而实际上你子程序APP1的存储位置已经变为:0X000020000+0X000010000了。
故而子程序不能运行。

#5


引用 2 楼 it_mac 的回复:
引用 1 楼 dian_technology 的回复:
烧录文件为BIN文件:
我一般是通过:烧录代码时,修改代码在FLASH当中相对地址来解决的。
比如:你的FLASH基址为0;在你用烧录软件加载.bin文件时,一般都会弹出一个对话框,问你代码烧录FLASH的相对位置,此时,你便可以指定你的烧录地址了。

烧录文件为HEX文件:
由于HEX文件包含了地址信息,你要编译的时候,通过编译……

编译器一般都会有一个BASE ADDRESS选项的设置,比如:KEIL 的Target标签页下的Read/Only Memory Areas;ADS 的ARM Linker选项下的Output标签页下的RO Base。或者通过分散加载方式定义编译后代码段的相对存储地址。
若还有什么问题,你可以加我的QQ:1564629520

#6


该回复于2012-04-20 08:23:58被版主删除