久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: lwIP bug 導致程序崩潰問題的解決 [打印本頁]

作者: ddddgggg    時間: 2018-11-2 23:21
標題: lwIP bug 導致程序崩潰問題的解決
本人使用的LWIP版本號是LWIP 1.3.2 ,并且使用UCOSII  V2.89系統。

在移植使用的過程中,使用LWIP只做客戶端或服務端是沒有問題的。

后來客戶端和服務端都集合使用的時候,碰到了一個BUG
for(pcb =tcp_active_pcbs; pcb != NULL; pcb = pcb->next) 在這個地方進入死循環了,
pcb 塊申請和釋放的時候出錯了,pcb->net指向自己本身了。后來在網上查了一大堆資料,
說是LWIP1.3.2版本就有這個問題,而1.4.1版本沒有。

為了解決這個問題就嘗試去移植LWIP1.4.1這個版本,然后卻發現1.4.11.3.2版本的郵箱和信號
量函數接口都不同了,在UCOSIIV2.8.9下已經不能滿足了。相當于之前移植的sys_arch.c已經
不能適應了。LWIP1.4.1在網上的sys_arch.c例子基本都是基于UCOSIII-V3.0.x 來實現。所有如果
更換LWIP1.4.1的話,最好也要去替換UCOSII。而又由于之前的工程中已有使用UCOSII,再去替
換工作量又相當大,所有想找到一種方式,直接在LWIP1.3.2版本下解決LWIPpcb->net指向自己
本身的問題。

后來發現這個問題是由于LWIP里面的TCP塊在沒有接連的情況下,不用close就會自動釋放。如果LWIP
自己釋放過了,而你自己又操作closeabort釋放一次,那么TCP_PCB內存塊就出現問題了。那么問題
既然找到了,那就想辦法解決。本人想到了一個修改最少最簡便的方法來解決這個問題,僅需修改
2.c1.h文件即可解決這個問題。修改情況如下:


  
需改內容
  
解釋
文件名稱
添加內容(增加紅色字體)
tcp.h
/* the TCP protocol control block */
  
struct tcp_pcb {
  
/** common PCB members */
  
   IP_PCB;
  
/** protocol specific PCB members */
  
   TCP_PCB_COMMON(struct tcp_pcb);
  
..............................省略......................................
  
  
   /* KEEPALIVE counter */
  
   u8_t keep_cnt_sent;
  
  
  u8_t pcb_used;
  
};
struct  tcp_pcb 結構體中增加一個字段,pcb_used。這個字段值 = 0 = 1
  
0代表這個TCP_PCB塊沒有在使用,已經釋放。
  
1代表這個TCP_PCB塊正在使用,占用內存。
memp.c
void
  
memp_free(memp_t type, void *mem)
  
{
  
   struct memp *memp;
  
  struct tcp_pcb *pcb;
  
  if(type == MEMP_TCP_PCB ){
  
      pcb  = (struct tcp_pcb *)mem;
  
       if(pcb->pcb_used == 0){
  
              return;
  
       }
  
       pcb->pcb_used = 0;
  
  }
  
   SYS_ARCH_DECL_PROTECT(old_level);
  
..............................省略......................................
  
SYS_ARCH_UNPROTECT(old_level);
  
}
在釋放TCP_PCB塊的時候,如果pcb_used==0,那么這個TCP_PCB塊已經釋放過了,可能是沒連接的塊系統自己釋放,也能是自己誤操作,多次釋放。總之,不管什么原因,已經釋放過的不能再釋放了,所有這邊直接return退出。沒有釋放的正常釋放,只是字段pcb_used0
tcp.c
struct tcp_pcb *
  
tcp_alloc(u8_t prio)
  
{
  
   struct tcp_pcb *pcb;
  
   u32_t iss;
  
  
  
   pcb = memp_malloc(MEMP_TCP_PCB);
  
   if (pcb == NULL) {
  
    ..............................省略......................................
  
  }
  
   if (pcb != NULL) {
  
     memset(pcb, 0, sizeof(struct tcp_pcb));
  
     ..............................省略......................................
  
     pcb->keep_cnt_sent = 0;
  
       pcb->pcb_used = 1;
  
  }
  
   return pcb;
  
}
在申請TCP_PCB塊的時候,把pcb_used1,標記這個塊目前正在使用,占用內存。


現在只需要在,structtcp_pcb中添加一個字段,再加上幾行代碼,就可以解決這個問題了。



作者: tianqi911    時間: 2019-8-27 11:18
佩服。真厲害呀。真在學習LWIP。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲色图在线观看 | 国产精品欧美日韩 | 中文字幕精品一区二区三区精品 | 国产一区二区三区久久久久久久久 | www视频在线观看 | 黄色成人av | 中文字幕视频三区 | 国产一区二区精品在线观看 | 亚洲免费大片 | 国产目拍亚洲精品99久久精品 | 成人久久久 | 51ⅴ精品国产91久久久久久 | 色免费在线视频 | 亚洲 欧美 另类 综合 偷拍 | 欧美激情久久久 | 亚洲综合一区二区三区 | 亚洲视频在线免费观看 | 欧美精品久久久久 | 麻豆一区一区三区四区 | 夜夜摸夜夜操 | 国产精久久久久久久妇剪断 | 一区二区三区欧美在线 | 久久性色 | www免费视频 | 久久久黑人 | 欧美9999| 欧美无乱码久久久免费午夜一区 | 波多野结衣电影一区 | 黑人巨大精品欧美黑白配亚洲 | 精品成人69xx.xyz | 97国产超碰 | 97精品久久| 欧美精品一区三区 | 日韩精品一区二区三区视频播放 | 狠狠干2020| 影视先锋av资源噜噜 | 国产精品毛片一区二区三区 | 精品欧美一区二区三区久久久 | 99国产精品99久久久久久 | 亚洲免费观看视频网站 | 91久久电影 |