static struct sys_timeo *next_timeout; #define LWIP_MAX_TIMEOUT 0x7fffffff #define TIME_LESS_THAN(t, compare_to) ( (((u32_t)((t)-(compare_to))) > LWIP_MAX_TIMEOUT) ? 1 : 0 ) static void sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg) { struct...
sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg) #endif { struct sys_timeo *timeout, *t; timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); if (timeout == NULL) { LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty...
通过sys_timeout来进行处理,其中有超时时间,超时回调函数以及lwip_cyclic_timers[i]的地址;sys_timeout会在系统节拍的基础上,加上超时时间得到下一次的超时时间;sys_timeout中,计算得到next_timeout_time(即下一次的超时时间),就会调用sys_timeout_abs函数;该函数中会申请一个sys_timeo的结构体,然后对这个结构体...
超时事件插入超时链表sys_timeout_abs():static void #if LWIP_DEBUG_TIMERNAMES sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name) #else /* LWIP_DEBUG_TIMERNAMES */ sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *...
通过sys_timeout->sys_timeout_abs动态创建定时器,定时器的绝对时间自动会在now基础上增加间隔(u32_t)(sys_now() + msecs); 这里i = (LWIP_TCP ? 1 : 0),如果有LWIP_TCP则从1开始, 0的TCP定时器单独处理,因为它不需要总是运行,没有tcp连接就不需要该定时器了,所以手动调用tcp_timer_needed()处理。
在LWIP协议栈初始化时,也需要注册一些超时事件,通过调用sys_timeout函数,该函数中又会调用sys_timeout_abs函数。在sys_timeout_abs函数中会计算出超时事件即将超时的时间,并且根据超时时间将这些超时事件连接成一个链表,如下图所示。当超时发生时就会调用对应的处理函数。SDK中会把需要注册的超时事件都放在一个...
在sys_timeout_abs()中,会处理如上所提的三个形参。这个函数就是上面所说的串串串的过程,系统会创建一个链表节点,并按顺序把他们穿起来,而表头就是之前所提的全局变量next_timeout。 需要注意的是next_timeout类型就是sys_timeo。这个结构体就是用于系统处理的节点类型,它包含指向下一个节点的指针、绝对超时时...
在sys_timeout_abs函数中会计算出超时事件即将超时的时间,并且根据超时时间将这些超时事件连接成一个链表,如下图所示。当超时发生时就会调用对应的处理函数。 SDK中会把需要注册的超时事件都放在一个数组中,在初始化时调用注册函数去一个个注册这些超时事件。超时事件数组如下图所示。
sys_timeout_abs函数会精准地计算出每个超时事件即将到期的时间,并根据这些时间将事件有序地链接成一个链表。一旦超时事件触发,相应的处理函数就会被调用。在SDK中,所有需要注册的超时事件都会被集中存放在一个数组中。在LWIP协议栈的初始化过程中,会逐一调用注册函数来将这些超时事件进行注册。这个超时事件数组的...
每个sys_timeo结构体中的h成员变量记录着对应的超时回调函数,对于周期性的回调函数, LwIP是这样子处理的:在初始化的时候将他们注册到 lwip_cyclic_timer()函数中,每次在处理回调函数之后,就调用sys_timeout_abs()函数将其重新注册到超时链表中,具体见 代码清单9_5。 代码清单 9‑5 lwip_cyclic_timer()源码(...