一般采用的步驟:
1.深入了解所采用的系統(tǒng)核心
2.分析所采用的C語言開發(fā)工具的特點.
3.編寫移植代碼.
4.進行移植的測試
5.針對項目的開發(fā)平臺,封裝服務(wù)函數(shù).
首先,是芯片的中斷處理機制,如何開啟,屏蔽中斷,可否保存前一次中斷狀態(tài),芯片是否有軟中斷或陷阱指令
已經(jīng)將圖片移植成功,是一件很快樂的事情.
現(xiàn)在要將網(wǎng)絡(luò)也加進去,看一看,想什么辦法能夠辦到.
將lwip組織起來:
lwipopts.h
cc.h
timer.h
Timer0_Init(void)
Timer1_Init(void)
Delay10ms(unsigned short T) ;
Undefine_Init(void) ;
volatile 跟const 相反,可能在外界的影響下改變.編譯器不再對其進行優(yōu)化.
關(guān)于時鐘中斷,可有對應(yīng)的例子,沒有什么關(guān)系,如果想把這兩個合并在一起不太可能,
因為硬件不同罷了.
Timer0
Timer1 所有的都為了ucos-ii //time tick時鐘激發(fā).
SYSTEM CLOCK CONTROL ;
Main.c只是測試一個移植了,只能在串行口里輸出測試結(jié)果,但并不能表示它已經(jīng)完成了,對lwip移植任務(wù).
/******************************************************************************/
/--------------------------------/
/最后發(fā)現(xiàn)這只是一個應(yīng)用程序嘛:
/還沒有到初始化硬件的地步吧.
/--------------------------------/
lwip_Main.c 其中只有一個函數(shù),這個函數(shù)就可以完成你所要的lwip?
看看這個lwip_Main做了那些事情:
1.定義ip結(jié)構(gòu)體 struct ip_addr,netmask ,gw ;
2.定義信號量:sys_sem_t sem ;
3. 初始化一些東西.
初始化 TCP/IP 之前為何還需要實始化系統(tǒng)?
IP4_ADDR(&gw,0,0,0,0) ;
IP4_ADDR(&ipaddr,0,0,0,0) ;
IP4_ADDR(&netmask,0,0,0,0) ;
netif = netif_add(&ipaddr,&netmask,&gw,ethernetif_init,tcpip_input) ;
netif_set_default(netit) ;
dhcp_start(netif) ;
或者形如如此的形式,其的IP地址可以設(shè)定的.
udpecho_init() ;
但是這里跟本就沒有任務(wù),
是否要把此lwip添加到任務(wù)里去?
this is for web page ;in httpd file
httpd.h:
httpd_init() ;
httpd_thread() ;
這里的函數(shù)很簡潔,但是何時使用httpd_init(void) ;
到現(xiàn)在還沒有發(fā)現(xiàn),有那些東西需要做的,
沒有步驟
App:應(yīng)用程序沒有必要在這里看,
因為其中一些東西,跟本就不必要的
而需要理解其中的實質(zhì),怎么把lwip移植成功?
另外可以借助原先一個例子,可以比較讀取,看是否已經(jīng)到了熟習(xí),或者可以用上派場上.
如果說lwip里沒有牽涉到硬件問題,那么我們可以把它當(dāng)一個庫來看待
現(xiàn)在要怎么去使用它的函數(shù),
另一方面,怎么樣來初始化其對應(yīng)的網(wǎng)絡(luò)接口:8019
問題關(guān)鍵不再放在這個上面,應(yīng)該更有意義的是看LPC2284.h里是怎么去實現(xiàn)的,
然后我們再把它的實現(xiàn)過程移植s3c2440上去,可以看到結(jié)果的時候,就是照搬就快成功了.
而在lwip文件夾下的所有文件已經(jīng)實現(xiàn)了
這里的代碼一定是很比較穩(wěn)定的,已經(jīng)實現(xiàn)得比較好的.現(xiàn)在是實現(xiàn)它看看怎么樣讓調(diào)用起它來.
**************************************
如果目標(biāo)板的初始化,
一:在main里可能就只用到那一個函數(shù):
TargetInit() ---在圖片例子里也已經(jīng)完成了.不是必須的.
二:RTL8019
這個是網(wǎng)卡驅(qū)動:
要知道網(wǎng)卡的指針是怎么回事:
網(wǎng)卡的地址:
timer0_init()初始是什么事情?
現(xiàn)在關(guān)鍵問題在:s3c2440代替LPC2294
可不可以把這個封裝更簡單一些,以便使用更方便?
搞清里面的差別,另外看看,為什么要在LPC2294要用到Timer
原來有網(wǎng)卡驅(qū)動需要:
處理計時器:
timeout()函數(shù)按受兩個參數(shù):
第一指向變量的指針,存儲了開始時間,
第二:保存了以秒計數(shù)的超時時間.當(dāng)超過超時間時,該項函數(shù)觸發(fā)一個事件,
開始時間中重新寫入當(dāng)前時間并返
并返回一個非0值.
------------------------------------
應(yīng)該封閉起lwip,它已經(jīng)跟其它任何初始硬件無,
只要保證調(diào)用它的函數(shù)能夠起作用,正確使用它即可.
沒有必要去讀它里的任何一個文件,因為它是協(xié)議.
如果不對硬件初始化,那是不可能調(diào)用到lwip里的函數(shù)的.
注意:
1.可能要使用lwIP時,會做成一個任務(wù),
還要給它分配優(yōu)先級.Task.h
2.Target.c里去初始化網(wǎng)卡. 找出config.h,因為Target.c里只引用了它.但是好像在config.h里并不怎么實現(xiàn)它.
3.雖然Timer很重要,但是我想沒有必要把它也拿出來細究,因為不涉及到lwip
4.
沒有看到有那個函數(shù)調(diào)用漢字打點函數(shù),
為何當(dāng)你調(diào)用Lcd_printf()時也可以出現(xiàn)漢字?
Uart_SendString(pUartMsg) ;
lcd.c:一個向lcd里發(fā)送,
printf.c一個向串行端口發(fā)送.
Nand.c沒有被使用到.
最好想法把所有無關(guān)的都剝離出來,然后把相關(guān)的分成塊.
可以像其它一樣:
1.初始化 :像 lcd,printf-Uart,[xxx_init()]
2.將那些相應(yīng)的函數(shù)放到任務(wù)里.不停執(zhí)行.
3.將在單獨文件里實現(xiàn)函數(shù).
4.函數(shù)里去調(diào)用lwip協(xié)議函數(shù).
-----------------------------------------------------
分作兩部分了.一部分是RTL8019,另一部分:lwip
-----------------------------------------------------
5.RTL8019對網(wǎng)卡的實現(xiàn)函數(shù).
6.lwip實現(xiàn)棧,調(diào)用其中的函數(shù)實現(xiàn)--棧.
------------------------------------
dm9000已經(jīng)在RTL8019實現(xiàn),UBOOT已經(jīng)有對dm9000實現(xiàn),可以包裝一下,
rtl8019_netif
最好就與主板上分離開,
只要網(wǎng)卡對應(yīng)地址是
權(quán)衡那一種更容易達到效果:
rtl8019一般不是在ARM上,沒有辦法知道其驅(qū)動,
而dm9000是驅(qū)動,卻又沒有與lwip建立關(guān)系.
包裝dm9000一下,
lwip需要的網(wǎng)絡(luò)接口,初始化接口:
ethernetif_init()
low_level_output()
ethernetif_input()
ethernetif_init()負(fù)責(zé)網(wǎng)絡(luò)的接口初始化.底層收發(fā)包函數(shù),MAC地址和硬件初始化等.
low_level_output()負(fù)責(zé)將上層傳來的網(wǎng)絡(luò)包通過DM9000發(fā)送出去.
重新包裝DM9000驅(qū)動
在UBoot 里有DM9000驅(qū)動即可用到.
需要以下幾個函數(shù):
int dm9000_eth_init(struct netif*db) ;
void dm9000_eth_send(volatile void *,int) ;
int dm9000_eth_send_done(int) ;
int dm9000_eth_rxlen(void);
int dm9000_eth_rx(U8*rdptr,U16 RxLen) ;
int dm9000_drop_frame(U16 RxLen) ;
其中,只有發(fā)送和接收兩個函數(shù)需要改動,
LWIP上層傳給low_level_output()的數(shù)據(jù)包,
將根據(jù)MSS和MTU等值切割成一個個的小包,分別填充到鏈表pbuf里。
**************************************
struct netif{
struct netif *next ;
struct ip_addr ip_addr ;
struct ip_addr netmask ;
struct ip_addr gw ;
err_t(*input)(struct pbuf *p , struct netif *inp) ;
err_t(*output)struct netif*netif,struct pbuf *p,struct ip_addr *ipaddr) ;
err_t(*linkoutput)(struct netif*netif,struct pbuf *p) ;
#if LWIP_DHCP
struct dhcp *dhcp;
#endif
/** number of bytes used in hwaddr */
unsigned char hwaddr_len;
/** link level hardware address of this interface */
unsigned char hwaddr[NETIF_MAX_HWADDR_LEN];
/** maximum transfer unit (in bytes) */
U16 mtu;
/** flags (see NETIF_FLAG_ above) */
U8 flags;
/** link type */
U8 link_type;
/** descriptive abbreviation */
char name[2];
/** number of this interface */
U8 num;
};
//alt_lwip_dev結(jié)構(gòu)體描述了符合LWIP規(guī)范的網(wǎng)絡(luò)端口設(shè)備
struct alt_lwip_dev
{
/* The netif pointer MUST be the first element in the structure */
struct netif* netif;
const char* name;
err_t (*init_routine)(struct netif*); //初始化函數(shù)
void (*rx_routine)(); //數(shù)據(jù)接收函數(shù)
};
//alt_lwip_dev_list:設(shè)備鏈表
typedef struct
{
alt_llist llist; /* for internal use */
alt_lwip_dev dev;
}alt_lwip_dev_list;
typedef struct alt_llist_s alt_llist;
struct alt_llist_s {
alt_llist* next; /* Pointer to the next element in the list. */
alt_llist* previous; /* Pointer to the previous element in the list. */
};
//在LWIP定義的這些結(jié)構(gòu)體類型的基礎(chǔ)上,DE2_WEB_SERVER定義了針對DM9000網(wǎng)絡(luò)接口的一個結(jié)構(gòu)體
typedef struct
{
alt_lwip_dev_list lwip_dev_list; //與之關(guān)聯(lián)的設(shè)備鏈表
int base_addr; //寄存器的基地址
int irq; //中斷編號
u_char hwaddr[6]; //MAC地址
int index_offset;
int data_offset;
int dm9k_tx_space;
int dm9k_linked;
sys_sem_t arp_semaphore;
sys_sem_t tx_semaphore;
} alt_avalon_dm9k_if;
先讓驅(qū)動起來,移植s3c2440加到其它程序一起.
焦海波那個有可能考慮.因為那一些寫的比較完整,但總是低估了它的難度.
果然,焦已經(jīng)形成文檔了
下載下來看看,或許有解的機會.
移植被LwIP到一個新的目標(biāo)系統(tǒng)時,只需要修改這個接口艱險可,那個接口? sys_arch
操作系統(tǒng)模擬層(sys_arch) 它在底層操作系統(tǒng)和LwIP之間提供了一個接口?
sys_arch需要為LwIP提供信號量(sem)和郵箱(mailboxes)
信號量是可以計數(shù)信號量,也可以二值信號量,---LwIP都可以正常工作,
郵箱用于消息傳遞.
int sys_init()
sys_sem_t sys_sem_new() ;
sys_sem_freem() ;
sys_sem_signal()
sys_arch_sem_wait() ;
sys_mbox_t sys_mbox_new() ;
sys_mbox_free(sys_mbox_t mbox) ;
void sys_mbox_post(sys_mbox_t mbox,void *msg)
u32_t sys_arch_mbox_fetch(sys_mbox_t mbox,void **msg,u32_t timeout)
struct sys_timeouts *sys_arch_timeouts(void)
如果底層操作系統(tǒng)支持多線程并且LwIP中需要這樣的功能,則一定要實現(xiàn)這個函數(shù).
sys_thread_t sys_thread_new(void(*thread)(void*arg),void *arg,int prio) ;
sys_prot_t sys_arch_protect(void)
void sys_arch_unprotect(sys_prot_t pval) ;
以上是Lwip與操作系統(tǒng)關(guān)系.
----------------------------------------------------------------------------
OS支持的模擬層需要添加的頭文件:
cc.h 與硬件平臺以及編譯器相關(guān)的環(huán)境變量及數(shù)據(jù)類型聲明文件.或者一些移到sys_arch.h中.
與編譯器相關(guān)的LwIP結(jié)構(gòu)體
PACK_STRUCT_FILED(x)
PACK_STRUCT_STRUCT
PACK_STRUCT_BEGIN
PACK_STRUCT_END
與平臺相關(guān)
LWIP_PLATFORM_DIAG(X)
memset() 如果編譯器不提供,這個文件一定要包含它的定義,即memset()
perf.h
sys_arch.h sys_arch.c的頭文件
整個移植所依賴的操作系統(tǒng)平臺.
OK 文件夾和文件指定的路建立后,
先去定數(shù)據(jù)類型定義.
cc.h:
typedef unsigned char u8_t
typedef signed char s8_t
typedef unsigned short u16_t ;
.......
允許它們定義,沒關(guān)系,跟系統(tǒng)內(nèi)其它的定義不相沖突,如果全部換成一致也不見得好使用.
因為分為不同的分塊移植的.
信號量操作函數(shù)
郵箱操作函數(shù):
特別注意:投遞到郵箱中的消息只能是一個指針.
一:郵箱一次能夠接收多條消息比僅接收一條消息更加有效.
二:郵箱中的消息是一個指針.
__ilvSetLwIP()
實現(xiàn)網(wǎng)絡(luò)驅(qū)動與LwIP的接口,是網(wǎng)絡(luò)系統(tǒng)得以順利運轉(zhuǎn)的源動力,它會告訴LwIP網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送出口,建立網(wǎng)絡(luò)數(shù)據(jù)的接收入口并實現(xiàn)
接收入口與LwIP處理入口的對接.
當(dāng)?shù)讓泳W(wǎng)絡(luò)收發(fā)設(shè)備進入正常工作狀態(tài),網(wǎng)絡(luò)數(shù)據(jù)能夠正常流入流出LwIP后,這個函數(shù)進行的工作會結(jié)束.
我需要一款純的Lwip源代碼,可能都是別人移植了后,影響到我的思路.
下載一個原版的后,不用再去查看別人移植的,現(xiàn)在的工作是怎樣先把這個lwip先移植到uCos-ii里去,
暫時還不讓它跑起來,按照常規(guī)的想法是把其思路先移植上去再說.看看有什么效果.再實現(xiàn)驅(qū)動.
采用一個干凈的lwip源碼是很有用處的.
一:可以就此完全不用顧及別人的移植思路,
二:自己移植出錯容易找出來,
三:用時會快一些.
實際上這些都是在這里操作.
LwIPEntry.c這個文件也像LwIP_main.c文件一樣.是重中之重.
沒有把硬件東西提取來,有點過失,
如果再把其中的東西提取來,就有點更直接的效果.
ethernetif_init()初始化底層接口:
Lwip作者已經(jīng)幫我們完成大部分工作,我們只要把框架內(nèi)完成與底層硬件相關(guān)的部分即可.
ethernetif 是一個結(jié)構(gòu)體:用來描述網(wǎng)絡(luò)硬件設(shè)備(通常說的網(wǎng)卡)
它唯一不可缺少的是網(wǎng)卡的MAC地址.
ethernetif->ethaddr ====指針指向netif中保存的網(wǎng)卡MAC地址.
low_level_output()
與硬件聯(lián)系的函數(shù),
指定任務(wù)優(yōu)先級,最好定為最高優(yōu)先級,如果確定存在更高優(yōu)先級,一定要讓更高優(yōu)先級任務(wù)占用CPU使用權(quán)時間不能太長,
否則將嚴(yán)重影響網(wǎng)絡(luò)性能.
ethernetif.c是硬件的抽象層.
實現(xiàn)了它,不一定可以,還需要硬件驅(qū)動.
lib_emac.c專門用來建立驅(qū)動函數(shù):
硬件驅(qū)動:它不僅包括EMACInit()
EMACReadPacket() EMACSendPacket() 分別負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)包的接收和發(fā)送.
這個已經(jīng)在處理硬件了.
怎樣使用硬件工人和順利就得有這么一種慢慢使用的過程了.
所以網(wǎng)卡的實現(xiàn)也只有三個函數(shù)嗎?
EMACInit()
EMACReadPacket()
EMACSendPacket()
怎樣把問題簡化:
1.lwip
2.dm9000
3.lwip->ucosii 這個可以暫時搞定: ---------------------返正先把這個搞定再說.-------------------
4.lwip->dm9000
lwip->dm9000詳細問題,要解決幾個問題:
1.EMAC發(fā)送和接收中斷處理函數(shù) --dm9000看看中斷處理函數(shù).
2.EMACSendPacket 發(fā)送
找來找去沒有發(fā)現(xiàn)什么新的東西可以模仿,不如自己寫一個.
首先把LwIP移植之后再說,其它的就不必太在意.
先把一步做完,
然后再考慮網(wǎng)絡(luò)驅(qū)動的問題.
文件結(jié)構(gòu)也很重要,不然可能有一些會搞混亂.
在此中間,焦海波采用了鏈表來構(gòu)建郵箱,
而我將采用另一種方式:隊列,讓隊列給uCOS-II去處理更好一些.
這樣把LwIP實現(xiàn)了后,再就是硬件網(wǎng)卡驅(qū)動.
首先添加LwIPEntry.c文件,
看來我在dm9000 花費了太多心血,倒頭來還只是一個linux版的,而且一點進展都沒有,
怎么辦?
我想把它搞掉.
算是移植完成了,但是沒有調(diào)試,因為可能還有許多錯誤,要清除這些錯誤,得一段時間.
怎么把平臺里的網(wǎng)絡(luò)相關(guān)函數(shù)抽象出來?
直接用到一些函數(shù),可以用來發(fā)送Ping Webpage 之類,看看,可不可以脫離硬件函數(shù).
怎么辦,ADS不可以直接加工程.
是否需要有更多了解.
我是怎么樣把我所做的添加上去呢?
難道像昨晚那樣一個一個添加?
其實文件夾跟本就不存于mcp工程里.
編譯已經(jīng)成功,但是一些應(yīng)該使用的功能可能還沒有達到你的要求,
現(xiàn)在的工作是怎樣把相應(yīng)的功能加進去,即是怎樣把Lwip 棧協(xié)議加進去,
實現(xiàn)通信.
出現(xiàn)的另外一個問題,為何在外部的驅(qū)動,沒法在lwip里調(diào)用,是否是因把dw9000加到了外面?
現(xiàn)在的問題只是:驅(qū)動出現(xiàn)了問題,如果把驅(qū)動處理好
可能一切都好辦了.
但驅(qū)動如何才能添加上去.
因為其它的驅(qū)動看似很容易得到,但是不符乎我的芯片上的意思,
我決問自己寫dm9000的驅(qū)動.
有文檔,也有別人的例子,應(yīng)該比較容易一些.
編寫驅(qū)動程序:
注意處理器所用的C編譯器使用"大端格式","小端格式"
只有兩個可以直接被除數(shù)處理器訪問的寄存器,
CMD 端口和DATA端口,
(DM9000中有許多控制和狀態(tài)寄存器) 訪問這些控制,狀態(tài)寄存器的方法:
1.將寄存器的地址寫到CMD端口
2.從DATA端口讀寫寄存器中的數(shù)據(jù).
1-3
新建一個試一試:
全部用新的就可以了,自己新建一個即立成功.沒有什么完成不了,
可能還是因為宏的問題,
所以從dm9000x.h里把不必要的東西都裁減掉.
高位片選地址:
DM9000地址端口= 高位片選地址+300H+0H
DM9000數(shù)據(jù)端口= 高位片選地址+300H+4H
DM9000的高位片選地址將是多少?
0x90000A46
現(xiàn)在已經(jīng)編譯通過,
基本的修改已經(jīng)完成,怎么讓OS啟動
雖然已經(jīng)移植完成了,但沒有調(diào)試,沒有看出來是否已經(jīng)成功還沒有定論
肯定還會有問題:
1.驅(qū)動dm9000雖然完成了,但沒有測試,是否完備
2.LwIP棧協(xié)議還不一定移植成功,因為申請的空間還不明確.
3.添加的應(yīng)用程序可能存在一定的問題,如果沒有其它問題,應(yīng)用程序都可以順利執(zhí)行.
4.是否還需要添加httpd.c文件,讓其當(dāng)服務(wù),用來訪問,如果可以,則應(yīng)該一試,以防備其它的不成功,采取這個可以能過,
5.也算是網(wǎng)絡(luò)通順的一個實例.(但是有一個問題即是,這個是里面是否)
移植的方式很多,但要想成,得有一個章程.
如下是linux里的移植過程:
sys_arch.c里有另一種操作:
把有一些東西分開了,
初始化網(wǎng)卡與網(wǎng)卡數(shù)據(jù)接收中斷:
extern void eth_init(void) ;
extern void eth_rx(int irq,void*devid) ;
而我自己移植里沒有看到有那里初始化硬件,也沒有看到那里調(diào)用其中的網(wǎng)卡接收中斷數(shù)據(jù)函數(shù)
網(wǎng)卡初始化.
有l(wèi)ow_level_init()是網(wǎng)卡初始化?不是,而網(wǎng)卡初始化是硬件文件里定義.
實際上都寫到這個文件里了,sys_arch.c
1.初始化網(wǎng)卡和網(wǎng)絡(luò)接口:
err_t init_ethernetif(struct netif*netif)
{
//初始化網(wǎng)卡
eth_init() ; //當(dāng)然在硬件文件里實現(xiàn)
ethernetif_init(netif); //初始化網(wǎng)絡(luò)接口,當(dāng)然也會在硬件文件里實現(xiàn),
return ERR_OK ;
}
2.初始化lwip
void sys_init(void)
{ //這里所做的一切都是一樣的.沒什么可以大作文件,看看即可.
netif_init() ;
mem_init() ;
memp_init() ;
pbuf_init() ;
.....
//這里把接收網(wǎng)卡數(shù)據(jù)的線程,創(chuàng)建起來.這里使用單獨的線程執(zhí)行ethernetif_input() ;
sys_thread_new(ethernet_rev,(void*)0,TCPIP_THREAD_PRIO) ;
}
//那我看看我的移植,沒有初始化硬件.
我認(rèn)為焦海波之做法不可靠,他把郵箱分成多個郵箱,再用鏈表鏈起來,
而其實可以采有和OS系統(tǒng)里創(chuàng)建隊列,只建起隊列即可,操作也在對隊列實行
沒有必要再去創(chuàng)建多個郵箱鏈表.
總感到別扭,為什么采用那種方式?
是否可以改革,把之前的所想的都改掉呢?
如果可以通了,就好.但關(guān)鍵是不知道是否能通啊.
dm9000.c里實際上也只是有三個函數(shù):
重要的三個函數(shù):
DM9000_init()
eth_rx()
eth_send()
而給出定義為外部變量時也采用了同樣的方式:
extern DM9000_init()
extern eth_rx()
extern eth_send
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//一直沒有bootloader ,所以重新找了一個.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
雖然移植完成了,但是測試時候,連lcd,com都沒有成功,怎么辦?
是否因為調(diào)用了OS里的sys_thread_new 之后,也把其中的任務(wù)破壞了?
是否還有一種可能是因為雙重使用了ethernet.c而另一個只是用了一個名字為:
ethernetif.c
所以要么就此脫離移植筆錄,
要么全部按移植筆錄來操作,而不另外添加任務(wù)新東西.
怎樣保持一個干凈的東西,需要對此做一些修整.
可以把DM9000里的驅(qū)動先加進去,而不使用LwIP看結(jié)果如何.
在DM9000.c里設(shè)一些可以返回值Uart_printf() ; 這樣的函數(shù),讓其運行過來,看看結(jié)果如何?
即調(diào)試一樣的.如果DM9000驅(qū)動成功,再把LwIP加進去.
先讓這個跑起來:myucos.rar
是否思路不清晰,造成了多加了一些任務(wù)?
只專門研究-lwip1.1.3
要不把驅(qū)動放到里去讓其運行,看看結(jié)果,把它的每個函數(shù)都加進去試.
ADS1.2是否可以不需要平臺調(diào)試呢?
先來看看模擬平臺.模擬平臺沒辦法測試丟棄.
再把LwIP移植工作做成功,做到最簡單.
我讓他全部是光光的,什么都沒有,也不另添加什么新文件進去.
兩個工程都基本完成,再燒到板子里試,看能不能跑起來,如果能,說明是兩者都沒破壞,