老古开发网首页
导航:老古开发网首页文章索引索引第833页文章分类经验总结第2页→[μC/OS-II中的时钟中断技术研究]
| -文章搜索 - 最新文章 - |

第3324篇:μC/OS-II中的时钟中断技术研究

发布时间:2005年5月15日 点击次数:705
来源:   作者:武汉理工大学 王原丽 吕永江
 

1  系统中断与时钟节拍

1.1  系统中断

  中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被系统识别,CPU则保存部分(或全部)现场(context),即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后执行任务调度,程序回到就绪态优先级最高的任务开始运行(对于可剥夺型内核)。

  中断使得CPU可以在事件发生时才予以处理,而不必让微处理器连续不断地查询(polling)是否有事件发生。通过两条特殊指令:关中断(disable interrupt)和开中断(enable interrupt)可以让微处理器不响应或响应中断。在实时环境中,关中断的时间应尽量的短,关中断影响中断响应时间,关中断时间太长可能会引起中断丢失。中断服务的处理时间应该尽可能的短,中断服务所做的事情应该尽可能的少,应把大部分工作留给任务去做。

1.2  系统时钟节拍

  时钟节拍是特定的周期性中断(时钟中断),这个中断可以看作是系统心脏的脉动。操作系统通过时钟中断来确定时间间隔,实现时间的延时及确定任务超时。中断之间的时间间隔取决于不同的应用,一般在10~200 ms之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时提供等待超时的依据。时钟节拍频率越快,系统的额外开销就越大。系统定义了32位无符号整数OSTime来记录系统启动后时钟滴答的数目。用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后。μC/OS-II中的时钟节拍服务是通过在中断服务子程序中调用OSTimeTick()实现的。时钟节拍中断服务子程序的示意代码如下:

void OSTickISR(void) {
  保存处理器寄存器的值;
  调用OSIntEnter ()或是将OSIntNesting加1;
  调用OSTimeTick ();
  调用OSIntExit ();
  恢复处理器寄存器的值;
  执行中断返回指令;
}

2  时钟管理系统

2.1  μC/OS-II时钟管理系统

  μC/OS-II原有的时钟管理系统类似于Linux,但是比Linux简单得多。它仅向用户提供一个周期性的信号OSTime,时钟频率可以设置在10~100 Hz,时钟硬件周期性地向CPU发出时钟中断,系统周期性响应时钟中断,每次时钟中断到来时,中断处理程序更新一个全局变量OSTime。μC/OS-II时钟中断服务程序的核心是调用OSTimeTick ()函数。OSTimeTick ()函数用来判断延时任务是否延时结束从而将其置于就绪态。其程序伪代码如下:

void OSTimeTick(void) {
  OSTimeTickHook();// 调用用户定义的时钟节拍外连函数
  while { (除空闲任务外的所有任务)
    OS_ENTER_CRITICAL();//关中断
    对所有任务的延时时间递减;
    扫描时间到期的任务,并且唤醒该任务;
    OS_EXIT_CRITICAL();//开中断
    指针指向下一个任务;
    }
    OSTime++;//累计从开机以来的时间
}

  在μC/OS-II的时钟节拍函数中,需要执行用户定义的时钟节拍外连函数OSTimeTickHook (),以及对任务链表进行扫描并且递减任务的延时。这样就造成了时钟节拍函数OSTimeTick ()有两点不
足:

  ①  在时钟中断中处理额外的任务OSTimeIickHook (),这样增加了中断处理的负担,影响了定时服务的准确性;

  ②  在关中断情况下扫描任务链表,任务越多所需要时间越长,而长时间关中断对中断响应有不利影响,是中断处理应当避免的。

2.2  改进的时钟管理系统

  针对上述OSTimeTick ()的不足之处,需加以改进来优化时钟节拍函数。在Linux中一般对中断的响应分为两部分:立即中断服务和底半中断处理(bottom half)。立即中断服务仅仅做重要的并且能快速完成的工作,而把不太重要的需要较长时间完成的工作放在底半处理部分来完成,这样就可以提高中断响应速度。

  μC/OS-II不支持底半处理,为了减轻时钟中断处理程序的工作量来提高μC/OS-II的时钟精确度,可以将一部分在每次时钟中断需处理的工作内容放在任务级来完成。这样就可以减少每次时钟中断处理的CPU消耗,从而提高中断响应速度和μC/OS-II的时钟精确度。为此,定义任务OSTimeTask (),由它来处理原来在OSTimeTick()中需要处理的操作。因为μC/OS-II采用基于优先级的抢占式调度策略,而每次时钟中断处理程序结束后需要首先调度该任务执行,因此让任务OSTimeTask()具有系统内最高优先级。由它执行用户定义的时钟节拍外连函数OSTimeTickHook (),以及对所有任务的延时时间进行递减,并把到期的任务链入到链表OSTCBRList中,OSTCBRList管理所有到期任务。OSTimeTask()函数伪代码如下:

