<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內核都必須有一個產生與之對應的消息函數,在產生該類型的消息后就將其投遞到系統郵箱tcpip\_mbox中,這樣子tcpip\_thread線程就會從郵箱中得到消息并且處理,從而能使內核完美運作,從圖 9?1中我們可以很直觀看到對應數據包的消息,是通過tcpip\_input()函數對消息進行構造并且投遞的,但是真正執行這些操作的函數是tcpip\_inpkt(),其源碼具體見代碼清單 9?10。 ``` 1 err_t 2 tcpip_input(struct pbuf *p, struct netif *inp) 3 { 4 if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) 5 { 6 return tcpip_inpkt(p, inp, ethernet_input); (1) 7 } 8 } 9 10 err_t 11 tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn) 12 { 13 struct tcpip_msg *msg; 14 15 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); 16 17 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT); (2) 18 if (msg == NULL) 19 { 20 return ERR_MEM; 21 } 22 23 msg->type = TCPIP_MSG_INPKT; 24 msg->msg.inp.p = p; 25 msg->msg.inp.netif = inp; 26 msg->msg.inp.input_fn = input_fn; (3) 27 if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) (4) 28 { 29 memp_free(MEMP_TCPIP_MSG_INPKT, msg); (5) 30 return ERR_MEM; 31 } 32 return ERR_OK; 33 } ``` (1):調用tcpip_inpkt()函數將ethernet_input()函數作為結構體的一部分傳遞給內核,然后內核接收到這個數據包就調用該函數。 (2):申請存放消息的內存空間。 (3):構造消息,消息的類型是數據包消息,初始化消息結構中msg共用體的inp字段,p指向數據包,網卡就是對應的網卡,處理的函數就是我們熟悉的ethernet_input()函數。 (4):構造消息完成,就調用sys_mbox_trypost進行投遞消息,這其實就是對操作系統的API簡單封裝,如果投遞成功則返回ERR_OK。 (5):如果投遞失敗,就釋放對應的消息結構空間。 總的來說,萬變不離其宗,無論是裸機編程還是操作系統,都是通過ethernet_input()函數去處理接收到的數據包,只不過操作系統通過線程與線程間數據通信,使用了消息進行傳遞,這樣子能使接收線程與內核線程互不干擾,相互獨立開,在操作系統環境下,接收線程只負責接收數據包、構造消息并且完成投遞消息即可,這樣子處理完又能接收下一個數據包,這樣子的效率更加高效,而內核根據這些消息做對應處理即可。 其運作示意圖具體見圖 9 3。 ![](https://box.kancloud.cn/42fbfd501317c205a9d0de7efd2c6bbf_758x391.png)
                  <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>

                              哎呀哎呀视频在线观看