ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
LwIP也是一个内核,与操作系统一样,也是由时基驱动的,LwIP作者为了能让内核正常运行,也引入了一个时钟来驱动,这样子可以处理内核中各种定时事件,如ARP定时、TCP定时等,LwIP已经实现处理超时(定时)事件的函数sys\_check\_timeouts(),具体怎么处理的就无需用户关心。由于时钟的来源是由用户提供的,这就需要用户实现一个sys\_now()函数来获取系统的时钟,以毫秒为单位,LwIP通过两次获取的时间就能判断是否有超时,从而让内核去处理对应的事件。 我们在STM32中,一般采用SysTick作为LwIP的时基定时器,将SysTick产生中断的频率设置为1000HZ,也就是1ms触发一次中断,每次产生中断的时候,系统变量就会加1,当然,在HAL库中已经实现了获取系统时间的函数HAL\_GetTick(),那么很简单,我们在sys\_now()函数中直接返回HAL\_GetTick()函数得到的值即可,具体见。但是有个问题,如果SysTick的频率不是1000HZ,那就需要将HAL\_GetTick()函数得到的值转换为时间(ms),这就由用户自己实现即可,这也是很简单的,当我们使用操作系统的时候,就直接可以转换了使用操作系统的宏进行tick与ms的转换了,在后续讲解。 ``` 1 u32_t sys_now(void) 2 { 3 return HAL_GetTick(); 4 } 5 6 7 void SysTick_Handler(void) 8 { 9 HAL_IncTick(); 10 } ```