void OSTimeTask() {
  OSTimeTickHook()//用户定义的时间处理函数
  while { (除空闲任务外的所有任务)
    对所有任务的延时时间进行递减;
    把所有要到期的任务链入到OSTCBRList链表中;
}
    任务状态改为睡眠,调用OSSched ()进行任务调度;
}

  在任务OSTimeTask()中,执行原来在时钟中断处理的用户函数OSTimeIickHook (),并实现将延时到期的任务链入到OSTCBRList链表中,这样在时钟中断程序中就只需要扫描任务到期的链表而不需要扫描整个链表,减少了关中断的时间。OSTCBRList为新建链表,它管理所有到期的任务。

  同时,需要减少OSTimeTick ()的执行工作量,只对OSTCBRList链表扫描,这样也减少了关中断时间。OSTimeTick ()伪代码如下:

void OSTimeTick(void) {
OSTime++;
OS_TCB* ptcb=OSTCBList;// OSTCBRList指向所有到期任务的链表
while(ptchb!=null){
  关中断;
  唤醒任务;
  开中断;
  指针指向下一个任务;
  }
}

3  小结

  本文以开源的嵌入式操作系统μC/OS-II为例,分析了操作系统的中断机制和中断应满足的条件。介绍了μC/OS-II系统时钟节拍,探讨了时钟中断函数中存在的不足,并且给出了解决方案,从而有效提高了中断响应速度和μC/OS-II的时钟精确度。

参考文献

1  Labrosse Jean J. 嵌入式实时操作系统μC/OSII.邵贝贝译. 北京:北京航空航天大学出版社,2003
2  吴君钦.ARM嵌入式系统中断向量表的动态配置.单片机与嵌入式系统应用,2004(12)
3  刘岚,张凯.ARM7嵌入式系统的中断设计与中断处理优化.武汉理工大学学报,2004(4)
4  沈绪榜.2001嵌入式系统及单片机国际学术交流会论文集.北京:北京航空航天大学出版社,2001
5  Stanly B. Lippman, Josee Lajoie. C++ Primer. Third Edition. Addison Wesley
6  Liunx Kernel Archives. http://www.kernel.org


欢迎进入老古论坛进行讨论
[经验总结] 相关文章:
8051单片机在线升级软件的方法
简介:
  本文通过对8051单片机的特点分析,提出了一种低成本的方法,使其软件可以利用系统已有的通信链路在线升级。 1 基本原理   类似于其他引导装载升级程序的方法,在系统中必须始终存在一段用于程序装载的代码(bootloader),该代码在启动时被运行。其基本功能是根据外部条件来判断是运行现有版本的程序还是从主机下载新程序。8051具有选择执行片内或者片外程序的功能,而对片内E2PROM编程过程相对比较复杂,因此这里将程序引导装载代码烧结在内部程序空间中,并不准备改变;而......

Small RTOS51中消息队列的一处隐患
P89LPC922自编ISP代码的研究
μC/OS-II任务创建和销毁的用户接口改善
PIC单片机引脚中断程序的设计技巧
 
下一个:[新闻热点]2005年德州仪器中国区DSP设计大奖赛拉开帷幕
简介:
日前,由德州仪器(TI)主办、上海交通大学协办的“2005年德州仪器DSP 大奖赛”正式拉开序幕。该大奖赛旨在促进中国大学生掌握先进数字信号处理(DSP)系统设计技术的同时,激励工程专业的学生在通信与娱乐时代来临的今天利用TI的 DSP产品进行创新性的开发和设计,并且培养了大学生的协作精神和理论联系实际的学风,促进了校际之间在DSP系统科研与教学上的交流。 从2005年4月1日起,TI已开始接受参赛队报名,参赛队可通过TI中文网站下载报名表格,并于2005年6月31日之前,提交参赛......

上一个:[新闻热点]安捷伦推出测试与测量技术认证

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:47毫秒