TCP/IP

http://blog.csdn.net/bekars/archive/2006/10/25/1350316.aspx

 

1 引言

目前,嵌入式系统已经广泛渗透到人们的工作、生活中。从家用电器、信息终端、手持通信设备到仪器仪表、制造工业、过程控制等领域,嵌入式设备已随处可见。另一方面,近几年来Internet技术的飞速发展给嵌入式应用带来了新的契机,在未来嵌入式系统中应用Internet技术具有很大的优势。

目前嵌入式Internet技术的实现主要有下面三种方式  :

第一种方式是EMIT技术,采用支持TCP/IP协议的高性能服务器作为网关(emGateway), 嵌入式设备通过RS-232、RS-485或者CAN总线等与网关服务器连接,间接通过服务器网关连接Internet。经过多年的发展EMIT技术已经在工业设备的网络化中得到了广泛的应用。但该技术也存在着以下的缺点:由于需要使用高性能的网关服务器,再加上emGateway网关的使用需要缴纳相应的版税,从而使得成本很高;而且网关和设备之间需要专门布线,在嵌入式设备比较分散的情况下极为不便,通信的距离、速度都受到一定的限制。

第二种方式是采用硬件协议栈芯片进行网络连接,比如Seiko公司的S7600,嵌入式MCU通过接口对其进行控制以达到Internet通信的目的,这时软件只需要增加一段和协议栈芯片通信的接口程序即可,因此开发难度小、周期短。其缺点是系统的硬件成本非常高,而且由于使用的是硬件协议栈,扩展不灵活。

第三种方式是在嵌入式MCU上用软件实现TCP/IP协议栈,然后通过网络接口芯片连接Internet。在这种方式中由于使用了软件协议栈使得嵌入式MCU本身具有了Internet通信能力,从而省去了高性能网关和硬件协议栈芯片,因此成本非常低,而且扩展起来非常方便灵活,再配上小型嵌入式实时操作系统的支持,就可以实现性价比很高的嵌入式多任务Internet平台。但是要在资源有限的16位甚至8位单片机上实现复杂的操作系统和网络协议栈有一定难度,但近年来随着单片机处理速度的不断提高和内部资源的不断扩展,再加上小型的实时操作系统和网络协议栈的相继推出,使得利用单片机来实现低成本嵌入式多任务网络平台成为可能。

基于以上背景,本文就来介绍应用在研究课题“低码率视频信号的网络传输”系统中的一种基于AVR单片机的多任务嵌入式网络系统软硬件平台的设计。

2 硬件平台设计

考虑到以太网接入方式技术成熟、可靠性高、通信速度快和成本低的优点,本系统的硬件平台采用单片机加以太网接口控制芯片组成。由于操作系统和协议栈需要用到大量的数据存储器,因此需要外扩RAM存储器。为了提高通信性能,单片机与以太网接口芯片之间采用并行总线扩展方式进行连接,接口芯片和外部的RAM存储器统一编址。本系统采用了可编程GAL器件ATF16V8进行地址译码,这样不仅可以充分利用地址资源,而且只需要修改ATF16V8的源程序即可实现地址的改变,提高了系统的扩展能力。系统的硬件平台的原理框图如图1所示。

硬件平台系统框图

                                      图1:硬件平台系统框图
 
单片机选用高性能的AVR单片机ATmega128。AVR是ATMEL公司结合了成熟的51系列和PIC系列单片机的优点而推出的高性能8位单片机,具有以下特点  :

性价比高: AVR单片机内部集成了8路10位的ADC、PWM、E2PROM、WDT、RTC等,具有了片上系统(SOC)的雏形,大幅度降低了系统的整体体积和成本。  速度快:AVR单片机采用了先进的RISC体系架构,大多数指令可以在一个时钟周期内完成,理论上速度可以达到1MIPS/MHz。而且具有只需要两个时钟周期的硬件乘法器。

 

接口丰富:AVR单片机除可以进行并行扩展外,还具有USART、SPI和I2C串行总线。

ISP&IAP:其内部的可擦写FLASH存储器不仅可以进行在线下载,而且具有片上的BOOT程序实现在应用可编程,真正实现同时读写操作。

开发方便:AVR是第一款真正为C语言开发设计的单片机,具有多种编译器。而且具有JTAG接口,可以进行在线调试。

低功耗:AVR单片机具有六种睡眠模式,可以最大程度的降低系统的功耗。

以太网接口控制芯片采用Realtek公司生产的以太网接口控制器RTL8019AS  ,其10M处理能力对于本课题需要的码率为4Mbps视频流的网络传输来说完全满足要求。另外8019AS片内集成了16KByte的RAM用作发送和接收的缓冲区,对其访问可以使用远程DMA方式,从而大幅提高接口的通信能力。需要注意的是,由于ATmega128数据总线是8位,RTL8019AS的IOCS16B引脚应当下拉接地以选择8位总线方式,而且JP引脚要接高电平以选择跳线模式。

