我想用IAP在程序运行中升级程序 分散加载文件如下: ROM_LOAD 0x0 这个运行区中的文件是独立的。用于升级程序,只有在main文件中调用了main_user文件中的main_user涵数,这里面的文件是不会动的。生成的HEX文件为 ROM_EXEC.hex
ROM_LOAD1 0x00004000 这个运行区是我的应用程序,这里面的程序要改变,但我的main_user文件不会改变。生成的HEX文件为 ROM_EXEC1.hex 我通过改变ROM_LOAD1 0x00004000 文件内容。用ROM_LOAD 0x0中的程序升级ROM_LOAD1 0x00004000 区。 现在我改别ROM_LOAD1 中的其他文件(此时ROM_LOAD 0x0区的文件没有动),编译后ROM_EXEC1.hex和ROM_EXEC.hex都发生变化。这样就不能用用ROM_LOAD 0x0中的程序升级ROM_LOAD1 0x00004000 区。因为ROM_EXEC1.hex和ROM_EXEC.hex都发生变化。 请教: 1:为什么我没有改变ROM_LOAD 0x0的内容为何ROM_EXEC.hex的内容发生变化?2:如何实现任意改变ROM_LOAD1 0x00004000 区内容而ROM_LOAD 0x0内容不变: 附: ROM_LOAD 0x0 { ROM_EXEC 0x00000000 0x00004000 { Startup.o (vectors, +First) CFlash_Fix.o (+RO) CIap.o(+RO) CGPIOOUT_Fix.o (+RO) CGPIOIN_Fix.o (+RO) CGPIOINOUT_Fix.o (+RO) CSMISPI_Fix.o(+Ro) main.o(+RO) } }
ROM_LOAD1 0x00004000 { ROM_EXEC1 +0 FIXED { main_user.o(+RO) * (+RO) } IRAM 0x40000000 { Startup.o (MyStacks) * (+RW,+ZI) }
HEAP +0 UNINIT { Startup.o (Heap) }
STACKS 0x40008000 UNINIT { Startup.o (Stacks) } } //main在ROM_LOAD 0x0区运行 int main(void) { for(INT8U i=0;i<20;i++) { Xms_Fix(100); WatchDog(); } UpProgram();
main_user();
} //main_user 在ROM_LOAD1 0x00004000 区运行 int main_user (void) { //CDesPassword padeal; // padeal.deskey(key,0); // padeal.des(proc, temppwd); for(INT8U i=0;i<20;i++) { Xms(100); WatchDog_Task(); } OSInit(); GUart0Sem = OSSemCreate(1); GUart1Sem = OSSemCreate(1); GSPISem = OSSemCreate(1); GI2CSem = OSSemCreate(1); //(4) OSTaskCreate (TaskWatchDog,(void *)0, &TaskWatchDogStk[TaskwatchDogStkSize-1], TaskWatchDogPro); OSTaskCreate (Task9,(void *)0, &Task9Stk[Task9StkSize-1], Task9Pro); OSTaskCreate (Task8,(void *)0, &Task8Stk[Task8StkSize-1], Task8Pro); OSTaskCreate (TaskWorkModeLed,(void *)0, &TaskWorkModeLedStk [TaskWorkModeLedStkSize-1], TaskWorkModeLedPro); //(5) OSTaskCreate (TaskIPOKLed,(void *)0, &TaskIPOKLedStk [TaskIPOKLedStkSize-1], TaskIPOKLedPro); //(5) OSTaskCreate(TaskUart0,(void*)0,&Taskuart0Stk[Taskuart0StkSize-1],Taskuart0Pro ); OSTaskCreate(TaskUart1,(void*)0,&Taskuart1Stk[Taskuart1StkSize-1],Taskuart1Pro );
OSStart(); //(6) return 0; //(7) } |