• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术文章 > IPv6的嵌入式设计与实现

IPv6的嵌入式设计与实现

录入:edatop.com     点击:

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()/* 发送信号量*/

(2) 消息队列

消息队列用于给任务发消息。通过内核提供的服务、任务或中断服务子程序可以将一条消息(该消息的指针)放入消息队列。同样,一个或多个任务可以通过内核服务从消息队列中得到消息。发送和接收消息的任务约定,传递的消息实际上是传递的指针指向的内容。通常,先进入消息队列的消息先传给任务[5],也就是说,任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO)。然而,uC/OS-II也允许使用后进先出方式(LIFO)。当一个以上的任务要从消息队列接收消息时,每个消息队列有一张等待消息任务的等待列表。如果消息队列中没有消息,即消息队列是空,等待消息的任务就被挂起并放入等待消息任务列表中,直到有消息到来。通常,内核允许等待消息的任务定义等待超时的时间。如果限定时间内,任务没有收到消息,该任务就进入就绪态并开始运行,同时返回出错代码,指出出现等待超时错误。一旦一则消息放入消息队列,该消息将传给等待消息的任务中优先级最高的那个任务,或是最先进入等待消息任务列表的任务。

2.3 库函数的实现

IPv6 协议栈中用到了6 个外部函数,这些函数通常与用户使用的系统或编译器有关。返回字符串长度、字符串比较、内存数据块之间的互相拷贝和内存中指定长度的数据块清零,4 个函数已由ADS1.2 中的运行时库提供,不需要再编写。因为网络数据采用的是大端数据存储[6] , 而LPC2210 是工作在小端,所以,在存取网络数据时要进行字节的交换。下面两个简单的函数需要实现: uintl6 swapw( uintl6 n); //16位数据高低字节交换

{ return(((n<<8)&0xff00)}((n>>8)&0x00ff)); } uint32 swapl(uint32 n);//32 位数据大小头对调{ return(((n << 24 & 0xff000000L) ) ((n +8) & 0x00ff0000L) ( ( n >> 8 ) & 0x0000ff00L) ( ( n >> 2 4 )&0x000000ffL)); }

3 结束语

该文详细描述了在嵌入式系统中如何实现IPv6 协议栈,使得在资源有限的嵌入式系统中实现IPv6 协议栈具有可能, 随着IPv6 技术及嵌入式技术的不断发展,可以用微型网关、微型路由器实现嵌入式网与互联网的通信,并最终使IPv6 技术应用于工业控制、家庭网络等各个领域.

本文作者创新点: 。通过分析IEEE 802.15.4 和IPv6 协议,在保证实现网络基本功能的前提下,着重研究了如何对复杂的TCP/IPv6 协议栈进行精简,并提出了一套可行的方案,此方案能够适应嵌入式系统的需要,然后用软件实现嵌入式系统中的精简的TCP/IPv6 协议栈,模块之间能够互相通信。

作者:应明峰,蔡瑞英 来源:微计算机信息

上一篇:串行通讯中的同步通讯和异步通讯
下一篇:基于1394的数据传输电路

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图