地址译码采用的是ATF16V8,具体是把MCU地址线的高8位作为16V8的译码输入,16V8的3位输出作为译码片选输出:低端RAM(32KB)、高端RAM(32KB)和8019AS的片选。由于8019AS的地址空间仅需要32Byte,而且与高端RAM的地址重叠,为了给RAM分配尽可能多的地址空间,为8019AS分配顶部的256Byte,而把剩余的地址空间全部分配给RAM。上述译码的CUPL描述如下:

CS_RAM_L = ! A15;

CS_RAM_H = A15 & ! (A14 & A13 & A12 & A11 & A10 & A9 & A8);

CS_8019 = A15 & A14 & A13 & A12 & A11 & A10 & A9 & A8;

3 操作系统移植 

uC/OS-II是一个专门为中小型嵌入式应用设计的抢占式的实时操作系统内核,具有源代码公开、移植性好、可裁减、可固化、实时性和安全稳定性高的特点  ,非常适合本系统的应用。uC/OS-II的系统框图如图2所示。

uC/OS-II与硬件平台无关的代码文件:UCOS_CORE.C、UCOS_II.C等
 
uC/OS-II配置代码文件:INCLUDES.H 、OS_CFG.H
 
 
 
                     uc/os-ii的系统框图
                                            图2:uC/OS-II的系统框图
 


uC/OS-II

在设计之初就充分考虑了移植性,移植起来非常方便。从图2可以看出,与移植有关的只有3个文件:OS_CPU.H,OS_CPU_C.C和OS_CPU_A.S。

 

第1个文件是OS_CPU.H,其中主要定义了一些与编译器有关的数据类型、堆栈的生长方向、临界代码区的保护方式。需要说明的是uC/OS-II中临界代码区的保护方式有3种,本设计采用第3种,即在进入临界区之前把CPU状态寄存器SREG的内容保存到一个局部变量cpu_sr中,在退出临界区之后再还原SREG,这样做的好处是临界区保护不会对SREG产生影响。其中SREG的保存和返回函数必须由汇编语言来写,放在OS_CPU_A.S文件中。

第2个文件OS_CPU_C.C中主要是任务堆栈初始化函数OSTaskStkInit(),任务创建时调用此函数来初始化任务的堆栈结构。该函数一开始把传入的任务函数的指针存放到硬件堆栈的栈顶,看上去就像该函数在执行过程中发生了中断一样(低字节在先),这样返回后就可以从新的任务开始执行了。需要特别注意的是,在这个函数中必须把CPU状态寄存器SREG的值设为0x80,也就是全局中断使能,否则系统将崩溃。

最后一个文件OS_CPU_A.S是一个汇编源文件,主要定义了6个汇编函数。首先是临界区保护用到的SREG保存和恢复函数。然后定义的是OSStartHighRdy()函数,它只在系统启动时由OSStart()函数调用一次,所做的工作主要是让系统从最高优先级的任务开始执行,实现的方法和后面要介绍的OSCtxSw()函数相似。OSCtxSw()函数实现的是任务级的切换,首先把当前的任务的状态保存到其任务控制块TCB中,然后把当前优先级最高的任务的TCB中的内容加载到工作寄存器中,这样函数返回后就可以从此任务开始执行了。接下来的OSIntCtxSw()函数实现的是中断级的任务切换,它和OSCtxSw()函数的唯一不同是它是在中断中调用的,因此不需要保存工作寄存器的内容,剩下的和任务级的切换过程完全一样。最后一个定义的是节拍时钟的中断服务子程序,在这个函数中的开始要令中断欠套全局变量加1,并且调用时钟管理函数OSTimeTick(),中断退出时调用系统提供的中断退出函数OSIntExit()。

4 网络平台设计

LwIP是一套专门为嵌入式系统设计的源码开放的轻型协议栈,最新版本是LwIP1.1.0。LwIP在保持TCP/IP协议基本要求的前提下,通过层与层之间共享内存,避免了许多繁琐的复制处理,这样做虽然破坏了严格的分层思想,但却大幅度地节省了代码和数据存储空间,因此非常适合嵌入式应用。与其他轻型协议栈不同的是,LwIP不仅支持一般的网络协议,比如UDP协议、DHCP协议、PPP协议等,而且还支持多网络接口、IPv6和标准API  。

                        lwip运行机制

                                      图3:LwIP运行机制

4.1 LwIP在uC/OS-II上的移植

