基于嵌入式实时操作系统的现场总线网关的设计
(1) 嵌入式实时操作系统μC/OS-Ⅱ的移植;
(2) TCP/IP协议栈LwIP的移植;
(3)网络设备驱动程序。
l.LwIP协议栈的移植
为了使WorldFIP现场总线可以和Internet通信,在设计中必须把TCP/IP协议栈移植到μC/OS-Ⅱ操作系统中(μC/OS-Ⅱ移植将在后面介绍)。为了节省对系统资源的占用,设计中选用了开源的嵌入式TCP/IP协议栈——LwIP。LwIP协议栈是一个轻量的TCP/IP协议栈,一般只需要几十千字节的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。LwIP的源码可以到相关的网站上下载,目前的版本是0.6.3。LwIP的特性如下:
(1)支持多网络接口下的IP转发;
(2)提供专门的内部回调接口(Raw API)用于提高应用程序性能;
(3)可选择的Berkeley接API。
为了方便移植,LwIP协议栈把所有与硬件、OS、编译器相关的部分单独放在/src/arch目录下,因此移植时只需修改这个目录下的文件即可,其他源文件一般不需要修改。在移植的过程中,最主要的是和OS相关的一些函数和结构,这些函数和结构在arch目录下的sys_arch.h和sys_arch.c中定义和实现。主要有:
(l)sys_arch_timeout函数。
这个函数描述的是LwIP中与外界网络连接的线程等待超时timeout属性,该属性与OS相关。每个线程的timeout属性对应着一个在sys.h中定义的结构体sys_timeout,我们所要实现的是如下函数:
struct sys_timeouts * sys_arch_timeouts(void)
该函数的功能是返回目前正处于运行态的线程所对应的timeout队列指针。
(2)sys_sem_t信号量。
在LwIP中用信号量来实现同步,因此需要在sys_arch中实现sys_sem_t结构体和处理函数:
typedef OS_EVENT * sys_sem_t;
sys_sem_t sys_sem_new (lNT8U count);
void sys_sem_signal (sys_sem_t sem);
INTl6U sys_arch_sem_wait (sys_sem_t sem,INTl6U timeout);
void sys_sem_free (sys_sem_t sem);
μC/OS-Ⅱ已经实现了信号量的各种操作,而且功能和LwIP中的几个函数完全一样的,所以在LwIP中只需把μC/OS-Ⅱ中的函数封装打包。
(3) sys_mbox_t消息。
在LwIP中实现缓冲、数据传递要用到消息队列,所以在sys_arch中实现sys_mbox_t结构体和处理函数:
typedef struct
{
OS_EVENT * pQ;
void * pvQEntries [MAX _ QUEUE _ EN_ TRIES];
} sys_mbox_t;
sys_mbox_t;
sys_mbox_t sys_mbox_new (void);
void sys_mbox_post(sys_mbox_t mbox,void * msg);
INT16U sys_arch_mbox_fetch (sys_mbox_tmbox,void * * msg,INT16U timeout);
void sys_mbox_free (sys_mbox_t mbox);
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论