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