IAP程序更新,这样可能么?

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

没人理会

没人理会,继续慢慢找资料了
农民讲习所 发表于 2008-10-21 10:35 | 显示全部楼层

最好不要这样

因为可能使用了公共函数。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

75

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部