前言
有了前边添加 win(MINGW) 平台下 tcp transport 的经验,现在添加 lwip 的就容易很多了。
lwip 的接口和 linux 下的相似度极高,可以这么认为,除了名字不一样,其它的特性都一样。
所以,添加 lwip 支持就轻车熟路,手拿把掐了。
扩展过程
“erpc_tcp_transport.h” 添加 RTTHREAD 环境适配
#if defined(linux) || defined(CYGWIN) || defined(RTTHREAD)
#elif defined(MINGW32)
#include <winsock2.h>
#endif
修改 m_socket 成员变量类型
#if defined(linux) || defined(CYGWIN) || defined(RTTHREAD)
int m_socket; /*!< Socket number. */
#elif defined(MINGW32)
SOCKET m_socket; /*!< Socket number. */
#endif
“erpc_tcp_transport.cpp” 添加 lwip 头文件引用
#if defined(RTTHREAD)
#include "lwip/netifapi.h"
#include "lwip/sockets.h"
#include "lwip/tcpip.h"
#include "lwip/netdb.h"
socket api
在所有使用到的 socket api 前追加 “lwip_” 前缀。例如:
getaddrinfo 变成 lwip_getaddrinfo,socket 变成 lwip_socket 等诸如此类。
其它
还有 snprintf 变成 rt_snprintf,memset 变成 rt_memset 等
验证
有没有发现,我们可以在设备上跑 eRPC了。
到目前为止,我们已经添加了 rt-thread 的 porting。添加了 win 系统的 winsock2 tcp transport 支持。已经具备了在 rt-thread 系统移植 eRPC 并验证的所有基础条件。
在 rt-thread 移植 eRPC 系列(三) 之 Porting 笔者放了两个演示效果图,也正是因为有 rt-thread 移植 eRPC 系列(三) 之 Porting rt-thread 移植 eRPC 之 Transport (winsock2) 以及本篇三篇文章的基础工作才实现的。
结束语
因为有前一篇的工作,本次增加 lwip 支持的说明就一带而过了。
rt-thread 是支持 POSIX 的,如果直接使用 POSIX 接口,可能改动更小,但是为啥笔者特意用 lwip ?很简单,奥卡姆剃刀。引入 POSIX 是在可实现的基础上增加新的实体,但并未引入新的特性。所以,本着降低系统维度的原则,先不使用 POSIX。这样一来,不止 rt-thread 标准版可以使用,nano 版也可以使用。
声明:rt-thread 有 posix 接口,开启 posix 之后就可以和用 linux 一样的 api。但是,笔者在使用过程中发现创建的 tcp server 只能连接上,但是给它发数据它什么都没收到。于是,暂时搁置了。退而求其次,使用 lwip api。不过,话说回来,lwip 可以实现的有什么必要的理由再添加几层马甲才能使用?
后面的工作预告:虽然使用 lwip 可以在更大范围的系统上使用 eRPC ,但是并不是每个芯片都有 MAC ,并不是每一个板子上都有网卡,普遍地,串口还是支持蛮多的。所以,串口的 transport 还是有必要说两句的。
第二个就是,基于 eRPC 实现的 lvgl 在线设计器,敬请期待。
原作者:出出啊
更多回帖