rtt-studio 修改lds链接文件ROM起始地址0x0800 C000,下载还是0x0800 0000,生成的hex文件,用过st-link unity工具下载到0x800 c000.能正常运行
哪位能指导下。
补充:命令 arm-none-eabi-readelf rtthread.elf 得到信息
之前的程序没有擦除。是不是还是运行的0x8000 0000处之前的程序,
studio里调用STM32_Programmer_CLI.exe
(后面为了方便描述简称为cli吧)来进行烧录和仿真。
看下烧录过程中cli
加载的固件是bin格式还是elf,如果是bin的话调用cli
要传入烧录文件的地址,elf文件则不需要。早期版本studio不支持用户修改调用cli的参数,现在看更新记录支持了,如果是bin文件的话就试试增加地址参数
基本确认,其他工程也都是的,结论:
lds文件rom地址0x0800 0000,后四个0不是0也会强制清0作为elf里的load地址,
如果lds文件rom地址写0x0800 8000,readelf的load地址为0x0800 0000,
如果lds文件rom地址写0x0801 0000,readelf的load地址为0x0801 0000,
如果lds文件rom地址写0x0801 2000,readelf的load地址为0x0801 0000,
另外,jlink下载可以按正常地址下载仿真,stlink不行,用stlink基地址要为0x08xxx 0000.
问题基本找到了,目前结论如下:
lds的load地址,必须是0x08xxx 0000格式,最后四位不是0,导入到elf的load地址也会自动清0,如
lds的load地址0x0800 8000、0x0800 C000,编译出来elf的load地址都是0x0800 0000,
lds的load地址0x0801 0000、0x0801 2000,编译出来elf的load地址都是0x0801 0000,
即使elf的load地址是错的,jlink下载还是可以正常下载,也许jlink加载的是hex文件吧。不知道这个问题官方有没有一个合理解释。目前看是arm-none-eabi-ld.exe加载lds这一步导致的。
@Jone
问题基本找到了,目前结论如下:
lds的load地址,必须是0x08xxx 0000格式,最后四位不是0,导入到elf的load地址也会自动清0,如
lds的load地址0x0800 8000、0x0800 C000,编译出来elf的load地址都是0x0800 0000,
lds的load地址0x0801 0000、0x0801 2000,编译出来elf的load地址都是0x0801 0000,
即使elf的load地址是错的,jlink下载还是可以正常下载,也许jlink加载的是hex文件吧。不知道这个问题官方有没有一个合理解释。目前看是arm-none-eabi-ld.exe加载lds这一步导致的。
@jimmykudo 可能是因为stm32 F系列片内 flash的扇区划分的原因,从0x8010000 开始扇区是64k对齐的,stlink 去编程时的下载算法也按照一个扇区去写flash
0x8000 0000本来是boot,上面下载完,boot就没了,说明上面load地址确实是0x8000 0000而不是lds的0x8000 c000