多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
从前面的章节,我们知道消息有多种类型,LwIP中消息是有多种结构的的,对于不同的消息类型其封装是不一样的,tcpip\_thread线程是通过tcpip\_msg描述消息的,tcpip\_thread线程接收到消息后,根据消息的类型进行不同的处理。LwIP中使用tcpip\_msg\_type枚举类型定义了系统中可能出现的消息的类型,消息结构msg字段是一个共用体,其中定义了各种消息类型的具体内容,每种类型的消息对应了共用体中的一个字段,其中注册与删除事件的消息使用了同一个tmo字段。LwIP中的API相关的消息内容很多,不适合直接放在tcpip\_msg中,所以LwIP用一个api\_msg结构体来描述API消息,在 tcpip\_msg中只存放指向api\_msg结构体的指针,具体见代码清单 9‑9。 ``` 1 enum tcpip_msg_type 2 { 3 TCPIP_MSG_API, 4 TCPIP_MSG_API_CALL, //API函数调用 5 TCPIP_MSG_INPKT, //底层数据包输入 6 TCPIP_MSG_TIMEOUT, //注册超时事件 7 TCPIP_MSG_UNTIMEOUT, //删除超时事件 8 TCPIP_MSG_CALLBACK, 9 TCPIP_MSG_CALLBACK_STATIC //执行回调函数 10 }; 11 12 struct tcpip_msg 13 { 14 enum tcpip_msg_type type; (1) 15 union 16 { 17 struct 18 { 19 tcpip_callback_fn function; 20 void* msg; 21 } api_msg; (2) 22 23 struct 24 { 25 tcpip_api_call_fn function; 26 struct tcpip_api_call_data *arg; 27 sys_sem_t *sem; 28 } api_call; (3) 29 30 struct 31 { 32 struct pbuf *p; 33 struct netif *netif; 34 netif_input_fn input_fn; 35 } inp; (4) 36 37 struct 38 { 39 tcpip_callback_fn function; 40 void *ctx; 41 } cb; (5) 42 43 struct 44 { 45 u32_t msecs; 46 sys_timeout_handler h; 47 void *arg; 48 } tmo; (6) 49 50 } msg; 51 }; ``` (1):消息的类型,目前有7种。 (2):API消息主要由两部分组成,一部分是用于表示内核执行的API函数,另一部分是执行函数时候的参数,都会被记录在api_msg中。 (3):与API消息差不多,也是由两部分组成,一部分是tcpip_api_call_fn类型的函数,另一部分是其对应的形参,此外还有用于同步的信号量。 (4):inp用于记录数据包消息的内容,p指向接收到的数据包;netif表示接收到数据包的网卡;input_fn表示输入的函数接口,在tcpip_inpkt进行配置。 (5):cb用于记录回调函数与其对应的形参。 (6):tmo用于记录超时相关信息,如超时的时间,超时回调函数,参数等。