新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IPv6的嵌入式設(shè)計(jì)與實(shí)現(xiàn)

IPv6的嵌入式設(shè)計(jì)與實(shí)現(xiàn)

作者: 時(shí)間:2009-11-05 來(lái)源:網(wǎng)絡(luò) 收藏

(3)接收函數(shù)
在接收數(shù)據(jù)時(shí),網(wǎng)絡(luò)接口層接收函數(shù)Rec_Ethernet_Packed( )被下層以太網(wǎng)驅(qū)動(dòng)程序的數(shù)據(jù)接收函數(shù)Rec_Packet()調(diào)用。Rec_Ethernet_Packed()的作用根據(jù)以太類型值,調(diào)用不同的函數(shù),同時(shí)去除以太幀的頭部,將正確的 數(shù)據(jù)從NIC 的數(shù)據(jù)緩沖區(qū)內(nèi)發(fā)送到ARM 的接收緩沖區(qū)內(nèi)。Rec_Packet()函數(shù)通過(guò)讀取RTL8019AS的當(dāng)前寄存器CURR(寫(xiě)寄存器)和邊界寄存器BNRY(讀寄存器)的值來(lái)確定是否有新數(shù)據(jù)的到來(lái),若有新數(shù)據(jù)到來(lái),則設(shè)置數(shù)據(jù)地址和數(shù)據(jù)長(zhǎng)度,然后啟動(dòng)遠(yuǎn)程DMA 將接收緩沖環(huán)中的以太網(wǎng)幀送交給上層。
2 TCP/ 協(xié)議棧的
2.1 TCP/ 協(xié)議棧處理流程
如圖1 所示,TCP/IPv6 協(xié)議接收數(shù)據(jù)包的過(guò)程就是解析數(shù)據(jù)包的過(guò)程。首先由底層處理函數(shù)解析數(shù)據(jù)包,根據(jù)類型,將去掉幀首部的數(shù)據(jù)包分配到緩沖區(qū)BUF 中,接著由IP 協(xié)議處理程序繼續(xù)解析。IP 協(xié)議處理程序?qū)?shù)據(jù)包解析后,將數(shù)據(jù)交給TCP 或ICMPv6 協(xié)議處理程序。嵌入式TCP/IPv6 協(xié)議棧發(fā)送數(shù)據(jù)包的過(guò)程是封裝數(shù)據(jù)包的過(guò)程,數(shù)據(jù)經(jīng)過(guò)某層協(xié)議的處理,就會(huì)在數(shù)據(jù)包首部增加某種格式的首部。

本文引用地址:http://butianyuan.cn/article/152302.htm

2.2 軟件
首先做如下類型定義:
#define PROTO_ICMP 58 #define PROTO_TCP 6 #define ICMP_ECHO_REPLY 129 #define ICMP_ECHO 128 芯片接收到數(shù)據(jù)包后,放入緩沖區(qū)BUF 中交由上層協(xié)議處理。然后對(duì)數(shù)據(jù)包進(jìn)行判斷。過(guò)程下:for(c=0;c8;c++)
if(BUF->destipaddr[c] != hostaddr[c])
{ STAT(++stat.ip.drop);

goto drop; } 接收數(shù)據(jù)包后,檢查下一個(gè)報(bào)頭中的協(xié)議類型,如果是TCP 或ICMP 協(xié)議,則分別轉(zhuǎn)向其處理程序,否則丟棄。
if(BUF->proto == PROTO_TCP) /* Check for TCP packet.If so,jump to the tcp_input label.*/
goto tcp_input;

if(BUF->proto = PROTO_ICMP) /*Check for ICMP packet.If so,jump to the icmp_input label.*/ goto icmp_input; goto drop;
3 IPv6 在ARM 中的移植
IPv6協(xié)議棧在時(shí)就考慮到了移植問(wèn)題,已把所有與硬件、OS、編譯器相關(guān)的部分獨(dú)立出來(lái)[4]。因此,IPv6 在本文研究的系統(tǒng)中的移植就是針對(duì)LPC2210 硬件平臺(tái)、uC/OS-II 操作系統(tǒng)和ADS1.2 的編譯器對(duì)其進(jìn)行相應(yīng)的修改。
1 數(shù)據(jù)類型定義
IPv6 的數(shù)據(jù)定義應(yīng)該與uC/OS-II 定義的數(shù)據(jù)長(zhǎng)度類型是一致的。
typedef unsigned char uint8;/* 無(wú)符號(hào)8 位整型變量*/
typedef signed char int8;/* 有符號(hào)8 位整型變量*/
typedef unsigned short uintl6;/* 無(wú)符號(hào)16 位整型變量*/
typedef signed short int16;/* 有符號(hào)16 位整型變量*/
typedef unsigned int uint32;/* 無(wú)符號(hào)32 位整型變量*/
typedef signed int int32;/*有符號(hào)32位整型變量*/
typedef float fp32;/* 單精度浮點(diǎn)數(shù)(32 位長(zhǎng)度)*/
typedef double fp64;/* 雙精度浮點(diǎn)數(shù)(64 位長(zhǎng)度)*/

2 操作系統(tǒng)相關(guān)部分

(1)信號(hào)量
IPv6 中需要使用信號(hào)量進(jìn)行同步。信號(hào)量實(shí)際上是一種約定機(jī)制,在多任務(wù)內(nèi)核中普遍使用。信號(hào)像是一把鑰匙,任務(wù)要運(yùn)行下去,得先拿到這把鑰匙。如果信號(hào)已被別的任務(wù)占用,該任務(wù)被掛起,直到信號(hào)被當(dāng)前使用者釋放。一般地說(shuō),對(duì)信號(hào)量只能實(shí)施三種操作:初始化(也可稱作建立)、等信號(hào)(也可稱作掛起)、給信號(hào)或發(fā)信號(hào)。信號(hào)量初始化時(shí)要給信號(hào)量賦初值,等待信號(hào)量的任務(wù)表應(yīng)清為空。想要得到信號(hào)量的任務(wù)執(zhí)行等待操作。如果該信號(hào)量有效(即信號(hào)量值大于0),則信號(hào)量值減1,任務(wù)得以繼續(xù)運(yùn)行。如果信號(hào)量的值為0,等待信號(hào)量的任務(wù)就被列入等待信號(hào)量任務(wù)表。多數(shù)內(nèi)核允許用戶定義等待超時(shí),如果等待時(shí)間超過(guò)了某一設(shè)定值時(shí),該信號(hào)量還是無(wú)效,則等待信號(hào)量的任務(wù)進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行,并返回出錯(cuò)代碼(指出發(fā)生了等待超時(shí)錯(cuò)誤)。任務(wù)以發(fā)信號(hào)操作釋放信號(hào)量。如果沒(méi)有任務(wù)在等待信號(hào)量,信號(hào)量的值僅僅是簡(jiǎn)單地加1。如果有任務(wù)在等待該信號(hào)量,那么就會(huì)有一個(gè)任務(wù)進(jìn)入就緒態(tài),信號(hào)量的值也就不加1。于是,鑰匙給了等待信號(hào)量的諸任務(wù)中的等待信號(hào)量任務(wù)中優(yōu)先級(jí)最高的任務(wù)、信號(hào)量處理函數(shù):
OSSemCreate / * 創(chuàng)建一個(gè)信號(hào)量* /
OSSemDel()/* 刪除信號(hào)量*/
OSSemPend()/* 等待信號(hào)量*/
OSSemPost()/* 發(fā)送信號(hào)量*/

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