>
首页 » 技术文章 » 基于uC/OS - II的嵌入式系统以太网通讯功能的实现

基于uC/OS - II的嵌入式系统以太网通讯功能的实现

作者:夏应清,付晓军  时间:2006-12-23 00:18  来源:
uC/OS-II 是一个源码开放的抢占式实时操作系统。它内核短小精悍、可裁减、执行时间确定。系统大部分代码采用C 语言编写,与硬件有关的部分都集中在两个文件中,给出了规范的接口说明,移植相当方便,可应用于目前大多数型号的8 位、16 位、32 位CPU。

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

本文所用的硬件系统结构如图1 所示。开发板是基于TMS320LF2407A 的含DSP 核微处理器和LAN91C111 以太网控制器。在成功移植了uC/OS-II的基础上进一步实现了以太网通讯功能。下面重点介绍TCP/IP 协议栈的引入和LAN91C111 驱动的编写。

TCP/IP 网络协议栈的引入

在uC/OS-II上引入下TCP/IP协议栈,由于嵌入式系统的硬件资源有限,必须使用小型协议栈。这种协议栈很多,LwIP 是其中之一。

关于LwIP 简介
L w I P 是瑞士计算机科学院(SCICS)的Adam Dunkels 等开发的一套用于嵌入式系统的开放源码的轻型TCP/IP 协议栈,LwIP 实现了较为完备的IP,ICMP,UDP,TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。LwIP在保持协议主要功能的基础上减少对R A M 和R O M 的占用,一般它只需要几十K 的R A M 和4 0 K 左右的R O M 就可以运行,很适合同?C /OS-II 相配合用在嵌入式系统中。

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


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

与操作系统相关部分
sys_arch.c 中的内容是与操作系统相关的一些结构和函数,主要分四个部分:
(1) sys_sem_t信号量
LwIP 中需用信号量通信,所以在sys_arch 中应实现信号量结构体和处理函数:structsys_sem_t{sys_sem_new( )//创建一个信号量结构sys_sem_free()//释放一个信号量结构sys_sem_signal( )//发送信号量sys_arch_sem_wait( )//请求信号量}由于?C/OS-II 已经实现了信号量OS_EVENT 的各种操作,并且功能和L w l P 上面几个函数的目的功能是完全一样的,所以只要把?C /OS-II 的函数重新包装成上面的函数,就可以直接使用了。
(2 )sys_mbox_t消息LwIP 使用消息队列来缓冲、传递数据报文,因此要在sys_arch 中实现消息队列结构sys_mbox_t,以及相应的操作函数。sys_mbox_new()//创建一个消息队列sys_mbox_free( ) //释放一个消
息队列sys_mbox_post( )//向消息队列发送消息sys_arch_mbox_fetch()//从消息队列中获取消息?C/OS-II 同样实现了消息队列结构及其操作,但是?C/OS-II 没有对消息队列中的消息进行管理,因此不能直接使用,必须在?C/OS-II的基础上重新实现。
(3)sys_arch_timeout函数L w I P 中每个与外界网络连接的线程都有自己的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);
在uC / O S - I I 中,没有线程(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);
intstrlen(constchar*str);//返回字符串长度
intstrncmp(constchar*strl,const
char*str2,intlen);//字符串比较
void bcopy(const void * src, void* dest, int len);//内存数据块之间的互相拷贝void bzero(void *data, int n); //内存中指定长度的数据块清零
类似于操作系统在硬件上的移植,LwIP 的移植也是根据实现的硬件以及操作系统对象,对相应的文件进行修改。整个通讯协议的引入可以很快实现。

LAN91C111 驱动的实现

在上面为?C/OS-II引入了TCP/IP 协议栈之后,为了实现以太网通讯功能还必须完成相关网络设备驱动程序的添加。LwIP 的网络驱动有一定的模板,其中s r c / n e t i f /ethernetif.c文件即为驱动的模板,用户为自己的网络设备实现驱动时应参照这个模板,根据相应的网络芯片来实现。本系统选用的网络芯片是由S M S C 公司生产的自适应10M/100M 第三代快速以太网控制器芯片L A N 9 1 C 1 1 1 ,集成了SMSC/CD 协议的MAC( 媒体层) 和PHY(物理层) 。由于其灵活性和集成度高,具有较高的性价比。

LAN91C111 工作流程比较简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命 令,LAN91C111 会自动把数据包转换成物理帧格式在物理信道上传输;反之芯片收到物理信号后自动将其还原成数据,并按指定格式存放在芯片R A M 中以便主机程序取用。简言之就是LAN91C111 完成数据包和电信号之间的相互转换:数据包←→ 电信号。LAN91C111 的编程主要包括:初始化、发送数据包、接收数据包三部分。
初始化
上电后,LAN91C111 内部的寄存器的值设置为缺省值,C P U 根据需要设置它里面的Configuration,Base和Individual Address寄存器,以保证它正确工作。

发送数据包流程
(1) D S P 向控制器发送A L L O C A T E M E M O R Y 命令( 设置M M U C O M 寄存器,通常设置0x0020) 。MMU 为待发送包在控制器内部的packet buffer中分配存储空间。

(2) DSP查询中断状态寄存器中的ALLOC INT 位,直到该位被置成1,也可以设置Interrupt Mask中的ALLOC INT 位,然后等待硬件中断,这时M M U 已经分配好存储空间。而且TX packet number 放在Allocation Result寄存器中。

