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