程序远程IAP更新想法<br />片子是LPC2365, 目标是产品出厂后,可能因设计缺陷,或者用户需求中途变更,在能不动硬件的情况下,GSM网络远程升级片内程序.<br />我的想法是,<br />步骤1:<br />先做一个小的完整的程序,包含startup.c,targert.c和main.c. main()里的全部代码:<br />int main (void)<br />{ <br />void (*function)(void) = (void (*)())0x8000; <br />char Flag_code;<br /><br /> Flag_code = *(char *)(0x7000);//程序切换标识<br /><br /> if (Flag_code == 0)<br /> function = (void (*)())0x8000; //扇区8首地址 <br /> else<br /> function = (void (*)()0x20000; //扇区11首地址<br /><br /> (*function)(); <br /><br /> return 0;<br />}<br />加载文件:<br />LR_IROM1 0x00000000 0x00001000 ; load region size_region<br />{ <br /> ER_IROM1 0x00000000 0x00001000 ; load address = execution address<br /> { <br /> *.o (RESET, +First)<br /> *(InRoot$$Sections)<br /> .ANY (+RO)<br /> }<br />}<br /><br />LR_IRAM1 0x40000000 0x00006400 <br />{<br /> RW_IRAM1 0x40000000 0x00000400 ; RW data 1K系统变量<br /> { <br /> .ANY (+RW +ZI) ; map文件内看到就只有libspace.o<br /> }<br /><br /> RW_IRAM2 0x40000400 0x00006C00 ;堆区和栈区,27K<br /> { <br /> Startup.o (HEAP) ;堆区6k<br /> Startup.o (STACK) ;用户栈16k,IRQ栈4k<br /> }<br />}这样是因为我不知道libspace.o都干了些什么,猜测main环境的一些参数,比如当前堆区占空情况等都记录在这块内.将这个项目文件先烧进片内<br />步骤2:<br />假设出厂时程序在低区,项目中startup.c,targert.c和main.c和上面的程序完全相同,存储配置<br />LR_IROM1 0x00000000 0x00010000 ; load region size_region<br />{ <br /> ER_IROM1 0x00000000 0x00001000 ; load address = execution address<br /> { <br /> Startup.o (RESET, +First)<br /> Startup.o (+RO)<br /> target.o (+RO)<br /> main.o (+RO)<br /> *(InRoot$$Sections)<br /> }<br />}<br /><br />LR_IROM_L 0x00008000 0x00018000 ; load region size_region<br />{ <br /> ER_IROM2 0x00008000 0x00018000 ; load address = execution address<br /> { <br /> User.o (+RO)<br /> .ANY (+RO)<br /> }<br />}<br /><br />LR_IRAM1 0x40000000 0x00006400 <br />{<br /> RW_IRAM1 0x40000000 0x00000400 ; RW data 1K系统变量<br /> { <br /> .ANY (+RW +ZI)<br /> }<br /><br /> RW_IRAM2 0x40000400 0x00006C00 ;堆区和栈区,27K<br /> { <br /> Startup.o (HEAP) ;堆区6k<br /> Startup.o (STACK) ;用户栈16k,IRQ栈4k<br /> }<br />}<br />然后在程序中,将所有用到的全局或者静态变量,都以绝对地址的方式映射到未分配的空间去.并保证user里的代码,不和statuo.o,target.o.,main.o里的任何代码发生引用.然后将bin文件从0x8000,切割到0x20000,将这几个扇区的数据烧写进已经烧了最上面程序的片子上.<br />更新时,将新的项目烧写文件从0x20000切割出来,擦写进对应位置,别的扇区不动.后续再更新的话,则高低区不断切换擦写,扇区0一直维持不变<br />有人做过和我类似需求的东西么?是怎么解决的?我这么做,原理上行得通么?<br /> |
|