<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                從前面的章節我們也知道,LwIP在操作系統的環境下,LwIP內核是作為操作系統的一個線程運行的,在協議棧初始化的時候就會創建tcpip\_thread線程,那么我們現在來看看tcpip\_thread線程到底是怎么樣的東西,具體見代碼清單 9?7。 ``` 1 static void 2 tcpip_thread(void *arg) 3 { 4 struct tcpip_msg *msg; 5 LWIP_UNUSED_ARG(arg); 6 7 LWIP_MARK_TCPIP_THREAD(); 8 9 LOCK_TCPIP_CORE(); 10 if (tcpip_init_done != NULL) 11 { 12 tcpip_init_done(tcpip_init_done_arg); 13 } 14 15 while (1) 16 { 17 LWIP_TCPIP_THREAD_ALIVE(); 18 /* 等待消息,等待時處理超時 */ 19 TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg); (1) 20 if (msg == NULL) 21 { 22 continue; (2) 23 } 24 tcpip_thread_handle_msg(msg); (3) 25 } 26 } ``` (1):LwIP將函數tcpip_timeouts_mbox_fetch()定義為帶參宏TCPIP_MBOX_FETCH,所以在這里就是等待消息并且處理超時事件。 (2):如果沒有等到消息就繼續等待。 (3):等待到消息就對消息進行處理,這個函數具體見代碼清單 9 8。 ``` 1 static void 2 tcpip_thread_handle_msg(struct tcpip_msg *msg) 3 { 4 switch (msg->type) 5 { 6 #if !LWIP_TCPIP_CORE_LOCKING 7 case TCPIP_MSG_API: 8 msg->msg.api_msg.function(msg->msg.api_msg.msg); (1) 9 break; 10 case TCPIP_MSG_API_CALL: 11 msg->msg.api_call.arg->err = 12 msg->msg.api_call.function(msg->msg.api_call.arg); (2) 13 sys_sem_signal(msg->msg.api_call.sem); 14 break; 15 #endif /* !LWIP_TCPIP_CORE_LOCKING */ 16 17 #if !LWIP_TCPIP_CORE_LOCKING_INPUT 18 case TCPIP_MSG_INPKT: 19 if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) (3) 20 { 21 pbuf_free(msg->msg.inp.p); 22 } 23 memp_free(MEMP_TCPIP_MSG_INPKT, msg); 24 break; 25 #endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ 26 27 #if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS 28 case TCPIP_MSG_TIMEOUT: 29 sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);(4) 30 memp_free(MEMP_TCPIP_MSG_API, msg); 31 break; 32 case TCPIP_MSG_UNTIMEOUT: 33 sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg); (5) 34 memp_free(MEMP_TCPIP_MSG_API, msg); 35 break; 36 #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ 37 38 case TCPIP_MSG_CALLBACK: 39 msg->msg.cb.function(msg->msg.cb.ctx); (6) 40 memp_free(MEMP_TCPIP_MSG_API, msg); 41 break; 42 43 case TCPIP_MSG_CALLBACK_STATIC: 44 msg->msg.cb.function(msg->msg.cb.ctx); (7) 45 break; 46 47 default: 48 break; 49 } 50 } ``` (1)(2):根據消息中的不同類型進行不同的處理,對于TCPIP_MSG_API類型,就執行對應的API函數。 (3):對于TCPIP_MSG_INPKT類型,直接交給ARP層處理。 (4):對于TCPIP_MSG_TIMEOUT類型,表示上層注冊一個超時事件,直接執行注冊超時事件即可。 (5):相反的,對于TCPIP_MSG_ UNTIMEOUT類型,表示上層刪除一個超時事件,直接執行刪除超時事件即可。 (6)(7):對于TCPIP_MSG_CALLBACK或者是TCPIP_MSG_CALLBACK_STATIC類型,表示上層通過回調方式執行一個回調函數,那么就執行對應的回調函數即可。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看