分类:
2009-05-30 22:17:54
----------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://dreamlcr.cublog.cn/
----------------------------------------------------
uC/OS-II中的中断服务子程序
/**********************************************************/
用户中断服务子程序
{
保存全部CPU寄存器;
调用OSIntEnter()或OSIntNesting直接加1;
if (OSIntNesting == 1) {
OSTCBCur->OSTCBStkPtr = SP;
}
清中断源;
重新开中断;
执行用户代码做中断服务;
调用OSIntExit();
恢复所有CPU寄存器;
执行中断返回指令;
}
/**********************************************************/
注意:中断服务所做的事应尽可能地少,应把大部分工作留给任务去做。
另外,有些微处理器,像Motorola 68HC11,中断发生时,CPU寄存器是自动入栈的,且若要允许中断嵌套,在中断服务子程序中须重新开中断,这可以视作一个优点。确实,如果中断服务子程序执行得非常快,无须通知任务,已经进入了中断服务,只要不在中断服务期间开中断,也无须调用OSIntEnter()或OSIntNesting加1。以下的示意性代码说明了这种情况。
Motorola 68HC11中的中断服务子程序:
/**********************************************************/
M68HC11_ISR /* 快速中断服务子程序,不准开中断 */
{
所有寄存器被CPU自动保存;
执行用户代码,以响应中断;
执行中断返回指令;
}
/**********************************************************/
注意:一个任务和这个中断服务子程序通信的惟一方法是通过全局变量。
另外,我们要很好地理解中断的定义,其实中断是处理器层次的,从系统分层的角度来考量中断,在每一层确实都存在中断机制,但须注意这个机制必须是异步的,不受程序控制的,而并非出现OSSemPost()此类信号量释放就认为是中断发生,比如硬件的中断、硬件抽象层(如驱动程序)的回调、操作系统层的同步,可以理解为不同层的中断机制,但前提是必须有异步事件来触发,而且在各层的发生通常是由下至上的链式反应,与之相对就是各层由上至下的系统调用。
中断机制一般基于前后台系统,而异步处理中的查询方式,系统的并行性比较差,负载也较低,如果和信号量连用,将极大破坏系统的并行能力,同时容易引发死锁。