將lwip移植到ucos之後, qa在長時間測試後發現, 偶爾會在dhcp的過程中宕機.
assertion "dhcp_create_request: dhcp->p_out == null" failed at line 1493 in d:\***\network\tcpip\lwip\src\core\dhcp.c很顯然, 在dhcp_create_request 函式中發現 dhcp->p_out 居然不是null. 然後就assert掉了.#ap!# exception!
整理了下dhcp的**流程, 發現是在dhcp_start ==> dhcp_discover 的時候, udp_sendto_if 之後, 還沒有來得及dhcp_delete_request 去free 掉這個p_out.
這時候網路上回來了dhcp offer的包, 然後f發生網絡卡中斷.
eth_lwip_rx
tcpip_input
sys_mbox_trypost
然後到tcpip_thread中
ethernet_input
ip_input
udp_input
dhcp_recv
dhcp_handle_offer
dhcp_select
dhcp_create_request
這時候發現netif->dhcp->p_out在前面還沒有被delete掉, 從而導致assert.
典型的多工場景. 加鎖保護臨界區, 確保先在dhcp_delete_request 中 free p_out, 防止被 tcpip_thread 任務先訪問dhcp->p_out.
修改後, 再也沒有出現這個assert.
LWIP 移植檔案
要將乙太網驅動和lwip鏈結在一起還需要一些中間檔案,這些檔案很重要。這些中間檔案包括 cc.h cpu.h perf.h sys arch.c 和sys arch.h。stm32f4x7 eth bsp.c netconf.c 為硬體驅動配置檔案。stm32f4x7 eth.c 驅動庫傳輸層硬體配...
LWIP應用開發 LWIP移植和裁剪
1.lwip原始碼目錄結構 lwip原始碼目錄中包括doc src test資料夾和其他檔案,其中src資料夾是lwip的重點,裡面包含了lwip的原始碼 src原始碼資料夾如下示,由api core include netif這4個資料夾組成 src api 協議棧sequentialapi和so...
lwip雙網絡卡移植
我公司產品是雙網口,原來的程式是自己寫的tcp ip協議棧,因為只是簡單實現了arp和tcp udp的最簡單情況,所以有時候在公網上會遇到問題。後來在單網口的產品中移植了lwip,輕量級tcp ip協議棧,覺得一定程度上解決了問題,所以雙網絡卡的產品也要用lwip這個協議棧來實現。這個工作就落到了我...