解析UC/OS-II时钟中断技术
用户定义的时钟节拍外连函数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/OSII为例,分析了操作系统的中断机制和中断应满足的条件。介绍了μC/OSII系统时钟节拍,探讨了时钟中断函数中存在的不足,并且给出了解决方案,从而有效提高了中断响应速度和μC/OSII的时钟精确度。
- 在uclinux下实现拨号(04-21)
- 基于uClinux嵌入式系统的汽车黑匣子的设计(07-08)
- uClinux进程调度器的实现分析(04-13)
- 嵌入式操作系统uCLinux详解(03-19)
- 多任务操作系统Nucleus简介(04-21)
- UC/OS与uClinux的比较(04-21)