简述一下210的中断情况,内置了4个VIC(vectored interrupt controler)中断控制器,型号是ARM的PL192控制器,4个VIC加起来支持93个中断源。
配置中断时,主要涉及4个方面的配置:
1.异常向量表的设置。
2.中断源的配置。
3.中断控制器的配置。
4.处理器内核配置。
1.中断源的相关寄存器:
当需要开启中断时,则需要对中断源进行相应的配置,这里主要记录常用的外部中断的配置。外部中断的配置主要是对引脚的配置,涉及的寄存器主要分为两组。
一组是EINT0~16,涉及的寄存器主要是EXT_INT_x_CON,EXT_INT_xMASK,EXT_INT_PEND。EXT_INT_x_CON是外部中断的的配置寄存器,主要配置中断的触发方式;EXT_INT_xMASK是外部中断的屏蔽寄存器,配置引脚的中断是否屏蔽;EXT_INT_PEND是外部中断的中断未决寄存器,中断结束时必须清楚相应位,否则会持续引发中断。
另一组的则是其余的GPIO的中断,他们复用一个中断线路,涉及的寄存器主要是GPxx_INT_CON,GPxx_INT_MASK,GPxx_INT_PEND。各寄存器功能跟第一组的类似。
2.中断控制器的相关寄存器:
VICxINTSELECT——中断类型选择寄存器,通过此寄存器选择是IRQ还是FIQ。
VICxINTENABLE——中断使能寄存器,通过此寄存器使能相应的中断线路。
VICxINTENCLEAR——中断使能清除寄存器(即失能),在控制器禁止某路中断在该寄存器设置。
VICxIRQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的IRQ中断请求状态。
VICxFIQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的FIQ中断请求状态。
VICxRAMINTR——原始中断请求寄存器,记录了未经VICxINTENABLE和VICxINTSELECT过滤后的中断请求状态。
VICxSOFINT——软件中断寄存器,通过该寄存器可使控制器产生相应线路的中断信号,该信号未经过优先级,VICxINTENABLE和VICxINTSELECT等寄存器的过滤。
VICxSOFINTCLEAR——软中断清除寄存器,在ISR(中断服务程序)结束时要清除该寄存器相应位来清除中断,否则该中断会持续触发。
VICxVECTADDRx——向量地址寄存器,该寄存器保存的是相应线路的ISR的地址。
VICxVECTPRIORITYx——保存相应相应线路的优先级,有16个优先级,0的优先级最高,当多个相同优先级的线路同时请求中断时,按硬件优先级排序,同一组中断,中断好越低优先级越高,如VIC0中,EINT0优先级;如正在执行某ISR时,又一同软件优先级的但硬件优先级高的线路请求中断,此时该中断被屏蔽,要当前ISR执行完毕才可受理。
VICxSWPRIORITYMASK——软件优先级屏蔽,可设置屏蔽相应的优先级,屏蔽后则相应优先级的中断被屏蔽。
VICxADDRESS——保存当前活跃的中断线路的ISR地址,读取一次该寄存器意味着当前活跃的中断请求已被标志为已服务,此操作只能在进入中断处理时执行;向该寄存器写如任意值表示清楚控制器中该路中断状态,此操作只能在ISR结尾处执行。
VICxPROTECTION——控制器保护模式配置寄存器,配置为保护模式时,中断控制器的寄存器只能在特权模式下被访问;非保护模式时,用户模式和特权模式都可以访问中断控制器的寄存器。VICxPROTECTION只能在特权模式下访问。
3.处理器内核配置主要是配置CPSR寄存器,配置相应中断控制位为允许中断。
寄存器介绍完毕,接下来再捋一遍外部中断的配置过程:
1.异常向量表的设置:
设置好中断向量,异常向量表的地址为:0xD0037400。
2.中断源的配置:
(1)配置管脚的功能为中断(GPIOCON)。
(2)配置中断的触发方式(EXT_INT_x_CON)。
(3)配置不屏蔽该管脚的中断(GPxx_INT_MASK)。
3.中断控制器的配置:
(1)选择中断的类型(VICxINTSELECT)。
(2)配置中断优先级(VICxVECTPRIORITYx)。
(3)注册中断处理程序(VICxVECTADDRx)。
(4)使能该中断(VICxINTENABLE)。
4.处理器内核的中断配置:
主要是配置相应中断控制位为允许中断。
清除中断
中断服务程序完成前写VICxADDRESS
清除中断未决寄存器EXT_INT_PEND相应位
遗留问题:
1.daisy-chain指的是”链式“的意思?
2.4个VIC控制器之间的优先级问题?优先级是按代码写的来变还是说有固定的优先级?
3.异常向量为何在0xD0037400,而且存放的是跳转地址,而不是一条跳转指令?异常向量表地址为何不是在0x00000000或者0xffff0000?
4.其他中断源的配置,如UART等,需要外部管脚作为触发中断?
已找到问题3的答案:
一般ARM的异常向量表存放的确实是跳转指令,异常向量表的其实地址确实是在0x00000000或者0xFFFF0000。而写裸机代码时,S5PV210的0xD0037400这个地址其实是一个被设置为存放异常向量表的地方而已。详述如下:
先看看210的0x0地址并不是内存,而是IROM(interal ROM),此外,内部还集成了一块IRAM,地址分布如下:
那块IROM中集成了一些初始化代码,初始化的空间用途如上,其实真正意的中断向量表就是IROM中,发生异常时,PC跳转至0x0地址处的异常向量表,而IROM中的代码通过某种方式从地址0xD003_7400处加载异常处理函数的地址,具体是怎样加载的就不清楚了。所以我们写裸机代码时,用到异常时,通过向0xD003_7400地址存入相关异常服务函数就可以了,异常向量表的设置就OK了。
不过真正的异常向量表保存在IROM的ox0地址中,运行速度慢,频繁发生异常时运行性能肯定会大大降低。所以通常情况下,我们会使用MMU来进行系统空间地址的重映射,将内存设为0x0地址,然后将异常向量表设置在内存中。