>
首页 » 业界动态 » 基于μCOS-Ⅱ的嵌入式系统以太网通信功能的实现

基于μCOS-Ⅱ的嵌入式系统以太网通信功能的实现

作者:  时间:2007-12-04 12:07  来源:

u c/os-ⅱ是一个源码开放的抢占式实时操作系统。它内核短小精悍、可裁减、执行时间确定。系统大部分代码采用c语言编写,与硬件有关的部分都集中在两个文件中,给出了规范的接口说明,移植相当方便,可应用于目前大多数型号的8位、16位、32位cpu。

u c/os-ⅱ提供的仅仅只是一个实时的调度及任务间通信的内核,没有集成网络协议。上网是当前嵌入式设备的广泛需求,本文讨论轻型tcp/ip协议栈的引入以及相关网络设备驱动程序,实现嵌入式系统的网络功能。

本文所用的硬件系统结构如图1所示。开发板基于tms320lf2407a的含dsp核微处理器和lan91c111以太网控制器。在成功移植了μcos-ⅱ的基础上进一步实现了以太网通讯功能。下面重点介绍tcp/ip协议栈的引入和lan91c111驱动的编写。

图1 嵌入式以太网硬件系统结构图

tcp/ip网络协议栈的引入

在μcos-ⅱ上引入下tcp/ip协议栈,由于嵌入式系统的硬件资源有限,必须使用小型协议栈。这种协议栈很多,lwip是其中之一。

关于}wip简介

lwip是瑞士计算机科学院(scics)的adam dunkels等开发的一套用于嵌入式系统的开放源码的轻型tcp/ip协议栈,但lwip实现了较为完备的ip,icmp, udp, tcp协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。iwip在保持协议主要功能的基础上减少对ram和rom的占用,一般它只需要几十k的ram和40k左右的rom就可以运行,很适合同μcos-ⅱ相配合用在嵌入式系统中。

lwip在设计时就考虑到了将来的移植问题,它把所有与硬件、操作系统、编译器相关的部分独立出来,放在/src/arch目录下,因此lwip在μcos-ⅱ上的实现就是修改这个目录下的文件,其它的文件一般不需要修改。下面分别予以说明:

协议栈的实现

·与cpu及编译器相关的include文件

/src/arch/include/arch目录下cc.h、cpu.h、perf.h中有一些与cpu或编译器相关的定义,如数据长度,字的高低位顺序等。这应该与用户实现μcos-ⅱ时定义的数据长度等参数一致。

·与操作系统相关部分

sys_arch.c中的内容是与操作系统相关的一些结构和函数,主要分四个部分:

(1)sys_sem_t信号量

lwip中需用信号量通信,所以在sys_arch中应实现信号量结构体和处理函数:struct sys_sem_t

{

sys_sem_new( )//创建一个信号量结构

sys_sem_free()//释放一个信号量结构

sys_sem_signal( )//发送信号量

sys_arch_sem_wait( )//请求信号量

}

由于μcos-ⅱ已经实现了信号量os_event的各种操作,并且功能和lwlp上面几个函数的目的功能是完全一样的,所以只要把μcos-ⅱ的函数重新包装成上面的函数,就可以直接使用了。

(2 )sys_mbox_t消息

lwip使用消息队列来缓冲、传递数据报文,因此要在sys_arch中实现消息队列结构sys_mbox_t,以及相应的操作函数。

sys_mbox_new()//创建一个消息队列

sys_mbox_free( ) //释放一个消息队列

sys_mbox_post( )//向消息队列发送消息

sys_arch_mbox_fetch( )//从消息队列中获取消息

μcos-ⅱ同样实现了消息队列结构及其操作,但是μcos-ⅱ没有对消息队列中的消息进行管理,因此不能直接使用,必须在μcos-ⅱ的基础上重新实现。

(3)sys_arch_timeout函数

lwip中每个与外界网络连接的线程都有自己的timeout属性,即等待超时时间。这个属性表现为每个线程都对应一个sys_timeout结构体队列,包括这个线程的timeout时间长度,以及超时后应调用的timeout函数,该函数会做一些释放连接,回收资源的工作.timeout结构体已经由lwip自己在sys.h中定义好了,而且对结构体队列的数据操作也由lwip负责,我们所要实现的是如下函数:

struct sys_timeouts*sys_arch_timeouts(void)

这个函数的功能是返回目前正处于运行态的线程所对应的timeout队列指针。timeout队列属于线程的属性,它是os相关的函数,只能由用户实现。

