heuyck 发表于 2010-7-10 11:12:53

分享个运行在FLASH的软件在线自我升级的办法 另请教此方法的缺陷

一般程序要在线升级都要弄个升级程序 或BOOTLOADer之类
由升级扇区的程序来擦除写入应用程序扇区 坏处就是要建好几个工程
我是把IAP代码写成一个IAP函数 该函数不调用其他函数
再进入升级前 把这个IAP函数拷贝到内存里
再关闭所有中断 跳到该函数在内存中的地址来运行
这样就可以随意擦写任何FLASH扇区
因为IAP函数是在应用程序中的 所以可以随时更新
生产时也不用另外烧写bootloader代码 只要应用程序就可以了

目前找到并修正的bug
1.M3核的跳转地址必须为奇数 但拷贝函数时 还得按偶数字节拷贝全了
2.超过1字节的立即数 编译时是放在PC+XX的code区的 拷贝函数时没有拷贝进去
我是把这些立即数都放在内存里 把内存的地址通过参数(R0 R1)传进去

另外的遗留问题
IAP函数内的跳转 目前看汇编都是相对地址跳转 所以拷贝到内存中并没有影响
如果不用keil 其他编译器如果用绝对地址 那就不行了 考虑用汇编来写这段IAP函数 这样就完全掌控了
但是函数的通用性就不好了 ARM7的和m3就不一定兼容

我只在NXP的ARM7和M3芯片中试过 其他的兼容性就不知道了

eiglxl 发表于 2010-7-10 11:26:07

升级过程中断电就不行了。

xyz2008 发表于 2010-7-10 13:17:50

楼主,能否将自己的程序发上来, 我正好有LPC的ARM7开发板,想在上面试一下,不知道可以不

heuyck 发表于 2010-7-10 16:44:57

回复【1楼】eiglxl
升级过程中断电就不行了。
-----------------------------------------------------------------------
我们的设备都有后备电池 所以也考虑
不过100k的程序 搬过去几百毫秒就完事了 没那么巧吧...

程序家里没有唉

likaienjoy 发表于 2010-9-6 20:00:18

听起来比较有实际用处,能看下你是如何复制代码的程序么
页: [1]
查看完整版本: 分享个运行在FLASH的软件在线自我升级的办法 另请教此方法的缺陷