首页 理论教育 中断处理在嵌入式系统中的应用与原理

中断处理在嵌入式系统中的应用与原理

时间:2023-11-23 理论教育 版权反馈
【摘要】:中断是一种硬件机制,用于通知CPU 有异步事件发生了。微处理器一般允许断嵌套,也就是在中断服务期间,微处理器可以识别另一个更重要的中断,并服务于那个更重要的中断。μC/OS-Ⅱ允许中断嵌套,因为μC/OS-Ⅱ跟踪嵌套层数OSIntNesting。然而,为允许中断嵌套,在多数情况下,用户应在开中断之前先清中断源。

中断处理在嵌入式系统中的应用与原理

中断是一种硬件机制,用于通知CPU 有异步事件发生了。 中断一旦被识别,CPU 保存部分(或全部)上下文,即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务子程序(lSR)。 中断服务子程序做事件处理,处理完成后,则:①在前后台系统中,程序回到后台程序;②对非占先式内核而言,程序回到被中断了的任务;③对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。

中断使得CPU 可以在事件发生时才予以处理,而不必让微处理器连续不断地查询是否有事件发生,通过两条特殊指令——关中断和开中断,可以让微处理器不响应(或响应)中断。在实时环境中,关中断的时间应尽量短。

关中断影响中断延迟时间,关中断时间太长可能会引起中断丢失。 微处理器一般允许断嵌套,也就是在中断服务期间,微处理器可以识别另一个更重要的中断,并服务于那个更重要的中断。

μC/OS-Ⅱ中,中断服务子程序要用汇编语言来编写。 如果用户使用编译器支持内嵌汇编的话,用户可以直接将中断服务子程序代码放在C 语言的程序文件中。 中断服务子程序结构如下:

保存全部CPU 寄存器;

调用OSIntEnter 或OSIntNesting 直接加1;

执行用户代码做中断服务;

调用OSIntExit();(www.xing528.com)

恢复所有CPU 寄存器;

执行中断返回指令;

μC/OS-Ⅱ中,中断可以使正在执行的任务暂时挂起,并在进入中断前将任务执行现场保存到任务堆栈中。 当中断返回时,如果有优先级更高的任务进入就绪态,则中断将唤醒更高优先级的任务在中断嵌套全部退出后立即执行。 中断允许嵌套,嵌套层数可达255 层。

进入中断服务子程序后,用户代码应该将全部CPU 寄存器放入当前任务栈。 需要注意的是,有些微处理器做中断服务时使用另外的堆栈。 此时,当任务切换时,寄存器保存在被中断了的那个任务的栈中。

μC/OS-Ⅱ需要知道用户在做中断服务,故用户应该调用OSIntEnter(),或者将全程变量OSIntNesting 直接加“1”。 OSIntNesting 是共享资源,OSIntEnter()可以保证处理OSIntNesting时的排他性。 直接给OSIntNesting 加“1”比调用OSIntEnter()快得多,如果微处理器支持直接加“1”的指令,直接加“1”更好。 需要注意的是,在有些情况下,从OSIntEnter()返回时,会将中断打开,遇到这种情况时,需要在调用OSIntEnter()之前要先清中断源。

上述两步完成后,用户可以开始执行中断服务程序。 中断服务子程序通知某任务去做事的手段是调用以下函数之一:OSMboxPost()、OSQPost()、OSQPostFront()和OSSemPost()。 中断发生并由上述函数发出消息时,接收消息的任务可以是也可以不是挂起在邮箱、队列或信号量上的任务。 μC/OS-Ⅱ允许中断嵌套,因为μC/OS-Ⅱ跟踪嵌套层数OSIntNesting。 然而,为允许中断嵌套,在多数情况下,用户应在开中断之前先清中断源。

调用脱离中断函数OSIntExit()标志着中断服务子程序的终结,OSIntExit()将中断嵌套层数计数器减“1”。 当嵌套计数器减到零时,所有中断(包括嵌套的中断)就都完成了,此时μC/OS-Ⅱ需要判定有没有优先级较高的任务被中断服务子程序(或任一嵌套的中断)唤醒。如果没有高优先级的任务被中断服务子程序激活而进入就绪态,OSIntExit()只占用很短的运行时间。 如果有优先级高的任务进入了就绪态,μC/OS-Ⅱ就返回到那个高优先级的任务,OSIntExit()返回到调用点。 保存的寄存器值是在这时恢复的,然后是执行中断返回指令。 如果调度被禁止了(OSIntNesting>0),μC/OS-Ⅱ将被返回到被中断了的任务。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