找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 10491|回复: 1
打印 上一主题 下一主题
收起左侧

uC/OS-II学习笔记—中断管理

[复制链接]
跳转到指定楼层
楼主
本帖最后由 xueren 于 2013-7-26 13:43 编辑

uC/OS-II是实时多任务操作系统,系统的实时性主要体现在对中断的响应上,要求能够尽可能快地响应中断,进入中断程序处理中断请求。uC/OS-II还要求中断服务程序运行的时间不能过长,长时间的运行中断服务程序会使系统中其他的任务得不到运行,或使系统不能处理新的中断。因此在中断服务程序的设计上,必须做到短小精悍,而把复杂的处理过程通过消息等机制交给用户任务来做。
uC/OS-II并没有单独的C语言文件来做中断的处理。因为不同的硬件系统,中断服务程序的编写是完全不同的,操作系统中提供的中断管理函数还是在内核OS_core.c中。但是,对中断服务程序的编写必须根据uC/OS-II的思路来实现。
事实上,任务的调度也大多依靠中断。我们知道,如果创建任务或调用OSTaskDelete(OSPrioSelf)删除自己,或调用OSTaskSuspend(OSPrioSelf)阻塞自己,这时候这些函数会执行一次任务切换。但更多的任务切换是时钟中断。时钟中断在每个时钟滴答都发生,该中断服务程序在发现了有更高优先级的就绪任务就会进行任务调度。当操作系统有其他的中断时,如定时器中断,外部中断,串口中断等等,只要中断是打开的,而且正在运行的任务并没有关中断,就会相应中断,这时任务就被切换了。因此,遵循uC/OS-II的中断管理思路,设计好的中断服务程序是使用好uC/OS=II的关键之一。
如果正在运行的任务没有关闭中断,在中断到来时,操作系统将会响应中断,进入中断服务程序。这时任务的运行环境还没有保存,因此需要将任务的运行环境保存。这时任务由于中断的到来而进入挂起状态,如下图所示:

进入中断服务程序,首先将当前正在运行的任务的CPU环境保存。接着将中断使用的一个重要全局变量 OSIntNesting加1,表示中断嵌套深了一层。实现此功能的就是OSIntEnter函数,该函数实现且只实现这一功能,程序如下所示:

由OSIntEnter代码可知,中断的嵌套存数要求小于255。在操作系统初始化过程中,OSIntNesting被初始化为0。如果原来没有中断服务程序在运行,显然OSIntNesting的值仍然是0,在这里由于进入中断服务程序,所以应该加1。否则,将暂停正在运行的其他中断服务程序,而运行本中断服务程序,即发生中断嵌套。如果中断服务程序不希望把被打断,很简单地执行关中断即可。所以,操作系统是允许中断嵌套的,使不使用是另外一回事。
中断服务程序应该处理硬件的紧急操作,对于处理数据等操作,可以交给任务来完成。中断服务程序和任务之间可以共享数据结构,中断服务程序可以向任务发消息等。总之,中断服务程序的运行事件不宜太长。
中断服务完成后,应调用与OSIntEnter相匹配的OSIntExit来进行最后的处理。OSIntExit函数是用来通知uC/OS-II已经结束了中断的操作。
OSIntEnter和OSIntExit是成对出现在os_core.c中的系统函数,用户的中断服务程序中应调用它们,按中断管理的思路来进行,才不会产生系统错误。
我们知道,uC/OS-II在每个时间片都要进行任务的调度。调度的结果或者是返回原来的任务继续执行,或者是因为找到了就绪的更高优先级的任务,而让该任务运行。这个时间片可以是10ms或者其他值。如果时间太长,高优先级的就绪任务可能等待时间过长,如果时间短,花费在操作系统调度上的时间就显得过长,系统的吞吐量就变小。
时钟中断服务是依赖于中断的,如果是单片机系统,那么就设置为定时器中断。用定时器中断的服务程序来完成该功能是恰当的。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

举报

沙发
ID:52318 发表于 2013-7-26 23:12 | 只看该作者
学习中
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表