针对uC/OS-II和AVR的ICC编译器,LwIP的移植只需要编写arch文件夹下的3个文件——cc.h、sys_arch.h和sys_arch.c。其中cc.h中有与CPU和编译器有关的定义,包括数据结构和大小端存储方式等。其中关键代码区的保护用uC/OS-II中的相应函数替换一下即可。剩下的两个与操作系统有关的文件是移植工作的重点。

为了增强移植性,LwIP专门把和操作系统有关的数据结构和函数放在一起组成操作系统封装层,为诸如定时、进程同步和消息传递等操作系统服务提供统一的接口,移植时仅需针对不同的操作系统来实现特定的操作系统封装层,这些是由sys_arch.h和sys_arch.c实现的。其中sys_arch.h主要定义与操作系统相关的数据结构——信号量、邮箱和进程号,这些在uC/OS-II中都有对应的实体,要注意的是LwIP中的邮箱对应于uC/OS-II中的消息队列。

 

sys_arch.c中要实现和操作系统有关函数的定义,包括系统的初始化以及信号和邮箱的操作——创建、删除、投递和等待,这些功能只需要用uC/OS-II中相应的函数进行重新封装即可。另外,TCP/IP协议栈中需要许多定时器的功能,这在LwIP中是用sys_timeout结构体队列和相应的函数实现的  。每个sys_timeout结构体包括本线程的timeout时间长度,以及超时后的回调处理函数

。sys_arch.c中sys_arch_timeouts()函数的功能就是返回当前进程所对应的sys_timeout结构体队列的头指针。本系统用的方法是在系统初始化的时候根据最大的LwIP进程数创建一个sys_timeout结构体指针的数组,以后每创建一个LwIP进程其优先级都从一个连续的已知区间进行分配,sys_arch_timeouts()函数通过调用OSTaskQuery()函数获得进程的优先级进而获得对应的sys_timeout结构体队列的头指针。

 

4.2 RTL8019AS驱动程序的编写

RTL8019AS驱动程序做的工作主要是8019AS的初始化、发送和接收以太网数据包。

初始化函数rtl8019_init()是在添加以太网络接口时由netif_add()函数调用,调用过程中首先初始化此接口对应的全局网络接口结构体,然后设置8019AS的各功能寄存器  。初始化完8019AS之后调用arp_init()函数启动ARP功能,然后用sys_timeout()函数启动ARP缓冲列表生命周期的定时器。

数据包的发送首先从ARP缓冲队列中查找目的MAC地址,然后构造以太网数据帧的头部,最后调用底层的发送函数low_level_output()将数据帧发送出去。如果找不到对应的IP/MAC项,发送ARP请求数据帧。数据包的接收由中断处理函数rtl8019_ISR()调用,它的执行过程是先调用最底层的接收函数low_level_input()从8019AS中接收数据帧,如果接收的是IP数据包,则更新ARP缓冲队列并把数据包传给网络接口结构指定的函数进行处理。如果接收的是ARP数据包,则调用etharp_arp_input()函数处理。为了提高性能,最底层的接收发送函数采用的都是8019AS的远程DMA工作方式  。

5 总结

