MCU小型调度OS之二:定时器

一、结构体类型:

       

       如上图所示,timer_list就是定时器的结构体,其中timer_id是定时器ID;enable是该定时器是否启动;expires是定时时间长度,function是定时器超时函数,p_arg是定时器传参数;next是下一个定时器节点。

二、硬定时器:

       定时器分为硬定时器和软定时器,区别为:

       1、硬定时器超时直接执行,无需等待,超时函数内不能阻塞,一般都只是修改状态变量等;

       2、软定时器在主任务创建一个队列,定时器超时后写入队列,队列分别执行定时器超时处理函数; 

       初始化:

       

      初始化硬定时器,建立一个链表,链表头是TimerHead,初始化完一系列硬定时器后,开启1ms一次ticket定时中断的定时器,在超时中断里进行定时器调度。     

       定时器使用:

       

       如上图,开启定时器,停止定时器,都是根据TimerId来确认对哪个定时器节点操作,enable代表停止和关闭,expires就是定时周期时间。

       定时调度:

       

       如上图,在1ms一次定时中断处理函数里,对提前注册好的定时器节点依次访问,如果使能过后,对时间expires--,如果到时间的话执行中断处理函数。

       

二、软定时器:

      软定时器跟硬定时器不同的地方在于:在主任务创建一个队列,定时器超时后写入队列,队列分别执行定时器超时处理函数。

      优点是即使阻塞也不会占用中断,造成大规模影响,缺点是相应不够实时。

      初始化:

      

      如上图,App_Timer_Create初始化软定时器,所有的软定时器都是依赖于硬定时器来操作,软定时器的硬定时超时函数都是同一个,SoftTimerCallBack,该超时函数里就一个操作,把pTimer参数以队列的形式传送到timer_sched_Queue里面,该队列在开始的时候也初始化了(队列的实现以及具体细节下面章节会详解解释),具体实现如下:

      

      

      上面说的在定时中断里面向队列写入pTimer参数,该参数是个结构体,里面有两个内容,一个函数handler,一个参数data,从而实现软定时的功能,通常系统内部定时任务以及实时性高、处理短的定时器用硬定时,普通业务都用软定时。

      

二、任务定时器:

       

       在初始化任务的时候,每个任务下面都会挂个定时器的节点,其实这个定时器做的主要功能就是为了处理每个任务的信号量超时、队列超时、定时唤醒能业务功能,因为系统调用实时性要求高,因此使用硬定时器,下面章节会详解分析。

       调度系统下载链接如下: https://download.csdn.net/download/moonlinux20704/12073629

猜你喜欢

转载自blog.csdn.net/moonlinux20704/article/details/103927505
今日推荐