搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2010-7-10 11:12:53 | 显示全部楼层 |阅读模式
一般程序要在线升级都要弄个升级程序 或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芯片中试过 其他的兼容性就不知道了

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入168汤圆

发表于 2010-7-10 11:26:07 | 显示全部楼层
升级过程中断电就不行了。

出0入0汤圆

发表于 2010-7-10 13:17:50 | 显示全部楼层
楼主,能否将自己的程序发上来, 我正好有LPC的ARM7开发板,想在上面试一下,不知道可以不

出0入0汤圆

 楼主| 发表于 2010-7-10 16:44:57 | 显示全部楼层
回复【1楼】eiglxl
升级过程中断电就不行了。
-----------------------------------------------------------------------
我们的设备都有后备电池 所以也考虑
不过100k的程序 搬过去几百毫秒就完事了 没那么巧吧...

程序家里没有唉

出0入0汤圆

发表于 2010-9-6 20:00:18 | 显示全部楼层
听起来比较有实际用处,能看下你是如何复制代码的程序么
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 19:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表