1、数据结构表示
超时定时器是按单链表结构进行组织的,链表按超时的时间从小到大进行排序,list的头指向超时时间最小的节点
2、数据结构的维护(增删改查)
2.1新定时器的插入(生产者调用该接口)
通过下面接口向队列中插入新的定时器
void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg);
2.2 超时的检测(消费者调用该接口)
通过sys_check_timeouts()接口检测是否有超时的定时器,裸机应用程序在外部周期性调用该函数,每次进来检查定时器链表上定时最短的定时器是否到期,因为链表是有序的,头指针指向的节点即为时间最短的定时器。如果没有到期的定时器,直接退出该函数,否则,执行该定时器回调函数,并从链表上删除该定时器,然后继续检查下一个定时器,直到没有一个定时器到期退出
2.3 队列的初始化
周期定时器节点表示
周期定时器数组
调用void sys_timeouts_init(void)接口初始化lwip_cyclic_timers数组,这里需要注意的是超时处理函数lwip_cyclic_timer,该接口在定时器超时的时候会被调用,而且它通过调用自身(第258行)将新的超时定时器加入链表,从而实现周期定时器功能。