Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120291
  • 博文数量: 26
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-26 22:27
文章分类

全部博文(26)

文章存档

2011年(1)

2009年(25)

我的朋友

分类:

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()此类信号量释放就认为是中断发生,比如硬件的中断、硬件抽象层(如驱动程序)的回调、操作系统层的同步,可以理解为不同层的中断机制,但前提是必须有异步事件来触发,而且在各层的发生通常是由下至上的链式反应,与之相对就是各层由上至下的系统调用。

中断机制一般基于前后台系统而异步处理中的查询方式,系统的并行性比较差,负载也较低,如果和信号量连用,将极大破坏系统的并行能力,同时容易引发死锁。

 

阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~