基于c语言的在嵌入式系统中以太网通信,基于μCOS-Ⅱ的嵌入式系统以太网通信功能的实现...

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

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

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

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); /内存中指

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值