os_tmr.c

回调函数 OS_TMR_CALLBACK_PTR在OS_TmrTask的上下文中执行,执行时调度器锁状态,在回调函数中需要确保不要有阻塞操作,并且要确保OS_TmrTask的堆栈不要溢出。

typedef  void                      (* OS_TMR_CALLBACK_PTR)(void *p_tmr, void *p_arg);
typedef  struct  os_tmr               OS_TMR;
typedef  struct  os_tmr_spoke         OS_TMR_SPOKE;


struct  os_tmr {
    OS_OBJ_TYPE          Type;
    CPU_CHAR            *NamePtr;                           /* Name to give the timer                                 */
    OS_TMR_CALLBACK_PTR  CallbackPtr;                       /* Function to call when timer expires                    */
    void                *CallbackPtrArg;                    /* Argument to pass to function when timer expires        */
    OS_TMR              *NextPtr;                           /* Double link list pointers                              */
    OS_TMR              *PrevPtr;
    OS_TICK              Match;                             /* Timer expires when OSTmrTickCtr matches this value     */
    OS_TICK              Remain;                            /* Amount of time remaining before timer expires          */
    OS_TICK              Dly;                               /* Delay before start of repeat                           */
    OS_TICK              Period;                            /* Period to repeat timer                                 */
    OS_OPT               Opt;                               /* Options (see OS_OPT_TMR_xxx)                           */
    OS_STATE             State;
#if OS_CFG_DBG_EN > 0u
    OS_TMR              *DbgPrevPtr;
    OS_TMR              *DbgNextPtr;
#endif
};



struct  os_tmr_spoke {
    OS_TMR              *FirstPtr;                          /* Pointer to first timer in linked list                  */
    OS_OBJ_QTY           NbrEntries;
    OS_OBJ_QTY           NbrEntriesMax;
};



void  OSTmrCreate (OS_TMR               *p_tmr,
                   CPU_CHAR             *p_name,
                   OS_TICK               dly,
                   OS_TICK               period,
                   OS_OPT                opt,
                   OS_TMR_CALLBACK_PTR   p_callback,
                   void                 *p_callback_arg,
                   OS_ERR               *p_err):
    创建一个定时器。
     OS_OPT_TMR_ONE_SHOT:只执行一次
     OS_OPT_TMR_PERIODIC:循环执行
    


CPU_BOOLEAN  OSTmrDel (OS_TMR  *p_tmr,
                       OS_ERR  *p_err):
    删除一个定时器。操作时锁调度器。个人感觉这个函数不大会被用到。
    判断 p_tmr->State:
    当 OS_TMR_STATE_RUNNING:从spoke对应的定时器链表中删除,清空p_tmr的参数,解锁调度器。
    当 OS_TMR_STATE_STOPPED、 OS_TMR_STATE_COMPLETED :清空p_tmr的参数,解锁调度器。
    当 OS_TMR_STATE_UNUSED: 不允许删除,返回错误代码。

OS_TICK  OSTmrRemainGet (OS_TMR  *p_tmr,
                         OS_ERR  *p_err):
    获取定时器还有多长时间超时。
     判断 p_tmr->State:
    当 OS_TMR_STATE_RUNNING: p_tmr->Remain = p_tmr->Match  - OSTmrTickCtr; ,解锁调度器。
    当 OS_TMR_STATE_STOPPED:(定时器还没有启动)根据p_tmr是否是周期的返回remain,解锁调度器。
    当 OS_TMR_STATE_UNUSEDOS_TMR_STATE_COMPLETED remain = 0,返回错误代码。

CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,
                         OS_ERR  *p_err):
    启动定时器,可以在定时器过程中,重新开始。
    判断p_tmr->State:
    当 OS_TMR_STATE_RUNNING:将p_tmr从spoke对应的定时器链表中删除,重新添加spoke对应的定时器链表中 ,解锁调度器。
    当 OS_TMR_STATE_STOPPEDOS_TMR_STATE_COMPLETED:将p_tmr添加spoke对应的定时器链表中,解锁调度器。
    当 OS_TMR_STATE_UNUSED:Tmr没有被创建 ,返回错误代码。
    

OS_STATE  OSTmrStateGet (OS_TMR  *p_tmr,
                         OS_ERR  *p_err):
    获取当前定时器的状态。

CPU_BOOLEAN  OSTmrStop (OS_TMR  *p_tmr,
                        OS_OPT   opt,
                        void    *p_callback_arg,
                        OS_ERR  *p_err):
    停止定时器。
    判断p_tmr->State:
    当 OS_TMR_STATE_RUNNING:将p_tmr从spoke对应的定时器链表中删除,根据opt参数调用回调函数 ,解锁调度器。
    当 OS_TMR_STATE_STOPPEDOS_TMR_STATE_COMPLETED:已经停止,解锁调度器。
    当 OS_TMR_STATE_UNUSED:Tmr没有被创建 ,返回错误代码。


void  OS_TmrClr (OS_TMR  *p_tmr):
    清空p_tmr结构体内的参数。在 OSTmrDel()中调用。

void  OS_TmrInit (OS_ERR  *p_err):
    初始化定时器模块,OSInit()调用,初始化定时器列表如下图,创建定时器任务。



void  OS_TmrLink (OS_TMR  *p_tmr,
                  OS_OPT   opt):
    将p_tmr插入到spoke对应的定时器链表。计算p_tmr->Remain,计算spoke,将p_tmr按照Remain升序的顺序插入到spoke对应的定时器链表中。
    


void  OS_TmrResetPeak (void):
    跟踪当前spoke最大的个数。在OSStatReset()中调用。
    

void  OS_TmrUnlink (OS_TMR  *p_tmr):
    将p_tmr从spoke对应的定时器链表中删除,更新p_tmr->State、NextPtr、PrevPtr,p_spoke->NbrEntries

void  OS_TmrTask (void  *p_arg):
    OS内部函数,管理定时器。
    等待tick ISR信号(Sem,在OSTimeTick中发出), OSTmrTickCtr++;,遍历spoke对应的定时器链表,如果 OSTmrTickCtr==p_tmr->Match,从链表中删除p_tmr,如果周期的则插入到新的spoke中,调用回调函数。
    回调函数在OS_TmrTask的上下文中执行,执行时调度器锁状态,在回调函数中需要确保不要有阻塞操作,并且要确保OS_TmrTask的堆栈不要溢出。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值