|
原帖由 lixmlxm 于 2012-12-29 13:50 发表
51我知道,51有中断呢向量入口地址!那么ARM呢?我搜索了一下,LPC2132的中断向量入口地址是0x18,不知道其他的是不是这样的!我现在看的现实中的 uCOS ii LM3S6911程序在里面没有找到入口地址以及入口地址跳转或链 ... 几乎所有支持中断的CPU都有中断向量表的(包括x86),所有中断向量入口的集合就是中断向量表或是其中的一部分。
LPC2132,这个系列的我玩得还算比较熟的。ARM7的IRQ中断(UCOS2这里一般不会用到FIQ中断的,不管它)的中断向量地址确实是0x18,中断的流程是,一旦外设中断的信号进到CPU核的IRQ引线上来后,当前也没有关IRQ中断,那么CPU马上跳到0x18,无论是什么外设的中断(不讨论FIQ,只讨论IRQ的)。这个可能和51的不一样,51的中断向量表是不是不同的外设中断对应不同的地址呢,这个我不知道。ARM因为是有VIC中断向量控制器,所以可以让全部的外设IRQ中断都进到0x18中来,然后因为各个不同的外设中断在寄存器VICVectAddrx中注册过,而中断向量表中0x18处:LDR PC, [PC, #-0xff0],这句话中[PC, #-0xff0]得到的地址就是对应中断VICVectAddr的地址,而这整句话其实就是把引发当前本次中断的服务子程序的首地址给PC(似乎说中断函数比较不专业)。自然,CPU就进到对应的外设中断服务子程序中来,处理该处理的中断。处理完后返回。
所以你能看到不同的IRQ中断都从0x18进来,然后借由VIC中断向量控制器硬件的支持,自然会进到对应的中断服务子程序中,没有错乱。
以上都是裸机下的,如果用到了操作系统,而且操作系统也要管理IRQ(或者说所有的IRQ处理流程中有操作系统的代码需要运行),那以上的流程就要变一下了。
UCOS2一般是需要管理全部的IRQ中断(如果你用到的中断不会引发任务就绪队列的变化,那一般可以不被操作系统管理,但不被他管理,要注意的地方就比较多了,也比较麻烦,一般不推荐),大致流程是,0x18这块不再是用LDR PC, [PC, #-0xff0]这样一句话了,而是先进到UCOS2的IRQ处理代码中,然后,当然,最终要进到各自的中断服务子程序也还是需要VIC的支持。如果之前在初始化外设时,在对应的VICVectAddrx中注册过,那这里就能用到了,取出VICVectAddr中的值也就是当前应该进入的中断服务子程序首地址喏。处理完后,可能还要再进到UCOS2的代码中,如果任务就绪队列中有变化的话,引发一次调度。没有的话直接返回到之前被中断的那个任务。
以上都是ARM7内核的,但是你说你用的是LM3S6911,这个不是ARM7的,是最新的ARM11之后,Cortex-M3的内核,简称CM3核,它的汇编和体系结构都和ARM7不同,我大致看过,有不同,但似乎也不是特别大,7模式简化为2个模式,但中断向量这块变化是很大的,它里面也有VIC,只是这个是更先进的NVIC,不过不同的地方至少有一点你得注意,外设中断向量入口地址是完全不同的,ARM7的都是0x18,但CM3的,假如说是Timer0,那对应的在中断向量表中有专门给他留的(具体地址不知道,启动代码中一定有的),其他的中断不能占用这个位置,Timer0产生中断后,PC会自动的跳到那里,取得对应的中断服务子程序首地址后会跳到里面去处理中断。Timer1的就是另外的地址了,据说CM3支持共256个中断,其中240个外设中断,之前在学校玩CM3和UCOS2时,改过这个地方,不是很难的(虽然当时不懂原理)。 |
|