本帖最后由 zdhlixiang2006 于 2013-7-7 08:22 编辑
前一段一个项目中用到了远程升级,本人也对IAP很感兴趣,于是开搞,主芯片是LPC2138,刚开始什么都不懂,2周后终于有点思路了。
进入正题:我的下位机IAP程序分四部分,LPC2138 falsh 有500K,共27个扇区,分别是0-26,所以我的程序中是这么设计的:跳转程序(从默认地址开始存放,上电后首先执行),bootloader位于扇区1,用户程序区(扇区2-扇区12),程序备份恢复区(扇区13-扇区25),扇区26首地址存放一个跳转程序用到的标志。我用一整个扇区(4K)来存放一个标志(PrmRun)确实很浪费,主要是没有办法,因为NXP Flash的最小操作单位是扇区:Q
程序分区存放我已实现,主要是利用了分散加载机制和中断重映射,其他没什么特别的。总体思路是,跳转程序中去指定地址读取跳转标志,然后据此跳转(是用户程序区还是备份恢复区)。bootloader 利用IAP来升级用户程序区,如果更新成功就更新跳转标志(PrmRun=1)并跳转到用户程序区执行,如果多次失败就跳转到备份区,然后更新跳转标志(PrmRun=0)以告诉系统下次上电后仍然运行备份程序
现在遇到一个问题,地址的绝对定位问题,因为26扇区首地址为0X0007C000,查看资料,MDK可以使用absacc.h中的__at宏,于是在bootloader中我这样定义了一个变量 INT32U PrmRun __at(0X0007C000); 然后程序中当IAP升级成功时,就改变此标志为1, 我是这样搞的:
PrmRun = 1;//默认为0 编译OK,但是当程序执行时就跟死机了一样,注释掉这句,OK,进入调试发现,这样操作会引起预取数据异常,为什么呢?如果这样操作本身有问题,那怎么来实现我的功能呢,即在26扇区首地址的数据可以随意更改,求解答,先谢了,读取很简单,利用指针定位即可:hug:
|