嵌入式设备与Internet的结合代表着嵌入式系统的未来发展方向,目前已有不少科研机构和公司纷纷加入了嵌入式Internet技术的研究行列。在这种背景之下,本文设计了一种基于8位AVR单片机的多任务嵌入式Internet系统平台,并且已经应用在研究课题“低码率视频信号的网络传输”系统中,对于嵌入式Internet技术的推广应用具有参考意义。本文作者创新点:将实时嵌入式操作系统和轻型TCP/IP协议栈结合起来,应用在8位AVR单片机上,实现了低成本的多任务嵌入式网络系统平台。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AVR单片机嵌入式系统原理与应用践 内容简介 本书以ATMEL公司新一代AVR系列单片机中的ATmegal6为蓝本,由浅人深,软硬结合,全面系统地介绍了以AVR为核心构成的单片机嵌入式系统的原理与结构,开发环境与工具,各种接口与功能单元应用的硬件设计思想和软件编写方法,以及系统调试与仿真等内容。本书在结构编排和内容选择方面与一般传统单片机教材有所不同。全书以夯基础,面向应用,理论与践、方法与实现紧密结合为主线展开,在充分发挥AVR的运行速度快,内部资源丰富,功能强大等显著特点的基础上,结合最新嵌入式系统开发和应用技术的发展,遵照单片机嵌入式系统研发的基本步骤和思路,采用从简单到复杂、循序渐进、螺旋式上升的方式进行编排。 目录 第1篇 基础与入门 第1章 单片机嵌入式系统概述 1.1 嵌入式系统简介 1.1.1 嵌入式计算机系统 1.1.2 单片机嵌入式系统 1.1.3 单片机的发展历史 1.1.4 单片机的发展趋势 1.2 单片机嵌入式系统的结构与应用领域 1.2.1 单片机嵌入式系统的结构 1.2.2 单片机嵌入式系统的应用领域 1.3 AVR单片机简介 1.3.1 ATMEL公司的单片机简介 1.3.2 AVR单片机的主要特点 1.3.3 AVR单片机系列简介 1.3.4 AVR与51单片机 思考与练习 第2章 AVR单片机的基本结构 2.1 单片机的基本组成 2.1.1 单片机的基本组成结构 2.1.2 单片机的基本单元与作用 2.2 ATmegal6单片机的组成 2.2.1 AVR单片机的内核结构 2.2.2 ATmegal6的特点 2.2.3 ATmagel6的外部引脚与封装 2.3 ATmegal6单片机的内部结构 2.3.1 中央处理器CPU 2.3.2 系统时钟部件 2.3.3 CPU的工作时序 2.3.4 存储器 2.3.5 I/O端口 2.4 存储器结构和地址空间 2.4.1 支持ISP的Flash程序存储器 2.4.2 数据存储器SRAM空间 2.4.3 内部EEPROM存储器 2.5 通用寄存器组与I/O寄存器 2.5.1 通用寄存器组 2.5.2 I/O寄存器 2.5.3 状态寄存器和堆栈指针寄存器 2.6 ATmegal6单片机的工作状态 2.6.1 AVR单片机最小系统 2.6.2 AVR的复位源和复位方式 2.6.3 对AVR的编程下载 2.6.4 ATmegal6的熔丝位 2.6.5 AVR单片机的工作状态 2.6.6 支持ISP编程的最小系统设计 2.7 AVR单片机内部资源的扩展和剪裁 思考与练习 第3章 AVR的指令与汇编系统 第4章 AVR单片机的系统设计与开发工具 第5章 战练习(一) 第二篇 基本功能单元的应用 第6章 通用I/O接口的基本结构与输出应用 第7章 中断系统与基本应用 第8章 定时/计数器的结构与应用 第9章 键盘输入接口与状态机设计 第10章 模拟比较器和ADC接口 第11章 战练习(二) 第3篇 串行接口与通信 第12章 串行数据接口概述 第13章 异步通信与USART接口基础 第14章 USART用设计基础 第15章 串行SPI接口应用 第16章 串行TWI(I2C)接口应用 第4篇 进入战 第17章 AVR片内资源应用补遗 第18章 迎奥运倒计时时钟设计例 附录A ATmegal6熔丝位汇总 附录B AVR-51多功能验开发板电原理图 附录C 本书所附光盘内容简介 参考文献
1. 由于ATmega16的RAM资源很少,所以在OS_CFG.H中关闭所有不必要的功能,同时优化代码,减少RAM占用 在os_core.c中,有两个数组: INT8U const OSMapTbl[8]与 INT8U const OSUnMapTbl[256],虽然声明为const类型,但是avr-gcc并不会将其放置在flash中,必须加以修改为INT8U const OSMapTbl[8] PROGMEM 与INT8U const OSUnMapTbl[256] PROGMEM ,同样的,该文件中访问这些数组的语句也必须做相应的修改。这样的结果是速度会受到影响,但是由于仍然是查表操作,任务切换的时间还是确定的。 2. 任务说明 系统中一共有5个用户任务:Task1-Task5,其优先级依次为1,2,3,5,4。每个用户任务的堆栈均为OS_USER_TASK_STK_SIZE(定义于os_cfg.h,目前为64字节)。 系统中建立有一个信号量T2sem与一个邮箱Tmbox。 Task1完成了Timer0的初始化,并打开了定时器中断,使得任务调度可以正常进行。此后,该任务只隔一个很短的时间使得变量t1增加,同时取反PORTB.1。 Task2初始化了Timer2,并使能了Timer2中断,然后任务挂起,等待信号量T2sem,如果等到且无错误,则使得变量t2增加。 Task3使得PD2上出现一个脉冲,以触发INT0,并使得变量t3增加。 Task4使得PD3上出现一个脉冲,以触发INT1,并使得变量t4增加。 Task5使得该任务挂起等待邮箱中有一条消息,如果取得消息,就将t5的值更新。 3. 中断系统 需要引用系统服务的中断,其底层部分被定义于AVRect.S中,中断的处理函数被定义于AVRisr.c中,例如例子中外部中断0与外部中断1的服务函数。 对于无需引用系统服务的中断函数,比如例子中的Timer2比较匹配中断,可以全部定义于AVRisr.c中。 Timer2的中断只是使得变量t6增加。 INT0的中断向任务发出信号量。 INT1的中断发送一个消息到信箱。 由于AVR的RAM有限,移植并未考虑中断重入的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值