(4)sys_thread_new创建新线程

lwip可以是单线程运行,也可以多线程运行。为提高效率

并降低编程复杂度,就需要用户实现创建新线程的函数:

void sys_thread_new(void(*thread)(void*arg), void*arg);

在μcos-ⅱ中,没有线程(thread)的概念,只有任务(task)。它已经提供了创建新任务的系统api调用ostaskcreate,因此只要把ostaskcreate封装一下,就可以实现sys_hread_new.

·lib_ arch中库函数的实现

lwip协议栈中用到了8个外部函数,这些函数通常与用户使用的系统或编译器有关,因此留给用户自己实现,有关程序如下:

u16_t htons(u16_t n); //16位数据高低字节交换

u16_t ntohs(u16_t n);

int strlen(const char * str);//返回字符串长度

int strncmp(const char * strl,const char * str2,int len);//字符串比较

void bcopy(const void * src, void * dest, int len);//内存数据块之间的互相拷贝

void bzero(void *data, int n); //内存中指定长度的数据块清零

类似于操作系统在硬件上的移植,lwip的移植也是根据实现的硬件以及操作系统对象,对相应的文件进行修改。整个通讯协议的引入可以很快实现。

lan91c111驱动的实现

在上面为μcos-ⅱ引入了tcp/ip协议栈之后,为了实现以太网通信功能还必须完成相关网络设备驱动程序的添加。lwip的网络驱动有一定的模板,其中src/netif/ethernetif.c文件即为驱动的模板,用户为自己的网络设备实现驱动时应参照这个模板,根据相应的网络芯片来实现。本系统选用的网络芯片是由smsc公司生产的自适应10m/100m第三代快速以太网控制器芯片lan91c111,集成了smsc/cd协议的mac(媒体层)和phy(物理层)。由于其灵活性和集成度高,具有较高的性价比。

lan91c111工作流程比较简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,lan91c111会自动把数据包转换成物理帧格式在物理信道上传输;反之芯片收到物理信号后自动将其还原成数据,并按指定格式存放在芯片ram中以便主机程序取用。简言之就是lan91c111完成数据包和电信号之间的相互转换: 数据包 电信号。lan91c111的编程主要包括:初始化、发送数据包、接收数据包三部分。

初始化

上电后,lan91c111内部的寄存器的值设置为缺省值,cpu根据需要设置它里面的configuration, base和individual address寄存器,以保证它正确工作。

发送数据包流程

(1) dsp向控制器发送allocate memory命令(设置mmucom寄存器,通常设置0x0020)。mmu为待发送包在控制器内部的packet buffer中分配存储空间。

(2) dsp查询中断状态寄存器中的alloc int位,直到该位被置成1,也可以设置interrupt mask中的alloc int位,然后等待硬件中断,这时mmu已经分配好存储空间。而且tx packet number放在allocation result寄存器中。

(3)将allocation result寄存器中的packet number拷贝到packet number:寄存器中,设置pointer寄存器(设置为tx,wr,autoinc,即0x4000)。然后将包的数据从upper layer发送队列传送到控制器的数据寄存器中。要求依次写人status word, byte count, destination address,source address,packet size,packet data,control word。

(4) dsp向控制器发送"enqueue packet number to tx fifo“命令(设置mmucom寄存器,通常设置ox00c0),这个命令将packet number寄存器中的packetnumber拷贝到tx fifo,说明发送的包已经放入队列中。同时设置transmit control寄存器中的txena位,启动transmitter。到目前为止,dsp的设置工作完成,它可以idle,直到接收到一个控制器产生的发送中断。

(5)当控制器传送完包以后,memory中的第一个字(16bit)被csma/cd写入相应的status word,然后将tx fifo中的packet number移到tx completion fifo,当tx completion fifo不为空时产生中断。

(6) dsp接收到中断后,开始执行中断处理程序,它读入中断状态寄存器,如果产生发送中断,则从fifo ports寄存器读入发送的包的packet number,并将它写到packet number寄存器。然后从内存中读人状态字(包括设置pointer寄存器为tx,rd,autoinc,即0x6000,然后从数据寄存器中读入包的状态字),它是eph寄存器的镜像,根据状态字判断包发送是否成功。如果成功则dsp向控制器发布release命令(设置mmucom寄存器,设置为ox00a0),控制器将释放发送包所使用的存储空间,同时设置tx int acknowledge寄存器,它将tx completion fifo中的packet number清除。

