當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]一般采用的步驟:1.深入了解所采用的系統(tǒng)核心2.分析所采用的C語言開發(fā)工具的特點(diǎn).3.編寫移植代碼.4.進(jìn)行移植的測試5.針對(duì)項(xiàng)目的開發(fā)平臺(tái),封裝服務(wù)函數(shù).首先,是芯片的中斷處理機(jī)制,如何開啟,屏蔽中斷,可否保存前一次中

一般采用的步驟:
1.深入了解所采用的系統(tǒng)核心
2.分析所采用的C語言開發(fā)工具的特點(diǎn).
3.編寫移植代碼.
4.進(jìn)行移植的測試
5.針對(duì)項(xiàng)目的開發(fā)平臺(tái),封裝服務(wù)函數(shù).
首先,是芯片的中斷處理機(jī)制,如何開啟,屏蔽中斷,可否保存前一次中斷狀態(tài),芯片是否有軟中斷或陷阱指令
已經(jīng)將圖片移植成功,是一件很快樂的事情.
現(xiàn)在要將網(wǎng)絡(luò)也加進(jìn)去,看一看,想什么辦法能夠辦到.
將lwip組織起來:
lwipopts.h
cc.h
timer.h
Timer0_Init(void)
Timer1_Init(void)
Delay10ms(unsigned short T) ;
Undefine_Init(void) ;
volatile 跟const 相反,可能在外界的影響下改變.編譯器不再對(duì)其進(jìn)行優(yōu)化.
關(guān)于時(shí)鐘中斷,可有對(duì)應(yīng)的例子,沒有什么關(guān)系,如果想把這兩個(gè)合并在一起不太可能,
因?yàn)橛布煌T了.
Timer0
Timer1 所有的都為了ucos-ii //time tick時(shí)鐘激發(fā).
SYSTEM CLOCK CONTROL ;
Main.c只是測試一個(gè)移植了,只能在串行口里輸出測試結(jié)果,但并不能表示它已經(jīng)完成了,對(duì)lwip移植任務(wù).
/******************************************************************************/
/--------------------------------/
/最后發(fā)現(xiàn)這只是一個(gè)應(yīng)用程序嘛:
/還沒有到初始化硬件的地步吧.
/--------------------------------/
lwip_Main.c 其中只有一個(gè)函數(shù),這個(gè)函數(shù)就可以完成你所要的lwip?
看看這個(gè)lwip_Main做了那些事情:
1.定義ip結(jié)構(gòu)體 struct ip_addr,netmask ,gw ;
2.定義信號(hào)量:sys_sem_t sem ;
3. 初始化一些東西.
初始化 TCP/IP 之前為何還需要實(shí)始化系統(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ù)很簡潔,但是何時(shí)使用httpd_init(void) ;
到現(xiàn)在還沒有發(fā)現(xiàn),有那些東西需要做的,
沒有步驟
App:應(yīng)用程序沒有必要在這里看,
因?yàn)槠渲幸恍〇|西,跟本就不必要的
而需要理解其中的實(shí)質(zhì),怎么把lwip移植成功?
另外可以借助原先一個(gè)例子,可以比較讀取,看是否已經(jīng)到了熟習(xí),或者可以用上派場上.
如果說lwip里沒有牽涉到硬件問題,那么我們可以把它當(dāng)一個(gè)庫來看待
現(xiàn)在要怎么去使用它的函數(shù),
另一方面,怎么樣來初始化其對(duì)應(yīng)的網(wǎng)絡(luò)接口:8019
問題關(guān)鍵不再放在這個(gè)上面,應(yīng)該更有意義的是看LPC2284.h里是怎么去實(shí)現(xiàn)的,
然后我們?cè)侔阉膶?shí)現(xiàn)過程移植s3c2440上去,可以看到結(jié)果的時(shí)候,就是照搬就快成功了.
而在lwip文件夾下的所有文件已經(jīng)實(shí)現(xiàn)了
這里的代碼一定是很比較穩(wěn)定的,已經(jīng)實(shí)現(xiàn)得比較好的.現(xiàn)在是實(shí)現(xiàn)它看看怎么樣讓調(diào)用起它來.
**************************************
如果目標(biāo)板的初始化,
一:在main里可能就只用到那一個(gè)函數(shù):
TargetInit() ---在圖片例子里也已經(jīng)完成了.不是必須的.
二:RTL8019
這個(gè)是網(wǎng)卡驅(qū)動(dòng):
要知道網(wǎng)卡的指針是怎么回事:
網(wǎng)卡的地址:
timer0_init()初始是什么事情?
現(xiàn)在關(guān)鍵問題在:s3c2440代替LPC2294
可不可以把這個(gè)封裝更簡單一些,以便使用更方便?
搞清里面的差別,另外看看,為什么要在LPC2294要用到Timer
原來有網(wǎng)卡驅(qū)動(dòng)需要:
處理計(jì)時(shí)器:
timeout()函數(shù)按受兩個(gè)參數(shù):
第一指向變量的指針,存儲(chǔ)了開始時(shí)間,
第二:保存了以秒計(jì)數(shù)的超時(shí)時(shí)間.當(dāng)超過超時(shí)間時(shí),該項(xiàng)函數(shù)觸發(fā)一個(gè)事件,
開始時(shí)間中重新寫入當(dāng)前時(shí)間并返
并返回一個(gè)非0值.
------------------------------------
應(yīng)該封閉起lwip,它已經(jīng)跟其它任何初始硬件無,
只要保證調(diào)用它的函數(shù)能夠起作用,正確使用它即可.
沒有必要去讀它里的任何一個(gè)文件,因?yàn)樗菂f(xié)議.
如果不對(duì)硬件初始化,那是不可能調(diào)用到lwip里的函數(shù)的.
注意:
1.可能要使用lwIP時(shí),會(huì)做成一個(gè)任務(wù),
還要給它分配優(yōu)先級(jí).Task.h
2.Target.c里去初始化網(wǎng)卡. 找出config.h,因?yàn)門arget.c里只引用了它.但是好像在config.h里并不怎么實(shí)現(xiàn)它.
3.雖然Timer很重要,但是我想沒有必要把它也拿出來細(xì)究,因?yàn)椴簧婕暗絣wip
4.
沒有看到有那個(gè)函數(shù)調(diào)用漢字打點(diǎn)函數(shù),
為何當(dāng)你調(diào)用Lcd_printf()時(shí)也可以出現(xiàn)漢字?
Uart_SendString(pUartMsg) ;
lcd.c:一個(gè)向lcd里發(fā)送,
printf.c一個(gè)向串行端口發(fā)送.
Nand.c沒有被使用到.
最好想法把所有無關(guān)的都剝離出來,然后把相關(guān)的分成塊.
可以像其它一樣:
1.初始化 :像 lcd,printf-Uart,[xxx_init()]
2.將那些相應(yīng)的函數(shù)放到任務(wù)里.不停執(zhí)行.
3.將在單獨(dú)文件里實(shí)現(xiàn)函數(shù).
4.函數(shù)里去調(diào)用lwip協(xié)議函數(shù).
-----------------------------------------------------
分作兩部分了.一部分是RTL8019,另一部分:lwip
-----------------------------------------------------
5.RTL8019對(duì)網(wǎng)卡的實(shí)現(xiàn)函數(shù).
6.lwip實(shí)現(xiàn)棧,調(diào)用其中的函數(shù)實(shí)現(xiàn)--棧.
------------------------------------
dm9000已經(jīng)在RTL8019實(shí)現(xiàn),UBOOT已經(jīng)有對(duì)dm9000實(shí)現(xiàn),可以包裝一下,
rtl8019_netif
最好就與主板上分離開,
只要網(wǎng)卡對(duì)應(yīng)地址是
權(quán)衡那一種更容易達(dá)到效果:
rtl8019一般不是在ARM上,沒有辦法知道其驅(qū)動(dòng),
而dm9000是驅(qū)動(dòng),卻又沒有與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ū)動(dòng)
在UBoot 里有DM9000驅(qū)動(dòng)即可用到.
需要以下幾個(gè)函數(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ā)送和接收兩個(gè)函數(shù)需要改動(dòng),
LWIP上層傳給low_level_output()的數(shù)據(jù)包,
將根據(jù)MSS和MTU等值切割成一個(gè)個(gè)的小包,分別填充到鏈表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定義了針對(duì)DM9000網(wǎng)絡(luò)接口的一個(gè)結(jié)構(gòu)體
typedef struct
{
alt_lwip_dev_list lwip_dev_list; //與之關(guān)聯(lián)的設(shè)備鏈表
int base_addr; //寄存器的基地址
int irq; //中斷編號(hào)
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ū)動(dòng)起來,移植s3c2440加到其它程序一起.
焦海波那個(gè)有可能考慮.因?yàn)槟且恍懙谋容^完整,但總是低估了它的難度.
果然,焦已經(jīng)形成文檔了
下載下來看看,或許有解的機(jī)會(huì).
移植被LwIP到一個(gè)新的目標(biāo)系統(tǒng)時(shí),只需要修改這個(gè)接口艱險(xiǎn)可,那個(gè)接口? sys_arch
操作系統(tǒng)模擬層(sys_arch) 它在底層操作系統(tǒng)和LwIP之間提供了一個(gè)接口?
sys_arch需要為LwIP提供信號(hào)量(sem)和郵箱(mailboxes)
信號(hào)量是可以計(jì)數(shù)信號(hào)量,也可以二值信號(hào)量,---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中需要這樣的功能,則一定要實(shí)現(xiàn)這個(gè)函數(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 與硬件平臺(tái)以及編譯器相關(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
與平臺(tái)相關(guān)
LWIP_PLATFORM_DIAG(X)
memset() 如果編譯器不提供,這個(gè)文件一定要包含它的定義,即memset()

perf.h
sys_arch.h sys_arch.c的頭文件
整個(gè)移植所依賴的操作系統(tǒng)平臺(tái).
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)其它的定義不相沖突,如果全部換成一致也不見得好使用.
因?yàn)榉譃椴煌姆謮K移植的.
信號(hào)量操作函數(shù)
郵箱操作函數(shù):
特別注意:投遞到郵箱中的消息只能是一個(gè)指針.
一:郵箱一次能夠接收多條消息比僅接收一條消息更加有效.
二:郵箱中的消息是一個(gè)指針.
__ilvSetLwIP()
實(shí)現(xiàn)網(wǎng)絡(luò)驅(qū)動(dòng)與LwIP的接口,是網(wǎng)絡(luò)系統(tǒng)得以順利運(yùn)轉(zhuǎn)的源動(dòng)力,它會(huì)告訴LwIP網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送出口,建立網(wǎng)絡(luò)數(shù)據(jù)的接收入口并實(shí)現(xiàn)
接收入口與LwIP處理入口的對(duì)接.
當(dāng)?shù)讓泳W(wǎng)絡(luò)收發(fā)設(shè)備進(jìn)入正常工作狀態(tài),網(wǎng)絡(luò)數(shù)據(jù)能夠正常流入流出LwIP后,這個(gè)函數(shù)進(jìn)行的工作會(huì)結(jié)束.
我需要一款純的Lwip源代碼,可能都是別人移植了后,影響到我的思路.
下載一個(gè)原版的后,不用再去查看別人移植的,現(xiàn)在的工作是怎樣先把這個(gè)lwip先移植到uCos-ii里去,
暫時(shí)還不讓它跑起來,按照常規(guī)的想法是把其思路先移植上去再說.看看有什么效果.再實(shí)現(xiàn)驅(qū)動(dòng).
采用一個(gè)干凈的lwip源碼是很有用處的.
一:可以就此完全不用顧及別人的移植思路,
二:自己移植出錯(cuò)容易找出來,
三:用時(shí)會(huì)快一些.
實(shí)際上這些都是在這里操作.
LwIPEntry.c這個(gè)文件也像LwIP_main.c文件一樣.是重中之重.
沒有把硬件東西提取來,有點(diǎn)過失,
如果再把其中的東西提取來,就有點(diǎn)更直接的效果.
ethernetif_init()初始化底層接口:
Lwip作者已經(jīng)幫我們完成大部分工作,我們只要把框架內(nèi)完成與底層硬件相關(guān)的部分即可.
ethernetif 是一個(gè)結(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)先級(jí),最好定為最高優(yōu)先級(jí),如果確定存在更高優(yōu)先級(jí),一定要讓更高優(yōu)先級(jí)任務(wù)占用CPU使用權(quán)時(shí)間不能太長,
否則將嚴(yán)重影響網(wǎng)絡(luò)性能.
ethernetif.c是硬件的抽象層.
實(shí)現(xiàn)了它,不一定可以,還需要硬件驅(qū)動(dòng).
lib_emac.c專門用來建立驅(qū)動(dòng)函數(shù):
硬件驅(qū)動(dòng):它不僅包括EMACInit()
EMACReadPacket() EMACSendPacket() 分別負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)包的接收和發(fā)送.
這個(gè)已經(jīng)在處理硬件了.
怎樣使用硬件工人和順利就得有這么一種慢慢使用的過程了.
所以網(wǎng)卡的實(shí)現(xiàn)也只有三個(gè)函數(shù)嗎?
EMACInit()
EMACReadPacket()
EMACSendPacket()
怎樣把問題簡化:
1.lwip
2.dm9000
3.lwip->ucosii 這個(gè)可以暫時(shí)搞定: ---------------------返正先把這個(gè)搞定再說.-------------------
4.lwip->dm9000
lwip->dm9000詳細(xì)問題,要解決幾個(gè)問題:
1.EMAC發(fā)送和接收中斷處理函數(shù) --dm9000看看中斷處理函數(shù).
2.EMACSendPacket 發(fā)送
找來找去沒有發(fā)現(xiàn)什么新的東西可以模仿,不如自己寫一個(gè).
首先把LwIP移植之后再說,其它的就不必太在意.
先把一步做完,
然后再考慮網(wǎng)絡(luò)驅(qū)動(dòng)的問題.
文件結(jié)構(gòu)也很重要,不然可能有一些會(huì)搞混亂.
在此中間,焦海波采用了鏈表來構(gòu)建郵箱,
而我將采用另一種方式:隊(duì)列,讓隊(duì)列給uCOS-II去處理更好一些.
這樣把LwIP實(shí)現(xiàn)了后,再就是硬件網(wǎng)卡驅(qū)動(dòng).
首先添加LwIPEntry.c文件,
看來我在dm9000 花費(fèi)了太多心血,倒頭來還只是一個(gè)linux版的,而且一點(diǎn)進(jìn)展都沒有,
怎么辦?
我想把它搞掉.
算是移植完成了,但是沒有調(diào)試,因?yàn)榭赡苓€有許多錯(cuò)誤,要清除這些錯(cuò)誤,得一段時(shí)間.
怎么把平臺(tái)里的網(wǎng)絡(luò)相關(guān)函數(shù)抽象出來?
直接用到一些函數(shù),可以用來發(fā)送Ping Webpage 之類,看看,可不可以脫離硬件函數(shù).
怎么辦,ADS不可以直接加工程.
是否需要有更多了解.
我是怎么樣把我所做的添加上去呢?
難道像昨晚那樣一個(gè)一個(gè)添加?
其實(shí)文件夾跟本就不存于mcp工程里.
編譯已經(jīng)成功,但是一些應(yīng)該使用的功能可能還沒有達(dá)到你的要求,
現(xiàn)在的工作是怎樣把相應(yīng)的功能加進(jìn)去,即是怎樣把Lwip 棧協(xié)議加進(jìn)去,
實(shí)現(xiàn)通信.
出現(xiàn)的另外一個(gè)問題,為何在外部的驅(qū)動(dòng),沒法在lwip里調(diào)用,是否是因把dw9000加到了外面?
現(xiàn)在的問題只是:驅(qū)動(dòng)出現(xiàn)了問題,如果把驅(qū)動(dòng)處理好
可能一切都好辦了.
但驅(qū)動(dòng)如何才能添加上去.
因?yàn)槠渌尿?qū)動(dòng)看似很容易得到,但是不符乎我的芯片上的意思,
我決問自己寫dm9000的驅(qū)動(dòng).
有文檔,也有別人的例子,應(yīng)該比較容易一些.
編寫驅(qū)動(dòng)程序:
注意處理器所用的C編譯器使用"大端格式","小端格式"
只有兩個(gè)可以直接被除數(shù)處理器訪問的寄存器,
CMD 端口和DATA端口,
(DM9000中有許多控制和狀態(tài)寄存器) 訪問這些控制,狀態(tài)寄存器的方法:
1.將寄存器的地址寫到CMD端口
2.從DATA端口讀寫寄存器中的數(shù)據(jù).
1-3
新建一個(gè)試一試:
全部用新的就可以了,自己新建一個(gè)即立成功.沒有什么完成不了,
可能還是因?yàn)楹甑膯栴},
所以從dm9000x.h里把不必要的東西都裁減掉.
高位片選地址:
DM9000地址端口= 高位片選地址+300H+0H
DM9000數(shù)據(jù)端口= 高位片選地址+300H+4H
DM9000的高位片選地址將是多少?
0x90000A46
現(xiàn)在已經(jīng)編譯通過,
基本的修改已經(jīng)完成,怎么讓OS啟動(dòng)
雖然已經(jīng)移植完成了,但沒有調(diào)試,沒有看出來是否已經(jīng)成功還沒有定論
肯定還會(huì)有問題:
1.驅(qū)動(dòng)dm9000雖然完成了,但沒有測試,是否完備
2.LwIP棧協(xié)議還不一定移植成功,因?yàn)樯暾?qǐng)的空間還不明確.
3.添加的應(yīng)用程序可能存在一定的問題,如果沒有其它問題,應(yīng)用程序都可以順利執(zhí)行.
4.是否還需要添加httpd.c文件,讓其當(dāng)服務(wù),用來訪問,如果可以,則應(yīng)該一試,以防備其它的不成功,采取這個(gè)可以能過,
5.也算是網(wǎng)絡(luò)通順的一個(gè)實(shí)例.(但是有一個(gè)問題即是,這個(gè)是里面是否)
移植的方式很多,但要想成,得有一個(gè)章程.
如下是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)卡初始化是硬件文件里定義.
實(shí)際上都寫到這個(gè)文件里了,sys_arch.c
1.初始化網(wǎng)卡和網(wǎng)絡(luò)接口:
err_t init_ethernetif(struct netif*netif)
{
//初始化網(wǎng)卡
eth_init() ; //當(dāng)然在硬件文件里實(shí)現(xiàn)
ethernetif_init(netif); //初始化網(wǎng)絡(luò)接口,當(dāng)然也會(huì)在硬件文件里實(shí)現(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)建起來.這里使用單獨(dú)的線程執(zhí)行ethernetif_input() ;
sys_thread_new(ethernet_rev,(void*)0,TCPIP_THREAD_PRIO) ;
}
//那我看看我的移植,沒有初始化硬件.
我認(rèn)為焦海波之做法不可靠,他把郵箱分成多個(gè)郵箱,再用鏈表鏈起來,
而其實(shí)可以采有和OS系統(tǒng)里創(chuàng)建隊(duì)列,只建起隊(duì)列即可,操作也在對(duì)隊(duì)列實(shí)行
沒有必要再去創(chuàng)建多個(gè)郵箱鏈表.
總感到別扭,為什么采用那種方式?
是否可以改革,把之前的所想的都改掉呢?
如果可以通了,就好.但關(guān)鍵是不知道是否能通啊.
dm9000.c里實(shí)際上也只是有三個(gè)函數(shù):
重要的三個(gè)函數(shù):
DM9000_init()
eth_rx()
eth_send()
而給出定義為外部變量時(shí)也采用了同樣的方式:
extern DM9000_init()
extern eth_rx()
extern eth_send
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//一直沒有bootloader ,所以重新找了一個(gè).
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
雖然移植完成了,但是測試時(shí)候,連lcd,com都沒有成功,怎么辦?
是否因?yàn)檎{(diào)用了OS里的sys_thread_new 之后,也把其中的任務(wù)破壞了?
是否還有一種可能是因?yàn)殡p重使用了ethernet.c而另一個(gè)只是用了一個(gè)名字為:
ethernetif.c
所以要么就此脫離移植筆錄,
要么全部按移植筆錄來操作,而不另外添加任務(wù)新東西.
怎樣保持一個(gè)干凈的東西,需要對(duì)此做一些修整.
可以把DM9000里的驅(qū)動(dòng)先加進(jìn)去,而不使用LwIP看結(jié)果如何.
在DM9000.c里設(shè)一些可以返回值Uart_printf() ; 這樣的函數(shù),讓其運(yùn)行過來,看看結(jié)果如何?
即調(diào)試一樣的.如果DM9000驅(qū)動(dòng)成功,再把LwIP加進(jìn)去.
先讓這個(gè)跑起來:myucos.rar
是否思路不清晰,造成了多加了一些任務(wù)?
只專門研究-lwip1.1.3
要不把驅(qū)動(dòng)放到里去讓其運(yùn)行,看看結(jié)果,把它的每個(gè)函數(shù)都加進(jìn)去試.
ADS1.2是否可以不需要平臺(tái)調(diào)試呢?
先來看看模擬平臺(tái).模擬平臺(tái)沒辦法測試丟棄.
再把LwIP移植工作做成功,做到最簡單.
我讓他全部是光光的,什么都沒有,也不另添加什么新文件進(jìn)去.
兩個(gè)工程都基本完成,再燒到板子里試,看能不能跑起來,如果能,說明是兩者都沒破壞,

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