费了很大劲做了lpc的iap方案,最后没有用上,共享点资料,只要结果不做分析。
方案一:boot(含iap)+app
BOOT和APP是分两个工程分别来编译的。APP里面需要将异常向量表(64个字节)REMAP到RAM,这样就产生中断就可以从APP中取中断跳转地址了。
BOOT(含iap)+app用这种方式的好处是:
1、 boot是被保护的,这样无论什么情况boot总是运行的,可以做些保护措施。
2、 由flash分配可以知道,nxp的扇区大小差别很大,这样可以保证用小的扇区来做boot。
坏处是:
1、 要对arm体系比较熟悉。
2、 有2个工程,维护不方便,有2个文件,发布前还要合并
坏处:
1、 在运行app的那几秒钟时间掉电或者复位了就完了。
2、 只能用后面的扇区做app,可能是32k,很浪费。
/******************************************************
* bootloader中检测试标志位决定启动哪个区域的代码
* 复制中断向量表并重新映射
*
*******************************************************/
typedef void (*func_t)(void);
func_t ptr;
void checkFlag(void)
{
int i;
unsigned char *pc = (unsigned char *)0x0007d000;
unsigned int *pram = (unsigned int *)0x40000000;
unsigned int *webup = (unsigned int *)0x00003800;
unsigned int *uartaddr = (unsigned int *)0x00001000;
if ((pc[0] == 0x02) &&
(pc[1] == 0x02) &&
(pc[2] == 0x09) &&
(pc[3] == 0x20))
{
for(i=0;i<8;i++)
{
*(pram+i) = *(uartaddr+i); //复制8*4字节的中断向量表
//到RAM:0x40000000
}
MEMMAP = 2;
ptr = (func_t)uartaddr; //跳转到uartaddr地址处运行这个区域的代码
(*ptr)();
}
else if ((pc[0] == 0x01) &&
(pc[1] == 0x01) &&
(pc[2] == 0x09) &&
(pc[3] == 0x20))
{
for(i=0;i<8;i++)
{
*(pram+i) = *(webup+i);
}
MEMMAP = 2;
ptr = (func_t)0x00003800;
(*ptr)();
}
}
下面为第一个工程中的分散加载文件:
BOOT_LOAD 0x00000000
{
BOOT 0x00000000
{
bootentry.o (BOOTS, +First) ;这部分为检测标志位,处理中断向量表复制
boot.o(+RO) ;和重新映射并跳转的代码
}
}
OS_LOAD 0x00003800
{
WEBUPGRADE_EXE 0x00003800 FIXED
{ ;这个工程的中断向量表,因为这个工程被放在0x3800处,所以它的中断向量 ;表放在这个区域的最开始处
vectors.o (VECT, +First)
init.o (INIT)
}
ROM2_EXE +0
{
*(+RO)
}
RW_IRAM1 0x40000020 0x00007000
{
* (+RW,+ZI)
}
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {}
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}
;---------------------------------------------------------
下面为第二个工程的分散加载文件:
OS_LOAD 0x00030000 ;放在地址0x30000处的第二个工程的代码
{
WEBUPGRADE_EXE 0x00030000 FIXED
{ ;中断向量表
vectors.o (VECT, +First)
init.o (INIT)
}
ROM2_EXE +0
{
*(+RO)
}
RW_IRAM1 0x40000020 0x00007000
{
* (+RW,+ZI)
}
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {}
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}
一些心得:
程序要有备份区,下载缓冲区,最好有外部dataflash。
程序小而且不改硬件的一个flash划分:(针对lpc2136)
1、2扇区8k做boot,6,7,8,9 72k做程序区,,3,4,10,11做下载缓冲,5,6,12,13做备份区,14多的可以当eeprom用