新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > IPv6的嵌入式設計與實現

        IPv6的嵌入式設計與實現

        作者: 時間:2009-11-05 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/152302.htm

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

        goto drop; } 接收數據包后,檢查下一個報頭中的協議類型,如果是TCP 或ICMP 協議,則分別轉向其處理程序,否則丟棄。
        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協議棧在時就考慮到了移植問題,已把所有與硬件、OS、編譯器相關的部分獨立出來[4]。因此,IPv6 在本文研究的系統中的移植就是針對LPC2210 硬件平臺、uC/OS-II 操作系統和ADS1.2 的編譯器對其進行相應的修改。
        1 數據類型定義
        IPv6 的數據定義應該與uC/OS-II 定義的數據長度類型是一致的。
        typedef unsigned char uint8;/* 無符號8 位整型變量*/
        typedef signed char int8;/* 有符號8 位整型變量*/
        typedef unsigned short uintl6;/* 無符號16 位整型變量*/
        typedef signed short int16;/* 有符號16 位整型變量*/
        typedef unsigned int uint32;/* 無符號32 位整型變量*/
        typedef signed int int32;/*有符號32位整型變量*/
        typedef float fp32;/* 單精度浮點數(32 位長度)*/
        typedef double fp64;/* 雙精度浮點數(64 位長度)*/

        2 操作系統相關部分

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

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


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 龙里县| 怀柔区| 全州县| 岑巩县| 焦作市| 松原市| 牟定县| 柳林县| 永州市| 白城市| 福鼎市| 茶陵县| 濮阳县| 松滋市| 邹城市| 佛山市| 井研县| 平安县| 贵阳市| 新龙县| 饶平县| 辉南县| 石景山区| 镇原县| 义马市| 获嘉县| 梅河口市| 大城县| 都兰县| 万宁市| 忻州市| 邵阳县| 图片| 新邵县| 长武县| 彭水| 东乌珠穆沁旗| 拜泉县| 平邑县| 珠海市| 色达县|