UCOSII中软件定时器的实现方法是,将定时器按定时时 间分组,使得每次时钟节拍到来时只对部分定时器进行比较操作,缩短了每次处理的时间。但这就需要动态地维护一个定时器组。定时器组的维护只是在每次定时器到时时才发生,而且定时器从组中移除和再插入操作不需要排序。这是一种比较高效的算法,减少了维护所需的操作时间。 【软件定时器数据结构】- //定时器基本结构
- typedef struct os_tmr
- {
- INT8U OSTmrType;
- OS_TMR_CALLBACK OSTmrCallback;
- void *OSTmrCallbackArg;
- /* */void *OSTmrNext;/* Double link list pointers */
- /* */void *OSTmrPrev;</b>
- INT32U OSTmrMatch;
- INT32U OSTmrDly;
- INT32U OSTmrPeriod;
- #if OS_TMR_CFG_NAME_EN > 0u
- INT8U *OSTmrName;
- #endif
- INT8U OSTmrOpt;
- INT8U OSTmrState;
- } OS_TMR;
- //定时器轮
- typedef struct os_tmr_wheel
- {
- /* */OS_TMR *OSTmrFirst;/* Pointer to first timer in linked list */
- INT16U OSTmrEntries;</b>
- } OS_TMR_WHEEL;
UCOSII软件定时器实现了3类链表的维护: 【三类链表实体数据】 - /* */OS_EXT OS_TMR OSTmrTbl[OS_TMR_CFG_MAX]; /* timer表-实体数据-用来被分配-不需要malloc */
- /* */OS_EXT OS_TMR *OSTmrFreeList; /* 空闲时间块结构链表头 */
- /* */OS_EXT OS_TMR_WHEEL OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]; //timer 轮结构
|