Posted on 2007-11-20 22:20
buf 阅读(766)
评论(0) 编辑 收藏 引用 所属分类:
Embedded
看了好几天,资料也下了一坨,还是没弄明白这个中断处理的过程。身边没有人可以讨教,到网上问吧,开发板又各有各的配置,哎。不过,其实也差的不远了,我想。
板子从00ic买的,如果不是硬件的问题,也不指望什么售后服务了。价钱不贵,可是也是要付出代价的。我从这块板子开始学习ARM,这才刚刚开始,希望跟大家多多交流,如果是也用这块板子的,更好。
我是从u-boot和那个硬件测试程序开始的,没有弄明白发生异常后是如何进入用户编写的异常处理函数的。到现在以下东西是清楚的:(以SWI异常处理为例,这个比较容易测试)
1,如果cpu遇到swi xxx指令,则保存cpsr并进入特权模式,然后将swi对应的异常向量 0x0000_0008 load到pc。
(这是s3c44b0x的硬件逻辑)
2,u-boot在0x0000_0008处的指令为 ldr pc,=HandleSWI,而HandleSWI在后面定义为0x0c00_0008。(见/cpu/s3c44b0x/start.S)
3,真正的异常向量表建立在SDRAM的高端,基址为_ISR_STARTADDRESS( 0x0c7ff_ff00 ),用户有责任初始化这个异常向量表。比如,对于SWI,需要在0x0c7f_ff08开始的4字节存放SWI_ISR的入口地址,这一点,Main中的isr_init()函数已经这样做了。
(见main.c中isr_init() 函数)
4,isr_init()函数中的for循环,将SDRAM的前8个word设为0xea00_1ffe,即从0x0c00_0000开始向上是8条b指令。
(见main.c中isr_init() 函数)
好了,现在问题在于:
a,如果上面的理解都没有问题的话,4处的8条b指令应该负责跳转到SDRAM高端真正异常向量的相应位置。比如,0x0c00_0008处应该存放b 0x0c7f_ff08,这样1,2,3经过一系列的跳转,最终进入用户编写的SWI_ISR。但是,我计算出来来这条b指令如果放在0x0c00_0008机器码应该为0xea1f_ffbe,与4中所设置的0xea00_1ffe不一致。测试的结果,我算出来的不对,但我还没明白它这个0xea00_1ffe是怎么算出来的。
b,即使我弄清楚这个0xea00_1ffe是如何计算出来的,我也搞不懂为啥要进过这么多次跳转,从0x0c00_0008直接跳转到SDRAM高端的向量表可以么?要知道,如果使用non-vectored irq的话,中断的处理比起异常来还要经过更多的跳转步骤,所有的中断都先通过一个HandlerIRQ进行散转,从pending寄存器找到中断源,进而才能得到相应中断服务例程的入口地址……
要是有兄弟能看明白我说了些啥,我觉得也可以了。要是能帮我解决这个问题,麻烦告诉我一声儿。。。当然,我还要努力的,继续看。