Lwip基于FreeRTOS的运行机制

1.从tcpip_init()开始,首先创建一个超时处理函数、一个消息邮箱和一个内核线程tcpip_thread(),超时处理函数中,超时的任务由内核线程处理

2.添加网卡netif_add(),输入IP地址,网关,子码掩码等。随后进行底层初始化low_lecel_init(),初始化硬件(此部分较难,新手不必关注)。接着创建一个信号量,随后创建一个接收线程ethernetif_input(),使程序进入阻塞。

3.当接收到数据包时,会调用以太网的中断函数ETH_IRQHandler(),该函数会释放信号量,继续执行后续的读取数据。如果接收到数据,会调用tcpip_input()将数据封装好后传递给队列,发回给tcpip_thread()线程。

4.内核线程接收到队列的消息后,会分析接收到的数据类型,进行数据传递。

此处以IPv4为例,如果消息队列中接收到的是IPv4类型的消息,会按照上述流程进行处理。首先会判断ip地址是否为空,如果为空走左边线路,添加包头。如果不为空,会执行发送操作。

回到内核线程cpip_thread(),该线程的处理机制如下:

首先判断是否有超时任务需要处理,如果没有就去消息队列看一眼有没有消息需要处理,此时等待时间是0,看完直接结束。

如果有超时任务需要处理,则去处理超时任务,在处理超时任务之前,会判断此时超时任务是否已经到达触发时间,即sleeptime是否已经为0。如果已经为0则处理超时事件,并回到源头。如果不为0,则去消息队列等待需要执行的任务,此时是阻塞的等待,等待的时间是下一次超时任务的超时时间即sleeptime,在此时间之前会处理队列中的消息,到达时间了就回去处理超时事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值