<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                LwIP使用api\_msg結構體描述一個API消息的內容,具體見代碼清單 9?11。 ``` 1 struct api_msg 2 { 3 struct netconn *conn; //當前連接 4 err_t err; //執行結果 5 6 union 7 { 8 struct netbuf *b; //執行lwip_netconn_do_send需要的參數,待發送數據 9 10 struct 11 { 12 u8_t proto; //執行lwip_netconn_do_newconn需要的參數,連接類型 13 } n; 14 15 //執行lwip_netconn_do_bind 和 lwip_netconn_do_connect需要的參數 16 struct 17 { 18 API_MSG_M_DEF_C(ip_addr_t, ipaddr); //ip地址 19 u16_t port; //端口號 20 u8_t if_idx; 21 } bc; 22 23 //執行lwip_netconn_do_getaddr需要的參數 24 struct 25 { 26 ip_addr_t API_MSG_M_DEF(ipaddr);//ip地址 27 u16_t API_MSG_M_DEF(port); //端口號 28 u8_t local; 29 } ad; 30 31 //執行lwip_netconn_do_write需要的參數 32 struct 33 { 34 const struct netvector *vector; //要寫入的當前向量 35 u16_t vector_cnt; //未寫入的向量的數量 36 size_t vector_off; //偏移到當前向量 37 size_t len; //總長度 38 size_t offset; //偏移量 39 u8_t apiflags; 40 } w; 41 42 //執行lwip_netconn_do_write需要的參數 43 struct 44 { 45 size_t len; //長度 46 } r; 47 } msg; 48 }; ``` api\_msg只包含3個字段,描述連接信息的conn、內核返回的執行結果err、還有msg,msg是一個共用體,根據不一樣 的API接口使用不一樣的數據結構。在conn中,它保存了當前連接的重要信息,如信號量、郵箱等,lwip\_netconn\_do\_xxx(xxx表示不一樣的NETCONN API接口)類型的函數執行需要用這些信息來完成與應用線程的通信與同步;內核執行lwip\_netconn\_do\_xxx類型的函數返回結果會被記錄在err中;msg的各個產業記錄各個函數執行時需要的詳細參數。 我們了解底層的數據包消息,那么同理對于上層的API函數,想要與內核進行數據交互,也是通過LwIP的消息機制,API消息由用戶線程發出,與內核進行交互,因為用戶的應用程序并不是與內核處于同一線程中,簡單來說就是用戶使用NETCONN API接口的時候,LwIP會將對應API函數與參數構造成消息傳遞到tcpip\_thread線程中,然后根據對應的API函數執行對應的操作,LwIP這樣子處理是為了簡單用戶的編程,這樣子就不要求用戶對內核很熟悉,與數據包消息類似,也是有獨立的API消息投遞函數去處理,那就是netconn\_apimsg()函數,在NETCONN API中構造完成數據包,就會調用netconn\_apimsg()函數進行投遞消息,具體見代碼清單 9?12。 ``` 1 err_t 2 netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port) 3 { 4 API_MSG_VAR_DECLARE(msg); 5 err_t err; 6 7 if (addr == NULL) 8 { 9 addr = IP4_ADDR_ANY; 10 } 11 12 API_MSG_VAR_ALLOC(msg); 13 API_MSG_VAR_REF(msg).conn = conn; 14 API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr); 15 API_MSG_VAR_REF(msg).msg.bc.port = port; (1) 16 err = netconn_apimsg(lwip_netconn_do_bind, &API_MSG_VAR_REF(msg)); (2) 17 API_MSG_VAR_FREE(msg); 18 19 return err; 20 } 21 22 static err_t 23 netconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg) 24 { 25 err_t err; 26 27 err = tcpip_send_msg_wait_sem(fn, apimsg, LWIP_API_MSG_SEM(apimsg)); 28 if (err == ERR_OK) 29 { 30 return apimsg->err; 31 } 32 return err; 33 } 34 35 err_t 36 tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem) 37 { 38 TCPIP_MSG_VAR_DECLARE(msg); 39 40 TCPIP_MSG_VAR_ALLOC(msg); 41 TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API; 42 TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn; 43 TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg; (3) 44 sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg)); (4) 45 sys_arch_sem_wait(sem, 0); (5) 46 TCPIP_MSG_VAR_FREE(msg); 47 return ERR_OK; 48 } ``` (1):根據netconn_bind()傳遞的參數初始化api_msg結構體。 (2):調用netconn_apimsg()函數投遞這個api_msg結構體,這個函數實際上是調用tcpip_send_msg_wait_sem()函數投遞API消息的,并且需要等待tcpip_thread線程的回應。 (3):構造API消息,類型為TCPIP_MSG_API,函數為API對應的函數lwip_netconn_do_bind,將msg 的指針指向api_msg結構體。 (4):調用sys_mbox_post()函數向內核進行投遞消息。 (5):同時調用sys_arch_sem_wait()函數等待消息處理完畢 總的來說,用戶的應用線程與內核也是相互獨立的,依賴操作系統的ICP通信機制進行數據交互與同步(郵箱、信號量等),LwIP提供上層NETCONN API接口,會自動幫我們處理這些事情,只需要我們根據API接口傳遞正確的參數接口,當然,NETCONN API的使用我們會在后面的章節具體介紹,此處僅做了解一下即可,只是為了讓大家對LwIP整個內核的運作有個詳細的了解,其運作示意圖具體見圖 9 4。 ![](https://box.kancloud.cn/e16b0f52c8e68af1787e867dfd80aa40_769x457.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>

                              哎呀哎呀视频在线观看