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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                經過上面的移植,我們的底層與操作系統接口都基本移植完畢,想要讓LwIP在操作系統中能跑起來,還需要最后一步,將協議棧進行初始化,前面我們也說了,內核在操作系統中是作為一個線程獨立存在的,在初始化的時候,我們不僅要掛載網卡,也要創建tcpip\_thread()線程,當然,這個線程LwIP會在初始的時候自動創建,而掛載網卡的內容與無操作系統是一樣的,就無需過多修改,協議棧初始化的源碼具體見代碼清單 8?7。 ``` 1 /*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */ 2 #define IP_ADDR0 192 3 #define IP_ADDR1 168 4 #define IP_ADDR2 1 5 #define IP_ADDR3 122 6 7 /*NETMASK*/ 8 #define NETMASK_ADDR0 255 9 #define NETMASK_ADDR1 255 10 #define NETMASK_ADDR2 255 11 #define NETMASK_ADDR3 0 12 13 /*Gateway Address*/ 14 #define GW_ADDR0 192 15 #define GW_ADDR1 168 16 #define GW_ADDR2 1 17 #define GW_ADDR3 1 18 /* USER CODE END 0 */ 19 20 struct netif gnetif; 21 ip4_addr_t ipaddr; 22 ip4_addr_t netmask; 23 ip4_addr_t gw; 24 uint8_t IP_ADDRESS[4]; 25 uint8_t NETMASK_ADDRESS[4]; 26 uint8_t GATEWAY_ADDRESS[4]; 27 28 void LwIP_Init(void) 29 { 30 31 tcpip_init(NULL, NULL); 32 33 /* IP addresses initialization */ 34 /* USER CODE BEGIN 0 */ 35 #ifdef USE_DHCP 36 ip_addr_set_zero_ip4(&ipaddr); 37 ip_addr_set_zero_ip4(&netmask); 38 ip_addr_set_zero_ip4(&gw); 39 #else 40 IP4_ADDR(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3); 41 IP4_ADDR(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3); 42 IP4_ADDR(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3); 43 #endif /* USE_DHCP */ 44 /* USER CODE END 0 */ 45 /* Initilialize the LwIP stack without RTOS */ 46 /* add the network interface (IPv4/IPv6) without RTOS */ 47 netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, 48 &ethernetif_init, &tcpip_input); 49 50 /* Registers the default network interface */ 51 netif_set_default(&gnetif); 52 53 if (netif_is_link_up(&gnetif)) 54 { 55 /* When the netif is fully configured this function must be called */ 56 netif_set_up(&gnetif); 57 } 58 else 59 { 60 /* When the netif link is down this function must be called */ 61 netif_set_down(&gnetif); 62 } 63 64 } ``` 在tcpip\_init()函數中,LwIP會調用lwip\_init()將內核進行初始化,并且創建一個tcpip\_mbox郵箱,郵箱的大小是TCPIP\_MBOX\_SIZE,用于接收從底層或者上層傳遞過來的消息,并且最重要的是創建一個tcpip\_thread線程,這就是LwIP在操作系統中作為一個獨立的線程運行,所有處理的數據都要這個線程去處理,這個線程我們會在后續講解。lwip\_init()函數的源碼具體見代碼清單 8?8: ``` 1 void 2 tcpip_init(tcpip_init_done_fn initfunc, void *arg) 3 { 4 lwip_init(); 5 6 tcpip_init_done = initfunc; 7 tcpip_init_done_arg = arg; 8 if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) 9 { 10 LWIP_ASSERT("failed to create tcpip_thread mbox", 0); 11 } 12 #if LWIP_TCPIP_CORE_LOCKING 13 if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) 14 { 15 LWIP_ASSERT("failed to create lock_tcpip_core", 0); 16 } 17 #endif /* LWIP_TCPIP_CORE_LOCKING */ 18 19 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, 20 TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO); 21 } ``` 對于代碼清單 8?7中netif\_add()函數,與裸機移植的時候有一點細微的差別,它最后一個參數就是tcpip\_input,是一個函數,而不是原來的ethernet\_input(),因為tcpip\_input()函數會將網卡收到的數據包打包成為一個消息,發送到tcpip\_mbox郵箱中,傳遞給tcpip\_thread線程去處理,不過本質上也是調用ethernet\_input()函數去遞交這個數據包,只不過是繞了一大圈,因此,想要LwIP能正常運行,消息機制是不可或缺的,關于這個運作機制我們在后文詳細講解。
                  <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>

                              哎呀哎呀视频在线观看