(3)将Allocation Result寄存器中的packet number 拷贝到PacketNumber 寄存器中,设置Pointer 寄存器( 设置为TX,WR,AUTOINC,即0 x 4 0 0 0 )。然后将包的数据从upper layer发送队列传送到控制器的数据寄存器中。要求依次写人Status Word, Byte Count, destination address,source address,packet size,packet data,control word。

(4) D S P 向控制器发送"ENQUEUE PACKET NUMBER TOTX FIFO“命令( 设置MMUCOM 寄存器,通常设置Ox00C0),这个命令将Packet Number 寄存器中的packet number 拷贝到TX FIFO,说明发送的包已经放入队列中。同时设置Transmit control寄存器中的TXENA 位,启动transmitter。到目前为止,D S P 的设置工作完成,它可以IDLE,直到接收到一个控制器产生的发送中断。

(5) 当控制器传送完包以后,memory 中的第一个字(16bit)被CSMA/CD 写入相应的Status Word,然后将TX FIFO中的packet number移到TX completion FIFO,当TXcompletion FIFO 不为空时产生中断。

(6) DSP接收到中断后,开始执行中断处理程序,它读入中断状态寄存器,如果产生发送中断,则从FIFO ports 寄存器读入发送的包的Packet Number,并将它写到PacketNumber 寄存器。然后从内存中读入状态字(包括设置Pointer 寄存器为TX,RD,AUTOINC,即0x6000,然后从数据寄存器中读入包的状态字) ,它是EPH 寄存器的镜像,根据状态字判断包发送是否成功。如果成功,则D S P 向控制器发布R E L E A S E 命令( 设置M M U C O M 寄存器,设置为Ox00A0),控制器将释放发送包所使用的存储空间,同时设置TX INT Acknowledge 寄存器,它将TX completion FIFO中的packet number清除。

(7)使用“每发送一个序列的包产生一个中断”方案: 允许T XEMPTY INT 和TX INT ,AUTORELEASE = 1 ,当发送完FIFO 中的最后一个包后,产生T XEMPTY INT 中断。当发生严重的发送错误时,产生TX INT 中断,同时将发送失败的包的packet number保存到FIFO Ports 寄存器,这样DSP就可以知道发送过程停止了。这种方案可以减少DSP 的负担,而且存储空间的释放也更迅速。接收数据包流程
(1) DSP设置receive control寄存器中的R X E N 位,允许接收包。
(2)含有正确地址的包被接收到,从M M U 请求存储空间,并分派一个packet number,内部的DMA逻辑产生连续的地址,并将接收到的字写到memory 中,如果超界,包被丢弃,存储空间被释放。当检测到包的结束,状态字被写到接收包的最前面,byte count 写到第二个字。如果CRC 校验正确,p a c k e tnumber 被写到RX FIFO,由于RXFIFO 非空,产生RCV INT 中断;如果CRC 校验不正确,存储空间被释放,而且不产生中断。
(3) DSP接收到中断后开始执行中断处理程序,它读入中断状态寄存器,如果产生接收中断(RCV INT位为1),则可以从FIFO ports 寄存器得到接收的包的packet number,而且可以从数据寄存器将接收包传送到DSP 的内存或外存中。当处理结束,D S P 向处理器发布R E M O V EAND RELEASE FROM TOP OF RX命令( 即设置寄存器M M U C O M ,即0x0060) ,释放使用的存储空间和packet number。

软件的调试与验证

调试环境包括我们做的TMS320LF2407A+LAN91C111 板、PC 机、仿真器、网线等。首先,新 建工程,脱离操作系统和TCP/IP 协议的环境下, 单独调试通过LAN91C111 的驱动程序,初始化, 接收发送数据成功后,另建工程集合?C/OS-II 和LwIP 结合驱动程序进行调试,在?C/OS-II 中初始化LwlP,并创建TCP 或U D P 任务进行测试了。值得注意的是,LwIP 的初始化必须在?C/OS-II完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等O S 相关的操作。关键部分的代码和说明如下:
main(){
OSlnit();
OSTaskCreate(Iwip_init_task,N u l l , & I w i p - i n i t -stk[TASK_STK_SIZE-1],0);
......
OSStart();
}
主程序中创建了初始化LwIP任务Lwip_init_task(优先级0).Iwip_init_task任务中初始化硬件时钟和LwIP,还创建了tcpip_thread(优先级5)和tcpecho_thread(优先级6)两个任务。实际上tcpip_thread才是L w I P 的主线程,多线程的Berkley API也是基于这个线程实现的,即上面的tcpecho_thread线程也要依靠tcpip_thread线程来与外界通信,这样做的好处是编程简单,结构清晰。

编译运行后,用ping IP地址命令可以得到ICMP reply 响应。用telnet IP 地址命令可以看到echoserver 的回显效果。说明各协议都已正确运行,调试通过。

结语

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

相关推荐

浅析目前虚拟仪器监测系统的特点及优点

虚拟仪器  监测  2013-12-19

智能仪器仪表发展新趋势:虚拟仪器兴起

仪器仪表  虚拟仪器  2013-08-01

LabVIEW天下会广召天下英雄

NI  LabVIEW  2012-04-16

NI携手FIRST共同推出第二届FTC科技挑战赛

NI  FTC  LabVIEW  2012-03-14

nextboard助力中科大虚拟仪器实验室建设

NI全方位助力哈尔滨工业大学教学和创新实践

NI  虚拟仪器  CompactRIO  PXI  2011-12-12
在线研讨会
焦点