
已解决问题
谷歌puitx7m0jxi6用户在2012.12.18提交了关于“倪虹洁ISR是什么意思”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-03T03:58:17。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
ucOS
1系统中断与时钟节拍
1.1系统
中断是一种硬件机制,用于通知
中
1.2系统时钟节拍
时钟
保存处理器寄存器的值;
调用OSIntEnter(
调用OSTimeT
调用
恢复处理器寄存器的值;
执行中
}
2时钟管理系统
2.1ucosii时钟管理系统
voidOSTimeTick(void){
OSTimeTickh**ook();//调用用户定义的时钟节拍外连函数
while{(除空闲任务外的所有任务)
OS_ENTER_CRITICAL();//关中断
对所有任务的延时时间递减;
扫描时间到期的任务,并且唤醒该任务;
OS_EXIT_CRITICAL();//开中断
指针指向下一个任务;
}
OSTime++;//累计从开机以来的时间
}
在ucosii的时钟节拍函数中,需要执行用户定义的时钟节拍外连函数OSTimeTickh**ook(),以及对任务链表进行扫描并且递减任务的延时。这样就造成了时钟节拍函数OSTimeTick()有两点不
足:
①在时钟中断中处理额外的任务OSTimeIickh**ook(),这样增加了中断处理的负担,影响了定时服务的准确性;②在关中断情况下扫描任务链表,任务越多所需要时间越长,而长时间关中断对中断响应有不利影响,是中断处理应当避免的。
2.2改进的时钟管理系统
针对上述OSTimeTick()的不足之处,需加以改进来优化时钟节拍函数。在Li**x中一般对中断的响应分为两部分:立即中断服务和底半中断处理(bottomhalf)。立即中断服务仅仅做重要的并且能快速完成的工作,而把不太重要的需要较长时间完成的工作放在底半处理部分来完成,这样就可以提高中断响应速度。
ucosii不支持底半处理,为了减轻时钟中断处理程序的工作量来提高ucosii的时钟精确度,可以将一部分在每次时钟中断需处理的工作内容放在任务级来完成。这样就可以减少每次时钟中断处理的CPU消耗,从而提高中断响应速度和ucosii的时钟精确度。为此,定义任务OSTimeTask(),由它来处理原来在OSTimeTick()中需要处理的操作。因为%26mu;C/OSII采用基于优先级的抢占式调度策略,而每次时钟中断处理程序结束后需要首先调度该任务执行,因此让任务OSTimeTask()具有系统内最高优先级。由它执行用户定义的时钟节拍外连函数OSTimeTickh**ook(),以及对所有任务的延时时间进行递减,并把到期的任务链入到链表OSTCBRList中,OSTCBRList管理所有到期任务。OSTimeTask()函数伪代码如下:
voidOSTimeTask(){
OSTimeTickh**ook()//用户定义的时间处理函数
while{(除空闲任务外的所有任务)
对所有任务的延时时间进行递减;
把所有要到期的任务链入到OSTCBRList链表中;
}
任务状态改为睡矛调用OSSched()进行任务调度;
}
在任务OSTimeTask()中,执行原来在时钟中断处理的用户函数OSTimeIickh**ook(),并实现将延时到期的任务链入到OSTCBRList链表中,这样在时钟中断程序中就只需要扫描任务到期的链表而不需要扫描整个链表,减少了关中断的时间。OSTCBRList为新建链表,它管理所有到期的任务。
同时,需要减少OSTimeTick()的执行工作量,只对OSTCBRList链表扫描,这样也减少了关中断时间。OSTimeTick()伪代码如下:
voidOSTimeTick(void){
OSTime++;
OS_TCB*ptcb=OSTCBList;//OSTCBRList指向所有到期任务的链表
while(ptchb!=**ll){
关中断;
唤醒任务;
开中断;
指针指向下一个任务;
}
}
3小结
本文以开源的嵌入式操作系统ucosii为例,分析了操作系统的中断机制和中断应满足的条件。介绍了ucosii系统时钟节拍,探讨了时钟中断函数中存在的不足,并且给出了解决方案,从而有效提高了中断响应速度和ucosii的时钟精确度。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/**nshe999/archive/2008/03/11/2171484.aspx