楼主大神,向您请教一个问题。用您的方案已经很好并且成功了。但因为MCU空间充足并且想要把IAP功能集合到一个工程。我还想尝试以下不同方案。需重定位中断向量地址,需配置IAR的icf文件将地址分段。
0x8000-0x807F 为region vectitt , 对应放置跳转到重定义的中断向量地址0x9000-0x907f。
0x8080-0x8FFF 为region iaprom,对应iap相关的loader代码处理。
0x9000-0x907f 为region revector ,为重定义的中断向量地址
0x9080-0xFFEF 为region rom ,对应app功能区代码
0xFFF0-0xFFFF 为region iapdoneflag ,对应存一个标志来判断是要跳至iap还是app.
重定义中断向量时我用了以下代码:
__root const long reintvec[] @ ".intvec"=
{ 0x82008080,,0x82009004.....};
在icf文件中对应有修改如下:
define region vectitt = [from 0x8000 to 0x807F];
define region IapRom = [from 0x8080 to 0x8FFF];
define region Revectit = [from 0x9000 to 0x907F];
define region Rom = [from 0x9080 to 0xFFEF];
define region IapFlag = [from 0xFFF0 to 0xFFFF];
define region NearFuncCode = [from 0x9080 to 0xFFEF];
define region FarFuncCode = [from 0x9080 to 0xFFEF];
define region HugeFuncCode = [from 0x9080 to 0xFFEF];
define block INTVEC with size = 0x80 { ro section .intvec }; //用此三行编译无法通过!
define block INTVEC with size = 0x80 { ro section .intvec }; //用此三行编译无法通过!
place at start of vectitt { block INTVEC }; //用此三行编译无法通过!
屏蔽以上三行,改用:
place at start of vectitt { rw section .intvec }; //则编译可以通过
编译可以通过,但是编译出来却不是我想要的,0x8000-0x8080之间竟然是空的!
我重定位的地址向量(82008080等)被写到FarFuncCode 这段空间里面去了。
我以为的理想状态应该是0x8000-0x807F之间被填充为82008080,82009004,。。。
要怎样修改icf文件实现想要的功能呢???还请大神赐教!
|