ucos源码阅读2——中断和时钟

ucos源码阅读2——中断和时钟

  • 中断
  • 时钟(定时器中断)
  • 时间管理(os_time.c)
    • OSTimeDly()
    • OSTimeHMSM()
    • OSTimeHMSM()
    • OSTimeGet和OSTimeSet()
  • 总结

中断

硬件怎么实现系统所要实现的嵌套功能
中断这儿有OSIntExitY,tcb成员变量,为什么任务调度里要定义局部变量?
中断嵌套和任务调度锁嵌套为零时,和任务调度一样,发生任务调度,这儿是中断级任务调度?两个汇编函数区别呢?
整个中断流程:
发生中断,转入中断矢量入口单元,然后有一条长跳转指令,中断服务子程序,先关中断,保存CPU寄存器的值给当前TCB的任务栈(嵌套的中断呢?),调用OSIntEnter()函数或直接给OSIntNesting加一,开中断,执行中断程序或进行中断嵌套,然后调用OSIntExit()函数,有可能切换到新任务,被中断的任务和被中断的中断,被中断的中断保存在哪儿?中断嵌套的汇编方法还不懂。后两者还要关中断恢复寄存器开中断,执行中断返回指令。
已经有三个关于任务切换的汇编了,区别是啥呢。。。
ucos源码阅读2——中断和时钟_第1张图片
ucos源码阅读2——中断和时钟_第2张图片

时钟(定时器中断)

时钟节拍中断服务子程序OSTickISR和上述中断过程一样,真正执行中断代码是调用OSTimeTick(),OSTime加一,OSTCBDly如果等于零,遍历下一个,不为零就减一,如果减一之后等于零,此时任务状态没有挂起,就把任务置为就绪态,也就是修改置位值和表,如果还在挂起状态就置一。
ucos源码阅读2——中断和时钟_第3张图片

时间管理(os_time.c)

OSTimeDly()

除了空闲任务,其他所有的任务都要在合适的时候调用系统服务函数自我挂起,与suspend与否无关,与任务就绪与否无关
ucos源码阅读2——中断和时钟_第4张图片

OSTimeHMSM()

内部调用上面那个函数,ticks最低为一,所以要加零点五,还有为什么整除65536分成32768两次延迟。第一次延时完了调度出去,定时完了他就就绪态,啥时候执行下一个延时?除非这任务优先级高中断任务切换回来,这函数大数值也要慎用。。。
ucos源码阅读2——中断和时钟_第5张图片

OSTimeHMSM()

强制清零,如果任务没有挂起就转入就绪态,引发调度。
ucos源码阅读2——中断和时钟_第6张图片

OSTimeGet和OSTimeSet()

ucos源码阅读2——中断和时钟_第7张图片

总结

中断的时候两个嵌套变量均为零的时候引发中断调度
时钟每次都能引发中断任务切换???如果两个变量为零的话
两个延时函数挂起自己也要任务调度
取消延时函数也要调度

你可能感兴趣的:(ucos源码阅读2——中断和时钟)