<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中注冊超時事件的函數是sys\_timeout(),但是實際上是調用sys\_timeout\_abs()函數,具體見代碼清單 9?2。 ``` 1 void 2 sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg) 3 { 4 u32_t next_timeout_time; 5 LWIP_ASSERT_CORE_LOCKED(); 6 7 /* overflow handled by TIME_LESS_THAN macro */ 8 next_timeout_time = (u32_t)(sys_now() + msecs); (1) 9 10 sys_timeout_abs(next_timeout_time, handler, arg); 11 } 12 13 static void 14 sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg) 15 { 16 struct sys_timeo *timeout, *t; 17 18 timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); (2) 19 if (timeout == NULL) 20 { 21 return; 22 } 23 24 timeout->next = NULL; 25 timeout->h = handler; 26 timeout->arg = arg; 27 timeout->time = abs_time; (3) 28 29 if (next_timeout == NULL) 30 { 31 next_timeout = timeout; (4) 32 return; 33 } 34 if (TIME_LESS_THAN(timeout->time, next_timeout->time)) 35 { 36 timeout->next = next_timeout; 37 next_timeout = timeout; (5) 38 } 39 else 40 { 41 for (t = next_timeout; t != NULL; t = t->next) 42 { 43 if ((t->next == NULL) || 44 TIME_LESS_THAN(timeout->time, t->next->time)) 45 { 46 timeout->next = t->next; 47 t->next = timeout; (6) 48 break; 49 } 50 } 51 } 52 } ``` (1):根據當前時間計算出超時的時間,然后調用sys_timeout_abs()函數將當前事件插入超時鏈表。 (2):從內存池中申請一個MEMP_SYS_TIMEOUT類型內存,保存對應超時事件的相關信息。 (3):填寫對應的超時事件信息,超時回調函數、函數參數、超時的 時間。 (4):如果超時鏈表中沒有超時事件,那么新添加的事件就是鏈表的第一個。 (5):如果新插入的超時事件比鏈表上第一個事件的時間短,則將新插入的超時事件設置成鏈表的第一個。 (6):遍歷鏈表,尋找合適的插入節點,超時鏈表根據超時事件的時間升序排列。 在timeouts.c中,有一個名字為lwip_cyclic_timer的結構,LwIP使用該結構存放了其內部使用的循環超時事件。這些超時事件在LwIP初始化時通過函數sys_timeouts_init()調用定時器注冊函數sys_timeout()注冊進入超時鏈表中,lwip_cyclic_timer的結構具體見: ``` 1 #define TCP_TMR_INTERVAL 250 2 #define IP_TMR_INTERVAL 1000 3 #define ARP_TMR_INTERVAL 1000 4 5 struct lwip_cyclic_timer 6 { 7 u32_t interval_ms; 8 lwip_cyclic_timer_handler handler; 9 }; 10 11 const struct lwip_cyclic_timer lwip_cyclic_timers[] = 12 { 13 {TCP_TMR_INTERVAL, HANDLER(tcp_tmr)}, 14 15 {IP_TMR_INTERVAL, HANDLER(ip_reass_tmr)}, 16 17 {ARP_TMR_INTERVAL, HANDLER(etharp_tmr)}, 18 }; ``` lwip\_cyclic\_timers數組中存放了每個周期性的超時事件回調函數及超時時間,在LwIP初始化的時候就將這些事件一個個插入超時鏈表中,具體見代碼清單 9?4。 ``` 1 void sys_timeouts_init(void) 2 { 3 size_t i; 4 5 for(i =(LWIP_TCP ? 1 : 0);i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) 6 { 7 sys_timeout(lwip_cyclic_timers[i].interval_ms,lwip_cyclic_timer, 8 LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); 9 } 10 } ``` 插入超時鏈表后的示意圖具體見圖 9?2。 ![](https://box.kancloud.cn/46c5aeb527e47b601120c67c03ce909e_945x195.png) 每個sys\_timeo結構體中的h成員變量記錄著對應的超時回調函數,對于周期性的回調函數,LwIP是這樣子處理的:在初始化的時候將他們注冊到 lwip\_cyclic\_timer()函數中,每次在處理回調函數之后,就調用sys\_timeout\_abs()函數將其重新注冊到超時鏈表中,具體見代碼清單 9?5。 ``` 1 lwip_cyclic_timer(void *arg) 2 { 3 u32_t now; 4 u32_t next_timeout_time; 5 const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg; 6 7 cyclic->handler(); 8 9 now = sys_now(); 10 next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); 11 12 if (TIME_LESS_THAN(next_timeout_time, now)) 13 { 14 sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg); 15 } 16 else 17 { 18 sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg); 19 } 20 } ```
                  <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>

                              哎呀哎呀视频在线观看