有关KEIL下IAP使用带来的疑惑,来和大家交流交流
半年前开始自学ARM7,自己画图做了个板子,主芯片是LPC2138,参考资料一个是周工的《深入浅出ARM7上册》,另外一本是邵贝贝的UCOS-II,不谦虚的说,现在该片子的使用已经相当熟练,综合起来做一些有一定深度的应用型项目也是可以的,想想一路走来真的是相当不容易:'(。有一天在上网无意中看到了一篇关于使用IAP进行远程升级的文章,让我非常有兴趣,但是很多东西刚开始都根本看不懂,比如什么是分散加载文件,什么是中断重映射,什么是bootloader?一个星期以来,也是边看书边思考边实验,感觉弄懂了不少,但是仍然碰到了一些棘手的问题,卡住了,没办法了,来二姨家请教请教大家, 我用的是KEIL4,启动代码是库中自带的LPC2000系列。
现象一:KEIL工程下 选项设置中有 IROM和 IRAM,以2138为例,IROM起始地址是0,大小为0x80000,IRAM起始地址是0x40000000,大小是0x8000,这个是默认选项,假如我调整flash起始地址为第1扇区,即0x1000,那么这个时候会有几种情况:
1,假如我的程序中没有使用中断,那么相比默认设置,程序也可以运行
2,假如程序使用了中断,但是中断的写法使用了__irq的形式,即利用了KEIL提供的中断处理机制,程序也可以运行
3,假如程序使用了中断,但是中断处理机制是自己写的,程序就不能运行了(地址设为0是可以的)
其实第二种情况让我很疑惑,因为按照周工书上说的,当用户程序的起始地址不是从0x0开始时并且用户使用了中断,由于ARM内核在发生中断后会首先去读取0x0地址的中断向量,然后据此跳转,为了使中断能够正常响应,就要使用中断重映射,具体做法是在修改用户程序的启动代码,拷贝64B向量到RAM的底端,然后修改REMAP值为2,可是我什么都没做,竟然都可以,难道是因为__irq这种方式内部很特别?有哪位网友知道可以告诉我一下,谢谢!
第三种情况更让我郁闷,因为该程序的启动代码和中断处理代码都是公司一个牛人搞的,我也一直都在用,当修改了IROM起始地址后,该程序就无法运行了,我按照上面周工提供的办法处理了一下,仍然不行,将IROM该为0程序就可以正常跑起来,谁能告诉我这个可能还和什么有关系呢?
提问者:主张持法哲哲
地点:-
浏览次数:3516
提问时间:09-22 18:07
我有更好的答案