(8)使用“每发送一个序列的包产生一个中断”方案:允许tx empty int和tx int, autorelease=1,当发送完fifo中的最后一个包后,产生tx empty int中断。当发生严重的发送错误时,产生tx int中断,同时将发送失败的包的packet number保存到fifo ports寄存器,这样dsp就可以知道发送过程停止了。这种方案可以减少dsp的负担,而且存储空间的释放也更迅速。

接收数据包流程

(1) dsp设置receive control寄存器中的rxen位,允许接收包。

(2)含有正确地址的包被接收到,从mmu请求存储空间,并分派一个packet number,内部的dma逻辑产生连续的地址,并将接收到的字写到memory中,如果超界,包被丢弃,存储空间被释放。当检测到包的结束,状态字被写到接收包的最前面,byte count写到第二个字。如果crc校验正确,packet number被写到rx fifo,由于rx fifo非空,产生rcv int中断;如果crc校验不正确,存储空间被释放,而且不产生中断。

(3) dsp接收到中断后开始执行中断处理程序,它读入中断状态寄存器,如果产生接收中断(rcv int位为1),则可以从fifo ports寄存器得到接收的包的packet number,而且可以从数据寄存器将接收包传送到dsp的内存或外存中。当处理结束,dsp向处理器发布remove and release from top of rx命令(即设置寄存器mmucom,即0x0060),释放使用的存储空间和packet number.

软件的调试与验证

调试环境包括我们做的tms320lf2407a+lan91c111板、pc机、仿真器、网线等。首先,新建工程,脱离操作系统和tcp/ip协议的环境下,单独调试通过lan91c111的驱动程序,初始化,接收发送数据成功之后,另建工程集合μcos-ⅱ和lwip结合驱动程序进行调试,在μcos-ⅱ中初始化lwlp,并创建tcp或udp任务进行测试了。值得注意的是lwip的初始化必须在μcos-ⅱ完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等os相关的操作。关键部份的代码和说明如下:

main(){

oslnit();

ostaskcreate(iwip_init_task, null, &iwip-init-stk[task_stk_size-

1 ], 0);

......

osstart();

}

主程序中创建了初始化lwip任务lwip_init_task(优先级0). iwip_init_task任务中初始化硬件时钟和lwip,还创建了tcpip_thread(优先级5)和tcpecho_thread(优先级6)两个任务。实际上tcpip_thread才是lwip的主线程,多线程的berkley api也是基于这个线程实现的,即上面的tcpecho_thread线程也要依靠tcpip_thread线程来与外界通信,这样做的好处是编程简单,结构清晰。

编译运行后,用ping ip地址命令可以得到icmp reply响应。用telnet ip地址命令可以看到echo server的回显效果。说明arp,icmp,ip、下cp协议都已正确运行,调试通过。

结语

按课题的需求,这套系统用于电力保护系统的现场板卡的管理与和上下位机的通讯,现场采集的数据经处理后,通过数据线路连接到该板(本文所讨论的系统)。由该dsp板集中进行管理并实现和上位机的通讯。该系统目前效果令人满意,并且可以根据课题的需要,灵活地进行扩展。还可用于智能家电等领域,具有很好的发展前景。

参考文献:

1. 刘和平, 严利平, 张学锋, 等. tms320lf240xdsp 结构、原理及应用[m].北京:北京航空航天大学出版社2002.1-2.

2. 刘国福,张屺,廖巍, dsp与以太网卡的接口技术研究.电子技术应用,2001(1);59~61.

3. jean j labrosse. 嵌入式实时操作系统μc/osⅱ[m] 北京:北京航空航天大学出版社,2003

4. 何轩,夏应清,李祥,基于以太网的的嵌入式系统网络接口卡的设计[j] 电子产品世界 2005(5):34-37

5. 姚鹰,蒋健,魏德骄,基于μcos-ⅱ的嵌入式系统的网络通讯实现[j] 工业控制计算机2004(12):32-34

相关推荐

统一通信必须要回归本质

IP  通信  2013-08-23

工业以太网市场需求上长 交换机产业机不可失

以太网  交换机  2013-07-16

芯片设计全程服务成国内企业切入IP布局关键点

芯片设计  IP  2013-07-01

Gartner公布2012全球IP厂商排名

ARM  IP  2013-06-14

Cadence宣布收购Tensilica

Cadence  IP  2013-03-13

力科推出100/10BASE-T 以太网解码软件

力科  以太网  示波器  2013-03-12
在线研讨会
焦点