<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之旅 廣告
                通過前面的學習,我們知道每個netif接口都需要一個底層接口文件提供訪問硬件的支持,而LwIP作者將這種支持做成一個框架供我們參考,如ethernetif.c文件就是實現為一個框架的形式,我們在移植的時候只需要根據實際的網卡特性完善這里面的函數即可,該文件在后文會講解。框架中的函數名、參數等都已經實現,我們只需往里面填充完善即可,當然,網卡的驅動與這些函數名字我們也可以進行修改,只要LwIP內核能正確識別網卡中的功能即可,為了方便,我們還是使用LwIP作者提供的框架進行移植操作,當一個設備使用了多個網卡的時候,那就需要編寫多個不同的網卡驅動。與網卡驅動密切相關的函數有三個,分別是: ``` 1 static void low_level_init(struct netif *netif); 2 static err_t low_level_output(struct netif *netif, struct pbuf *p); 3 static struct pbuf * low_level_input(struct netif *netif); ``` low_level_init()為網卡初始化函數,它主要完成網卡的復位及參數初始化,根據實際的網卡屬性進行配置netif中與網卡相關的字段,例如網卡的MAC地址、長度,最大發送單元等。 low_level_output()函數為網卡的發送函數,它主要將內核的數據包發送出去,數據包采用pbuf數據結構進行描述,該數據結構是一個比較復雜的數據結構,后續我們會詳細講解。 low_level_input()函數為網卡的數據接收函數,該函數會接收一個數據包,為了內核易于對數據包的管理,該函數必須將接收的數據封裝成pbuf的形式。 在這一章節中我們僅講解low_level_init()函數,后面的兩個函數涉及到pbuf數據結構,在后面會詳細講解。 除此之外,還有兩個函數也與網卡與關系,分別是: ``` 1 err_t ethernetif_init(struct netif *netif); 2 void ethernetif_input(void *pParams); ``` ethernetif_init()函數是在上層管理網卡netif的到時候會被調用的函數,如使用netif_add()添加網卡的時候,就會調用ethernetif_init()函數對網卡進行初始化,其實該函數的最終調用的初始化函數就是low_level_init()函數,我們目前只有一個網卡,就暫時不用對該函數進行改寫,直接使用即可,它內部會將網卡的name、output、linkoutput等字段進行初始化,這樣子就能將內核與網卡無縫連接起來。 ethernetif_input()函數的主要作用就是調用low_level_input()函數從網卡中讀取一個數據包,然后解析該數據包的類型是屬于ARP數據包還是IP數據包,再將包遞交給上層,在無操作系統的時候ethernetif_input()就是一個可以直接使用的函數,已經無需我們自己去修改,內核會周期性處理該接收函數。而在多線程操作系統的時候,我們一般會將其改寫成一個線程的形式,可以周期性去調用low_level_input()網卡接收函數;也可以使用中斷的形式去處理,當這個線程將在尚未接收到數據包的時候,處于阻塞狀態,當收到數據包的時候,中斷利用操作系統的IPC通信機制來喚醒線程去處理接收到的數據包,并將數據包遞交上層,這樣子的效率會更加高效,事實上我們也是這樣子處理的。
                  <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>

                              哎呀哎呀视频在线观看