[技术问答]

路过学习系统时钟节拍与中断

[复制链接]
2615|7
手机看帖
扫描二维码
随时随地手机跟帖
niuyaliang|  楼主 | 2014-1-17 20:11 | 显示全部楼层 |阅读模式
本帖最后由 niuyaliang 于 2014-1-17 20:17 编辑

学习RTC时碰到一个名词叫做时钟节拍中断,因此产生了疑惑,现普及知识如下,以下知识均来自网络
中断与时钟节拍.pdf (94.34 KB)
niuyaliang|  楼主 | 2014-1-17 20:13 | 显示全部楼层
OSTimeTick实现时钟节拍中断服务子示意代码如下:   
void OSTickISR(void) {   
  保存处理器寄存器值;   
  OSIntEnter 或是将OSIntNesting加1;   
  OSTimeTick ;   
  OSIntExit ;   
  恢复处理器寄存器值;   
  执行中断返回指令;   
}

使用特权

评论回复
niuyaliang|  楼主 | 2014-1-17 20:16 | 显示全部楼层
μC/OSII时钟管理系统
  μC/OSII原有时钟管理系统类似于Linux但是比Linux简单得多它仅向用户提供个周期性信号OSTime时钟频率可以设置在10~100 Hz时钟硬件周期性地向CPU发出时钟中断系统周期性响应时钟中断每次时钟中断到来时中断处理更新个全局变量OSTimeμC/OSII时钟中断服务核心是OSTimeTick OSTimeTick 用来判断延时任务是否延时结束从而将其置于就绪态其伪代码如下:
void OSTimeTick(void) {   
 OSTimeTickHook;// 用户定义时钟节拍外连   
 while { (除空闲任务外所有任务)   
  OS_ENTER_CRITICAL;//关中断   
  对所有任务延时时间递减;   
  扫描时间到期任务并且唤醒该任务;   
  OS_EXIT_CRITICAL;//开中断   
  指针指向下个任务;   
  }   
  OSTime;//累计从开机以来时间   
}
  在μC/OSII时钟节拍中需要执行用户定义时钟节拍外连OSTimeTickHook 以及对任务链表进行扫描并且递减任务延时这样就造成了时钟节拍OSTimeTick 有两点不足:
  ① 在时钟中断中处理额外任务OSTimeIickHook 这样增加了中断处理负担影响了定时服务准确性;   
  ② 在关中断情况下扫描任务链表任务越多所需要时间越长而长时间关中断对中断响应有不利影响是中断处理应当避免

使用特权

评论回复
niuyaliang|  楼主 | 2014-1-17 20:17 | 显示全部楼层
针对上述OSTimeTick 不足之处需加以改进来优化时钟节拍在Linux中般对中断响应分为两部分:立即中断服务和底半中断处理(bottom half)立即中断服务仅仅做重要并且能快速完成工作而把不太重要需要较长时间完成工作放在底半处理部分来完成这样就可以提高中断响应速度μC/OSII不支持底半处理为了减轻时钟中断处理工作量来提高μC/OSII时钟精确度可以将部分在每次时钟中断需处理工作内容放在任务级来完成这样就可以减少每次时钟中断处理CPU消耗从而提高中断响应速度和μC/OSII时钟精确度为此定义任务OSTimeTask 由它来处理原来在OSTimeTick中需要处理操作μC/OSII采用基于优先级抢占式调度策略而每次时钟中断处理结束后需要首先调度该任务执行因此让任务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){   
  关中断;   
  唤醒任务;   
  开中断;   
  指针指向下个任务;   
  }   
}  

使用特权

评论回复
shuidi_wangdan| | 2014-1-18 08:13 | 显示全部楼层
好东西!支持!

使用特权

评论回复
dong00520| | 2014-1-18 10:35 | 显示全部楼层
好资料!

使用特权

评论回复
从小木丁丁| | 2014-1-18 15:01 | 显示全部楼层
节拍是个好东西,就是有的时候不大准

使用特权

评论回复
zxf0168| | 2014-2-6 19:24 | 显示全部楼层
好资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