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