LwIP 为我们提供了两种应用程序接口( API 函数)来实现 TCP/IP 协议栈,它们分别是:
ØRAW APIlow-level "core" / "callback" or "raw" API
l基于回调函数的 API,运行更快,更省内存。
l不需OS(task/thread),协议栈和app运行在同一个task中,所以无需同步之类的。
l参考Main.c (ports\unix\proj\minimal)中的echo srv【echo_init()】。
Øsequential API higher-level "sequential" API
l需要OS(task/thread),协议栈和app运行在不同的task中,所以需要同步之类的。
l参考Simhost.c (ports\unix\proj\unixsim),tcpip_init()。
l需要实现对应OS的mbox/semaphore/thread,如Sys_arch.c (ports\unix)。
参考下面的代码。
tcpip_init会创建tcpip_thread线程。
ØLinux的实现
l信号量,详细的就不说了。在LWIP中用来线程之间同步(告知)。
l邮箱,看struct中的void *msgs[SYS_MBOX_SIZE]。在LWIP中用来线程之间数据交互。
其实和TLS原理一样的,例如pjsip里模拟的TLS就有一样的二维指针(或指针数组)static void *tls_values[MAX_TLS_ID];
struct sys_mbox {
int first, last;
void *msgs[SYS_MBOX_SIZE];
struct sys_sem *not_empty;
struct sys_sem *not_full;
struct sys_sem *mutex;
int wait_send;
};
Sender post
Recver fetch/pend。
在LWIP中,
tcpip_thread(void *arg)
{
......
while (1) { /* MAIN Loop */
{
......
sys_timeouts_mbox_fetch(&mbox, (void **)&msg);//其他线程post
......
}
......
}
原文:http://www.cnblogs.com/freezlz/p/5483092.html