升级的其中一个问题就是app的偏移地址的确定,这涉及到符号定位。一旦确定地址,剩下的你以前怎么搞升级的,以后还怎么搞。
前面可变地址的情况复杂一些,但是你既然要固定地址的,那就更简单了,只需要脚本就基本能达成。
gcc强大到根本不用费脑。下面是iar的(keil我不会)。
假设你的flash有100k,而boot小于20k,你打算在20k起始的地方放置app,也就是0x5000字节偏移
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x08004FFF; // boot 20k,app可以从0x08005000 start
xxx // 正常放置各种rom,ram
// 最后
define section fill { udata32 0xbeadbead; };
"FILL": place noload at end of ROM_region { section fill };
keep {section fill}; // 填充满整个bin空间
如此,boot的bin大小就被固定在20k。
你要在这里面的某地方填什么标记,数据之类的,你可以用
define symbol FLAG_end_offset = 0x20; // 随便举例的地址
define section flag {udata32 0xabcdabcd, 0x12345678;}; // 需要填写的标志,等等
"FLAG": place noload at address (__ICFEDIT_region_ROM_end__ - FLAG_end_offset) { section flag };
define section fill { udata32 0xbeadbead; };
"FILL": place noload at end of ROM_region { section fill };
keep {section flag, section fill};
来设定flag。
然后就可以在 after build的时候copy /b boot.bin+app.bin bootapp.bin 了。
用link来搞这个事情,本来它是工程的一个文件,当然会被版本管理,另外这里面的符号,都可以export出来,整个程序就只依赖这一个地方的设定,而不会c里面一个#define ADDRESS,外面命令行你还需要编写或者告诉操作者这个ADDRESS一定要一致。
留一个完整版作参考。
[mw_shl_code=c,false]/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x08004FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__ = 0x800;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
define symbol FLAG_end_offset = 0x20;
define section flag {udata32 0xabcdabcd, 0x12345678;};
"FLAG": place noload at address (__ICFEDIT_region_ROM_end__ - FLAG_end_offset) { section flag };
define section fill { udata32 0xbeadbead; };
"FILL": place noload at end of ROM_region { section fill };
keep {section flag, section fill};
[/code]
本帖最后由 freebsder 于 2017-9-15 20:51 编辑