概述
ADSP-BLACKFIN处理器的事件控制器处理到达处理器的所有同步和异步事件。事件处理支持嵌套(nesting)和优先级。嵌套允许同时激活多个事件的服务程序。优先级保证高优先级事件的响应可以抢占低优先级事件的响应。
事件控制器将发生的事件分为5种不同的类型:
- 仿真:仿真事件使处理器进入仿真模式,允许通过JTAG接口命令控制处理器。
- 复位:此事件使处理器复位。
- 不可屏蔽中断(NMI):NMI事件可以由软件“看门狗”定时器或者处理器的NMI输入信号产生。NMI事件经常用作断电指示,有序进行系统关闭工作。
- 异常:异常是与程序执行同步发生的事件,即指令执行完之前可能会产生异常。例如数据对齐违规、未定义指令等情况都会导致异常。
- 中断:中断是与程序执行异步发生的事件,由定时器、外设输入引脚等引起,也可以由软件指令触发。
每个事件都有一个相应的保存返回地址的寄存器和一个相应的事件返回指令。一个事件被触发后,处理器的当前状态被保存在管理员模式空间的堆栈内。
事件控制器包括两个部分,系统中断控制器(SIC)和内核事件控制器(CEC)。SIC和CEC协同工作来控制优先级和控制所有系统事件。从概念上讲,来自外设的中断进入到SIC,然后被直接发送到CEC的通用中断处理。
系统中断处理器(SIC)
系统中断处理器为来自多个外设的中断源提供至CEC通用中断输入的映射和路由。尽管blackfin dsp处理器提供了默认映射,用户仍可以通过改写中断设置寄存器(IAR)的值,来改变中断事件的映射和优先级。
内核事件控制器(CEC)
处专用中断和异常外,CEC还支持9个通用中断(IVG7-15)。这些通用中断中,推荐将优先级最低的两个中断(IVG14-15)留作软件中断,剩下的7个优先级中断用于外设。
事件处理过程
上图描述了一个中断(Interrupt A)被处理的过程。其中用到了多个相关寄存器,下面结合上图的流程,进行介绍。
- 当一个中断触发后,SIC_ISR寄存器中的相应位记录了这个中断请求的标记,直到中断处理程序清除这个标记。
- 如果系统处于idle,SIC_IWR检查这个中断是否要唤醒系统。
- SIC_IMASK提供中断的屏蔽功能。如果一个中断没有被屏蔽,则处理到第4步。
- SIC_IARx寄存器将外围中断映射到通用中断(IVG7-15),以此决定中断A的优先级。
- ILAT寄存器相应位置高。表示这个事件已经被latched,但还没被处理器接受(accepted)。一旦这个事件被处理器接受,ILAT寄存器的相应位被清零,同时,IPEND的相应位被置高。IPEND的这位表示该事件已经进入处理器流水线。
- IMASK再进一步进行通用中断层次上的屏蔽,如果相应的通用中断没有被屏蔽,则进行第7步处理。
- 事件向量表(EVT)被用来查找相应的中断处理程序。中断处理程序是对应于通用中断IVGx的。
- 第5步中提到过事件被处理器接受,接受的概念是中断处理程序已经进入核心的处理流水线,此时IPEND的相应位被置高,它同时将ILAT的相应位清零。
- 当中断服务程序(ISR)执行完毕,RTI指令清除IPEND的相应位。然而,SIC_ISR寄存器中的相应位并没有被清除,这个需要ISR自己清除。
如果多个中断源共享一个通用中断,此时ISR必须能分辨出是哪个中断是当前需要处理的,这可以通过检查SIC_ISR寄存器完成。