中断是提供队内部或外部事件立刻反应的机制。当中断发生时,处理器悬挂当前执行路径,把控制流转移到中断服务程序(ISR)。一个中断的精确操作是跟处理器相关。
NP支持可管理或不可管理的ISRs。可管理ISR是指那些不需要保存和恢复上下文的情况,而不可管理是指其负责保存和恢复所用泳道的寄存器。可管理的ISR可以用C或汇编写成;而不可管理的ISR几乎都是汇编写成。
保护:对于所有的实时内核,中断总是产生一些感兴趣的问题。NP当然也不例外。主要问题来自于ISRs需要存取的NP的服务。表面上,这个看起来不是个问题,然而,其需要在系统服务代用期间,防止同时被ISR存取。最简单的方法是在终端服务期间锁住中断。
对中断响应快速实时系统的基础。因此,锁住中断来保护内部数据是不被希望的。NP处理这个问题是通过把应用ISR分为高级和低级部分。
低级ISR(LISR):LISR和正常ISR一样,使用当前的堆栈。NP在调用LISR前保存上下文,执行LISR后恢复上下文。因此,LISR可用C写,而且可以调用其他C例程。然而,仅有少量的NP服务对LISR可用。如果中断处理例程需要其他的NP服务,则高级ISR(HISR)被激活。NP支持多LISR嵌套。
高级ISR(HISR):HISR被动态创建或删除。每个HISR拥有自己的堆栈和自己的控制块,其内存有应用提供。当然,在LISR激活前,HISR必须被创建。
由于HISR有自己的堆栈和控制块,当其存取正在被存取的NP数据结构时,可以被临时阻塞。
HISR可以存取绝大部分NP服务,除了自悬挂服务。此外,由于HISR不能悬挂NP服务,其悬挂参数必须总是被设定为NU_NO_SUSPEND。
HISR有3个优先级可用,如果在处理低优先级的HISR时,高优先级的HISRj激活,则低优先级的被"抢占",这个任务抢占是一样的。相同优先级的HISR根据激活顺序,依次执行(注意!不是轮转哦!!)在正常的任务调度以前,所有激活的HISR被执行。
每个HISR有个激活计数器。该计数器用于保证每个激活都被执行一次。
HISR类似于任务,有自己的堆栈,但它的优先级比一切任务的优先级高(即系统总是首先调度HISR运行)。HISR的优先级分为0到2,其中0的优先级别最高,2的优先级别最低。HISR的状态只有两种:激活状态和静止状态。LISR按需要激活相应的HISR,然后HISR进入对应的HISR优先级就绪队列,等待CPU调度。相同优先级的HISR链接成单链表,用数组*tc_hcb tcd_active_hisr_heads[tc_hisr_priorities]存放这些链表的头地址。这样在寻找最高优先级的HISR时,只需简单查找数组中第一个非零元素所指向的链表的第一个结点HISR。
LISR在执行时需保存现场,以矢量号为变元调用Tcc_dispatch_lisr()执行对应的低层中断例程,再跳转到现场恢复例程。LISR无控制块且没有自己的堆栈,运行时占用被中断的任务、HISR的堆栈或系统堆栈。LISR可用汇编语言或c语言编程,若采用c语言则调用Tcc_register_lisr()安装到某号中断矢量上。
文章评论(0条评论)
登录后参与讨论