LwIP在嵌入式系统中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0引言
嵌入式Internet是近几年随着嵌入式系统的广泛应用和计算机网络技术的发展而发展起来一项新兴概念和技术。
随着Internet的发展,各种设备都产生了连接性的需求,从冰箱到电表,似乎所有电器都需要连入互联网。
通过为现有嵌入式系统增加因特网接入能力来扩展其功能,以Internet为介质实现信息交互的过程,这就产生了嵌入式Internet技术。
由于嵌入式系统自身资源的限制,处理能力不如台式机强,而台式机上的TCP/IP的复杂性,使得处理通信协议成为嵌入式系统接入Internet的关键,也是嵌入式系统接入Internet的难点之一。
LwIP是一套用于嵌入式系统的开放源码的轻型TCP/IP协议栈,它实现了较为完备的IP、ICMP、UDP、TCP协议,具有超时时间估计、快速恢复和重发、窗口调整等功能。
LwIP在保持协议主要功能的基础上减少对RAM和ROM的占用,一般它只需要几十K的RAM和40K 左右的ROM就可以运行,很适合同μC/OS-II相配合用在嵌入式系统中。
1μC/OS-II操作系统的移植
μC/OS-II是一个专门用于嵌入式系统的实时操作系统,根据用户需要可以方便的进行移植、剪裁。
对于μC/OS-II操作系统的移植主要是对以下几个文件进行修改:
1.1OS_CPU.H文件
对于这个文件的修改主要包含三部分内容:
1)由于不同的处理器有不通的字长,所以在这个文件中定义了与编译器相关的数据类型;
2)设定了堆栈的单位,以及堆栈的增长方向;
3)定义了中断开关的宏以及任务切换的宏。
1.2OS_CPU_C.C文件
文件包含一个OSTaskStkInit()函数和若干hook函数,OSTaskStkInit()在创建任务时被OSTaskCreate()或OSTaskCreateExt()调用来初始化任务的堆栈结构。
系统hook函数在没有特殊需求的情况下只需要将其都实现为空函数即可。
1.3OS_CPU_A.ASM文件
文件中包含了OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()四个函数。
OSStart()多任务启动之后,负责从最高优先级任务的任务控制块(TCB)中获得该任务的堆栈指针SP,通过SP依次将CPU现场恢复。
OSCtxSw()实现任务级的任务切换,OSIntCtxSw()实现中断级的任务切换。
OSTickISR()实现中断定时产生功能。
2LwIP在μC/OS-II的移植
LwIP在操作系统中的移植主要是根据sys_arch.txt文件对sys_arch.c 文件进行编写。
sys_arch.c文件为LwIP提供信号量(semaphores)和邮箱(mailboxes)两种进程间通信方式(IPC)。
2.1信号量操作函数
LwIP中需要使用信号量在进程(任务)间通信,所以在sys_arch.c 中,应该实现信号量的处理函数:sys_sem_new()函数、sys_sem_free()函数、sys_sem_signal()函数和sys_arch_sem_wait()函数。
2.1.1sys_sem_new()函数
这个函数的作用是建立并返回一个新的信号量,参数count表示信号量的初始状态。
由于μC/OS-II中也提供了信号量,所以只需直接调用建立信号量的相关函数就可以了。
2.1.2sys_sem_free()函数
此函数的功能是释放一个信号量,参数sem为要释放的信号量。
其实现和上个函数类似,直接调用μC/OS-II中释放信号量的函数即可。
2.1.3sys_sem_signal()函数
此函数的功能是发送信号量,参数sem为要发送的信号量。
2.1.4sys_arch_sem_wait()函数
由于LwIP已经使用了函数名sys_sem_wait(),故此处采用sys_arch_sem_wait()函数名。
此函数的功能是等待信号量并阻塞进程,参数sem为要等待的信号量,timeout为需要等待的时间。
如果“timeout”参数非零,则进程需等待设定的时间(单位为毫秒);如果“timeout”参数为零,则进程必须等到信号量,否则它将一直阻塞。
如果“timeout”参数非零,这个函数的返回值为收到信号时已经等待的时间(单位为毫秒),如果在约定的等待时间内,并没有等待到信号量,返回值将是SYS_ARCH_TIMEOUT。
如果函数不需要等待信号量,其返回值将是零。
2.2邮箱操作函数
信号量在进程之间传递消息是实时的,一个任务发送,另一个任务接收。
LwIP使用消息队列(邮箱)来缓冲、传递数据信息,因此要在sys_arch.c中实现邮箱的结构sys_mbox_t。
邮箱用于消息传递,用户既可以将其实现为一个队列,允许多条消息投递到这个邮箱,也可以每次只允许投递一个消息,这两种方式LwIP都可以正常运作。
不过,前者更加有效。
投递到邮箱中的消息只能是一个指针。
其实,在μC/OS-II中已经实现了消息队列结构,但是没有提供对消息队列中消息的管理函数,因而不能直接使用,必须在此基础上重新实现。
为此,定义一个新的结构如下。
struct{
OS_EVENT*QueneP;
void*QueneMes[MAX_MESSAGE];
};
这个结构包含两部分:队列指针QueneP和队列中的消息QueneMes,其中MAX_MESSAGE表示最大消息数。
这样就可以利用μC/OS-II中消息队列管理函数来管理邮箱,用μC/OS-II中对内存管理函数来实现对邮箱中消息的创建、使用、删除和回收等,从而来完成LwIP的邮箱的功能。
有了sys_mbox_t,就可以建立一个sys_mbox_t类型的数组来实现邮箱。
2.3网络驱动的设计
嵌入式Internet系统的硬件千差万别,在系统中会使用到各种各样的网络控制芯片,这些芯片的硬件驱动程序差别很大,兼容性不强。
所以LwIP协议栈在设计时,网络驱动程序的编写就没有针对具体的网络芯片,只是提供了一个模板,/src/netif/ethernetif.c文件即为驱动的模板,为自己的网络设备实现驱动时应参照此模板。
在LwIP中可以有多个网络接口,每个网络接口都对应了一个struct netif,这个netif包含了相应网络接口的属性、收发函数。
LwIP调用netif的方法netif-> input()及netif->output()进行以太网packet的收、发等操作。
在驱动中主要做的,就是实现网络接口的收包、发包、初始化以及中断处理函数。
3系统测试
做完上面的移植修改工作以后,就可以在μC/OS-II中初始化LwIP,并创建TCP或UDP任务进行测试了。
这部分完全是C语言的实现的。
值得注意的是LwIP的初始化必须在μC/OS-II完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等OS相关的操作。
主程序中,创建了两个任务:优先级号为2的lwip_task()和优先级号为3的my_task()。
my_task()任务比较简单,就是实现了一个延时程序。
因为无论多么简单,它都会引起任务切换,任务切换后就由操作系统调度最高优先级任务的运行。
lwip_task()任务中,开始进行了硬件时钟和LwIP的初始化,后来创建了优先级号为6的(下转第48页)
LwIP在嵌入式系统中的应用
周一兵刘宪鹏
(南通广播电视大学技术中心,江苏南通226001)
【摘要】本文以μC/OS–II为操作系统内核,利用开源TCP/IP协议栈LwIP,使其具有TCP/IP通信功能,并通过测试,实际应用效果良好。
【关键词】μC/OS–II;TCP/IP;LwIP
. All Rights Reserved.
(上接第40页)
图1运行界面
tcpecho_thread 程。
实际上,tcpecho_thread()才是LwIP 的主线程。
多线程的Berkley API 也是基于这个线程实现的,即上面的tcpecho_thread
()线程也要依靠tcpip_thread 线程来与外界通信。
这样做主要是为了编程简单,结构清晰。
tcpecho_thread ()线程实现的是一个TCP echo 服务器。
首先使用netconn_new()函数建立一个连接后,这个连接被绑定在7号端口并且进入监听(LISTEN)状态,等待连接。
一旦一个远程主机连接进来,netconn_accept()函数将返回这个连接的netconn 结构。
只要这个结构不是NULL,则调用netconn_recv()函数接收一个netbuf,并通过netbuf_data()函数获取一个指向实际请求数据的指针。
然后调用netconn_write()函数,把收到的数据在放到conn 连接的发送队列中,直至收发完毕。
最后,连接结构也会在调用后被删除,连接被关闭。
编译运行后,用ping ip 地址命令可以得到响应。
说明协议已正确运行。
4结束语
本文利用LwIP 协议栈为基础,使μC/OS-II 嵌入式操作系统具有通信功能,为一般工业控制网络接入Internet 提供了一种解决方案。
对
嵌入式设备通过以太网能够与其他设备进行通信,具有一定的参考价值。
[责任编辑:杨扬]
0引言
随着近几年国家和地方政府相继出台了一系列整治土烧窑的政策和法规,以及化工行业蓬勃发展,对于环保型的套筒石灰窑需求比较大。
套筒窑换热器作为石灰窑的热交换装置,在窑的运行过程中,起着至关重要的作用,它保证着窑内的热量和气体流量的平衡,并很大程度上影响着生产的石灰质量,保证了整座窑的正常运行。
天津钢厂石灰窑、君正化工石灰窑等换热器,由于管束内的结瘤逐步增大造成堵塞,每半个月就要清理一次,为此,解决换热器管束结瘤问题成为了当务之急。
1换热器管束内结瘤的原因
换热器中换热管束的好坏决定了换热器的工作效率,由于换热管长时间处于冷热两种工作环境下,在进行气体热量交换的过程中,在热管束的管口及管内容易形成结瘤,堵塞换热管而降低了换热器的换热效率。
通过对换热器管垢分析,化验垢中成分主要成份氧化钙、碳酸盐以及少量的碱金属、碱土金属的氯化物盐;从中可以看出成份主要是成品灰和原料灰,通过套筒石灰窑的生产工艺的分析,发现换热器管束内结瘤形成的原因有以下几个方面:1)燃烧过程中的尘量过大,主要是原料在破碎后筛分过程中形成的原料粉尘和在煅烧过程中由于石灰石成分不均匀造成破碎形成的成品灰;2)粉尘经过换热器热交换时,管束内外温度差比较大,造成含粉尘的高温废气接触到低温的管束凝固在管壁上;3)管内废气流速较低,流速较低不易冲刷掉已结瘤的粉尘。
2应对措施
目前,有不少厂家为解决换热器管束结瘤方法是增加一台换热器作为备用,一旦发现换热器结瘤程度已影响生产马上切换备用换热器,对换下的换热器进行清理。
此种方法虽避免了停产,但人工清理换
热器也会发生成本,同时对换热器的管束造成损伤。
通过上节对换热器管束结瘤的分析,可以在生产工艺上采取以下应对措施来解决问题:
1)原料运输到工厂后需要水洗,风干后的原料进入窑内时需要经过筛分,在振动筛分机上安装一排压缩空气喷嘴,吹扫原料石灰石,同时在振动筛分机上安装除尘设备,这样就能保证原料灰不会进入窑内,也就不会循环到换热器中。
2)增加废气的流量,提高换热器换热效果,使得管束内外的温差不要太大,常规的是废气温度是700度,这个温度是不能改变的,而换热器管束外的温度(出口温度)是430度,如果增加废气流量就会提高出口温度,就可以较少温度差,一般可以增加到500度左右,温差就只有200度,热粉尘就不容易凝固到管壁上了。
出口温度太高也不行,要考虑到出口阀门耐温度。
3)为增加换热器管束内废气流速:方法一是,增加废气流量;方法二是,在换热器管束上方增加一块导流板,导流板的孔相对于管口小一点,同时管束与导流板应间隔20毫米,管口变小,废气到管束的流速瞬加增大了,管束口就不容易结瘤,因为大部分的管束结瘤灰是从管束口开始形成的。
4)在换热器上方增加一套在线清灰装置,在线清灰装置组成是空气炮或用脉冲阀加空气包,主要的原理是压缩空气循环间断式喷吹到管束上,当管束内的结瘤将要形成时,压缩空气瞬间吹打,将结瘤击碎。
但要注意的是吹入的压缩空气量不能太大,否则会影响换热效果。
3结语
天钢石灰窑经过一段时间的实际生产使用,较好的解决了换热器管束结瘤的问题,同时整个系统运行可靠,对石灰窑的达产达标起到了保障作用。
[责任编辑:王迎迎]
石灰窑换热器管束内结瘤的原因及应对措施
高玉弟
(上海宝冶建设工业炉工程技术有限公司,中国上海200941)
【摘要】套筒石灰窑因换热器管束内结瘤影响了正常生产,本文分析了结瘤的原因及通过对套筒石灰窑的生产工艺的分析,并采取相应的应对措施。
【关键词】石灰窑;换热器管束;结瘤
. All Rights Reserved.。