<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中以下兩個函數可以實現對超時的處理: void sys\_check\_timeouts(void):這是用于裸機的函數,用戶需要在裸機應用程序中周期性調用該函數,每次調用的時候LwIP都會檢查超時鏈表上第一個sys\_timeo結構體是否到期,如果沒有到期,直接退出該函數,否則,執行sys\_timeo結構體中對應的超時回調函數,并從鏈表上刪除它,然后繼續檢查下一個sys\_timeo結構體,直到sys\_timeo結構體沒有超時才退出。 tcpip\_timeouts\_mbox\_fetch(sys\_mbox\_t \*mbox, void \*\*msg):這個函數在操作系統的線程中循環調用,主要是等待tcpip\_mbox消息,是可阻塞的,如果在等待tcpip\_mbox的過程中發生超時事件,則會同時執行超時事件處理,即調用超時回調函數。LwIP是這樣子處理的,如果已經發生超時,LwIP就會內部調用sys\_check\_timeouts()函數去檢查超時的sys\_timeo結構體并調用其對應的回調函數,如果沒有發生超時,那就一直等待消息,其等待的時間為下一個超時時間的時間,一舉兩得。 LwIP中tcpip線程就是靠這種方法,即處理了上層及底層的tcpip\_mbox消息,同時處理了所有需要超時處理的事件。具體見代碼清單 9?6。 ``` 1 #define TCPIP_MBOX_FETCH(mbox, msg) tcpip_timeouts_mbox_fetch(mbox, msg) 2 3 static void 4 tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg) 5 { 6 u32_t sleeptime, res; 7 8 again: 9 LWIP_ASSERT_CORE_LOCKED(); 10 11 sleeptime = sys_timeouts_sleeptime(); (1) 12 if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) 13 { 14 UNLOCK_TCPIP_CORE(); 15 sys_arch_mbox_fetch(mbox, msg, 0); (2) 16 LOCK_TCPIP_CORE(); 17 return; 18 } 19 else if (sleeptime == 0) 20 { 21 sys_check_timeouts(); (3) 22 goto again; 23 } 24 25 UNLOCK_TCPIP_CORE(); 26 res = sys_arch_mbox_fetch(mbox, msg, sleeptime); (4) 27 LOCK_TCPIP_CORE(); 28 if (res == SYS_ARCH_TIMEOUT) 29 { 30 sys_check_timeouts(); 31 goto again; 32 } 33 } ``` (1):調用sys_timeouts_sleeptime()函數得到距離事件超時的時間并保存在sleeptime變量中。 (2):如果sleeptime為SYS_TIMEOUTS_SLEEPTIME_INFINITE,表示當前系統無超時事件,那只需一直等待mbox消息即可,所以調用sys_arch_mbox_fetch()函數進行等待消息,等待時間是一直等待。 (3):如果sleeptime為0表示已經發生超時了,那就調用sys_check_timeouts()去檢查一下到底是哪個事件發生超時并且去處理其超時回調函數。 (4):對于其他時間,LwIP就在等待tcpip_mbox的消息的同時就去處理超時事件,等待tcpip_mbox的消息的時間為sleeptime,然后在時間到達的時候就處理超時事件。如果接收到消息,并且超時時間還沒到,那就去處理tcpip_mbox的消息,然后再回來重新計算等待時間sleeptime,如此反復,這樣子既不會錯過tcpip_mbox的消息,也不會錯過超時的事件。
                  <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>

                              哎呀哎呀视频在线观看