前言
这篇文章是 LwIP应用笔记(二):无操作系统支持下的RAW API移植 的后续,以下所有内容都是建立在已经完成RAW API移植的前提下。本文可能不会太纠结于代码细节,因为本文的目标并不是演示移植过程中每一行代码该怎么写,而是希望在讲清大体框架的基础上,给出移植的主要流程,即在移植过程中,我们需要做什么事。
一、RTOS环境下的运行优势与劣势
在非RTOS环境下,用户程序是通过回调类接口,也就是RAW API与LwIP协议栈进行交互的。用户通过注册回调函数的方式告诉协议栈,当某些事件发生时需要做什么,可以理解为用户将自己所写的部分代码嵌入了协议栈的代码执行流程中,这样做会带来一个很大的问题,即用户注册的回调函数会影响协议栈的运行效率。设想这样一个场景,在非RTOS环境下,用户编写了若干个不同的网络功能模块,它们通过回调的方式与协议栈进行交互,现在假设用户注册了一个需要执行较长时间的回调函数,则每次协议栈执行到这个回调函数就都需要等待一个较长的时间去让回调执行完成,之后才能处理其他事务,注册这个回调函数的网络功能模块成功的以一已之力拖慢了整个网络协议栈以及其他网络功能模块的执行效率,不管其他网络功能模块写的多么高效,它们都必须受制于这个最慢的回调函数。所有发生的事情就如同下图所示。

同时我们也可以预见,随着网络功能模块注册的回调函数越来越多,协议栈需要耗费更多的时间去逐个处理回调函数。
解决上述问题的方法就是使用RTOS,通过将LwIP的协议栈与用户代码放置于不同的线程中执行,来规避用户代码拖慢协议栈执行的问题。用户代码和协议栈之间通过邮箱来进行数据传输。在RTOS环境下,LwIP提供NETCONN API以及类Socket API给用户使用,用户线程通过这两套API与协议栈线程进行交互。这样对于协议栈来说,它再也不用管何时去执行用户代码了,其只需要处理用户代码发送过来的数据,然后将需要用户代码处理的数据丢给对应的用户处理线程。如果很不幸有一个执行效率低下的用户线程,其可能会由于自身的低效丢失本该处理的数据,但是不会拖累其他的用户线程与协议栈本身的运行效率。用户代码和协议栈的关系此时如下所示。

但是我们也要注意到,在RTOS中用户程序和LwiP协议栈之间要借助邮箱等

:在RTOS环境下运行LwIP协议栈&spm=1001.2101.3001.5002&articleId=119850219&d=1&t=3&u=2a81213008b44602a81340d3c261f5ee)
1万+

被折叠的 条评论
为什么被折叠?



