0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

有关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
我有更好的答案
提 交
2条回答
充电搜索 09-28 22:42
补充说明:第三种情况下的的程序使用了操作系统UCOS-II,我用J-LINK进入仿真,发现程序死在了一个叫OS_InterCritical()的汇编代码中,该段代码非常简单,就是修改CPSR的I位,然后判断是否修改成功,如果修改不成功会返回到原标号出继续修改,结果就死在了那里
60user188 09-23 21:24
回答你的第二个问题,在arm7进入中断以后,会直接跳转到中断的向量地址,对于nxp的arm7在中断的向量地址里面一般会LDR     PC, [PC, #-0x0120]     ; Vector from VicVectAddr复制代码如果你在application里面重新设置VIC的话,那么对于application来说那条指令仍然是正确的,因为在中断进入是取寄存器的值,而寄存器的这个值是VIC来产生的。所以仍然能正确中断,那是不足为奇的。
撰写答案
提 交
1 / 3
1 / 3