搜索
bottom↓
回复: 4

LPC2378在线升级实现另类思路

[复制链接]

出0入0汤圆

发表于 2009-8-21 21:57:50 | 显示全部楼层 |阅读模式
注:此贴为引用贴,特贴在此处,希望大家能对此发表一些看法和认识。

希望高手们能解解其中奥秒,还有像我这样的人可以学习一下。

LPC2378在线升级实现
一、
概述
在线升级要求正在执行的程序对自己进行升级,如何能可靠升级,如升级失败可以回到原来程序继续执行,本文介绍一种简单容易做到不影响应用的方法。
二、
实现方法分析
先看下面的图,把程序空间分为三部分,这是容易理解的分配,
有人问了,这是不是要写一个引导程序,答案是:不用,就用你自己的应用程序,只是巧妙使用分散加载进行编译,把程序分别编译到不同地址就可以了。


0x00040000


高地址区(HighAddr):256k



0x00008000


低地址区(LowAddr):224k


0x00000000




共用代码 32k


我们现在看一下分散加载文件:
分散加载文件1 ------低端地址
ROM_LOAD 0x00000000 0x1000
{

ROM_EXEC 0x00000000{
;中断向量表

Startup.o (RESET, +First);//*.o (RESET, +First)

}
}
ROM_LOAD1 0x00004000 0x2000
{

ROM_EXEC1 0x00004000{


__main.o(+RO)

__scatter.o
(+RO)

__scatter_zi.o(+RO)

lib_init.o(+RO)

irq.o(+RO)

target.o(+RO)

timer.o(+RO)

swi_handler.o(+RO)

comm_arm.o(+RO)

}
}

ROM_LOAD2 0x00008000
0x40000;
//加载映像文件,从第0x00001000开始
{

ROM_EXEC2 0x00008000 {

* (+RO)

}

RW_IRAM1 0x40000000 0x00008000
{
; RW data


* (+RW +ZI)

}
}

分散加载文件2 ------高端地址

ROM_LOAD 0x00000000 0x1000
{

ROM_EXEC 0x00000000{
;中断向量表

Startup.o (RESET, +First)

}
}
ROM_LOAD1 0x00004000 0x2000
{

ROM_EXEC1 0x00004000{


__main.o(+RO)

__scatter.o
(+RO)

__scatter_zi.o(+RO)

lib_init.o(+RO)

irq.o(+RO)

target.o(+RO)

timer.o(+RO)

swi_handler.o(+RO)

comm_arm.o(+RO)

}
}

ROM_LOAD2 0x00040000
0x40000 ;加载映像文件,从第0x00040000开始
{

ROM_EXEC2 0x00040000 {

* (+RO)

}

RW_IRAM1 0x40000000 0x00008000
{
; RW data


* (+RW +ZI)

}
}

低地址程序空间占用:

0x0000 0000 --- 0x0000 0FFF  4k  和高端重用  B1
0x0000 1000 --- 0x0000 1FFF  4K              B2
0x0000 2000 --- 0x0000 3FFF  8k未用          B3
0x0000 4000 --- 0x0000 5FFF  8k和 高端重用  B4
0x0000 6000 --- 0x0000 7FFF  8k未用          B5
0x0000 8000 --- 0x0003 FFFF  224K  低端      B6
0x0004 0000 --- 0x0007 FFFF  256k未用        B7
低端用:B1、B4、B6

高地址程序空间占用:

0x0000 0000 --- 0x0000 0FFF  4k和低端重用  B1
0x0000 1000 --- 0x0000 1FFF  4K            B2
0x0000 2000 --- 0x0000 3FFF  8k未用        B3
0x0000 4000 --- 0x0000 5FFF  8k和低端重用  B4
0x0000 6000 --- 0x0000 7FFF  8k未用        B5
0x0000 8000 --- 0x0003 FFFF  224K 未用      B6
0x0004 0000 --- 0x0007 FFFF  256k高端      B7
  高端用:B1、B4、B7
   
为什么要这么做?我们对比两个编译好的文件发现:
1、        B1 的内容两个文件完全一样。
2、        B4的内容有个别不同, 两个文件B4内容放在同一块内的目的是为让B1相同
3、        B6和B7不同。

这样编译好的两个文件就可以互相升级,因为两个文件第一个扇区相同,向量表一样,升级时第一扇区不用改写,低端的B4可以备份到B3, 高端的B4可以备份到B5, 这样两个程序同时存在,B2来标识正在运行的程序是高端还是低端。 如想改变高低端的程序运行,只要把备份的B3或B5重写到B4然后复位芯片就可以了。
所以升级时写FLASH过程如下:
1、        收到B4的部份,如为高端写在B5,低端则写在B3
2、        B6或B7内容直接按地址写入
3、        全部校验成功后,把B3或B5的内容复制B4,复位芯片.

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-8-24 09:07:11 | 显示全部楼层
放一个DEMO上来看看实用性和可靠性如何?

出0入0汤圆

发表于 2011-2-18 14:30:56 | 显示全部楼层
mark

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 23:53

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

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