首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
IPv6的嵌入式设计与实现
来源:本站整理  作者:佚名  2009-11-05 08:50:40




(3)接收函数
在接收数据时,网络接口层接收函数Rec_Ethernet_Packed( )被下层以太网驱动程序的数据接收函数Rec_Packet()调用。Rec_Ethernet_Packed()的作用根据以太类型值,调用不同的函数,同时去除以太帧的头部,将正确的IPv6 数据从NIC 的数据缓冲区内发送到ARM 的接收缓冲区内。Rec_Packet()函数通过读取RTL8019AS的当前寄存器CURR(写寄存器)和边界寄存器BNRY(读寄存器)的值来确定是否有新数据的到来,若有新数据到来,则设置数据地址和数据长度,然后启动远程DMA 将接收缓冲环中的以太网帧送交给上层。
2 嵌入式TCP/IPv6 协议栈的实现
2.1 嵌入式TCP/IPv6 协议栈处理流程
如图1 所示,嵌入式TCP/IPv6 协议接收数据包的过程就是解析数据包的过程。首先由底层处理函数解析数据包,根据类型,将去掉帧首部的数据包分配到缓冲区BUF 中,接着由IP 协议处理程序继续解析。IP 协议处理程序对数据包解析后,将数据交给TCP 或ICMPv6 协议处理程序。嵌入式TCP/IPv6 协议栈发送数据包的过程是封装数据包的过程,数据经过某层协议的处理,就会在数据包首部增加某种格式的首部。

2.2 软件实现
首先做如下类型定义:
#define PROTO_ICMP 58 #define PROTO_TCP 6 #define ICMP_ECHO_REPLY 129 #define ICMP_ECHO 128 芯片接收到数据包后,放入缓冲区BUF 中交由上层协议处理。然后对数据包进行判断。过程下:for(c=0;c<8;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()/* 发送信号量*/

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:162,972.70000 毫秒