最新日志

发表于:2008-7-22 10:11:04
标签:无标签

1

DSP的CMD文件配置详解(2812为例)

点击下载

DSP的CMD文件配置详解(2812为例)

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 整理

评论(0) | 阅读(70)
发表于:2008-7-18 16:31:31
标签:无标签

1

嵌入式实时操作系统μC/OS-II 在P89V51RD2中的移植

引言
  自嵌入式系统开发以来,很长时间都采用前后台系统软件设计模式:主程序为一个无限循环,单任务顺序执行。通过设置一个或多个中断 来处理异步事件。这种系统对于简单的应用是可以的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。μC/OS-II 是一种基于优先级的抢占式多 任务实时操作系统, 包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。而且它内核源代码公开,可移植性强,为编程人员提供了很好的一个软件平台。通过μC/OS-II在P89V51RD2 上的移植,可以掌握移植和测试μC/OS-II 的实质内容,很容易将其移植到其它的CPU平台上。

μC/OS-II 介绍

  μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部 分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到6 4位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很 多领域, 如 手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制 上。实际上,μC/OS-II已经通过了非常严格的 测试,并且得到了美国航空管 理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护。

μC/OS-II 内核结构

  多任务系统中,内核负责管理各个任务 ,或者说为每个任务分配CPU 时间 ,并且负责任务之间的通讯。内核提供的基本服务是任务切换。 μC/OS-II可以管理多达64个任务。由于它的作者占用和保留了8个任务,所以留给用户应用程序最多 可有56个任务。赋予各个任务的优先级必须是不相同的。这意味着μC/OS-II不支持时间片轮转调度法 (round-robin scheduli ng)。μC/OS-II为每个任务设置独立的 堆栈空间,可以快速实现任务切换 。μC/OS-II近似地每时每刻总是让优先级最高的就绪任务处于运行状态,为了保证这一点,它在调用系统API 函数、中断结束、定时中断结束时总是执行调度算法,μC/OS-II通过事先计算好数据简化了运算量,通过精心设计就绪表结构使得延时可预知。

P89V51RD2 微处理器介绍

  P89V51RD2是Philips公司生产的一款80C51微控制器,包含64KB Flash和1024字节的数据RAM。P89V51RD2的典型特性是它的X2方式选项。利用该特性,设计者可使应用程序以传统的80C51时钟频率(每个机器周期包含12个时钟)或X2 方式(每个机器周期包含6个时钟)的时钟频率运行,选择X2方式可在相同时钟频率下获得2倍的吞吐量。从该特性获益的另一种方法是将时钟频率减半来保持特性不变,这 样可以极大地降低EMI。Flash程序存储器支持并行和串行在系统编程(ISP),ISP允许在软件控制下对成品中的器件进行重复编程。应用固件的 产生/更新能力实现了ISP的大范围应用。 5V的工作电压,操作频率为0~40MHz。P89V51RD2的资源和ISP的功能使得它很适合用来做μC/OS-II的移植调试。并不需要购买仿真器和编程器等额外投资。

μC/OS-II 的移植

  移植就是使μC/OS-II能在P89V51RD2上运行。为了方便移植,大部分的μC/OS-II的代码是用C语言编写的;但是仍需要用C语言和汇编语言编写一些处理器硬件相关的代码,这是因为μC/OS-II在读/写处理器寄存器时,只能通过汇编语言来实现。由于μC/OS-II在设计时就已经充分考虑了可移植性,所以μC/OS-II的移植相对来说是比较容易的。

硬件平台构成

  由于P89V51RD2是一款80C51微控制器,片内包含了64KB的FLASH程序存储器,并且支持串行在线编程(ISP)。使它在ROM空间上很适合做μC/OS-II的移植。但是它片内RAM空间很有限,只有1KB,不能满足μC/OS-II对RAM的要求。但是由于P89V51RD2可以扩展RAM空间,使这一问题得以解决。我们为它扩展了一片32KB的RAM来构成移植μC/OS-II的硬件平台。这样P89V51RD2就满足了移植μC/OS-II的所有要求。

编译器的选择

  由于μC/OS-II绝大部分代码是用标准的C语言编写的,所以C语言开发工具对于μC/OS-II是必不可少的。由于μC/OS-II是一个可剥夺行的占先式内核,所以要求C编译器可以产生可重入型代码。笔者选择Keil C51集成开发环境作为开发工具。该开发工具有C编译器,汇编器和链接定位器等工具构成。链接器用来将不同模块(编译过或汇编过的文件)链接成目标文件,定位器则允许将代码和数据放置在目标处理器的指定内存中。Keil C51 还可以生成HEX格式的编程文件用于编程EPROM或是FLASH,同时可以实现完整软件仿真支持。Keil C51支持所有8051变种的微控制器。通过设置编译控制选项,它完全可以满足编译μC/OS-II源代码的要求。

可重入函数问题

  可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间后又可以继续运行,而相应的数据不会丢失。由于μC/OS-II是抢占式的实时多任务内核,同一个函数可能会被不同的任务调用,也可能会被中断,因此,移植μC/OS-II要求C语言编译器可以产生可重入函数。但是正常情况下Keil C51编译器中的函数不能重入。原因是由于8051系列微控制 器的硬件堆栈很小,硬件堆栈指针SP最多只能在内部256字节的RAM内移动,不能够指向64K的外部RA M空间。所以编译器使用固定的RAM地址来存储函数的参数和局部变量,而不是使用堆栈来存储。为了在Keil C51中实现可重入函数,可以使用“reentrant”关键字声明该函数是可重入的。编译器可根据编译模式为可重入函数在内部RAM或外部RAM空间开辟一个模拟堆栈来存储可重入函数的参数和局部变量。可重入函数的返回地址仍然保存在硬件堆栈中。Cx51编译手册不推荐使用模拟堆栈,原因是受8051寻址方式的限制,模拟堆栈访问的效率很低。但是这是在Keil C51中实现可重入函数的唯一方法。可重入函数模拟堆栈拥有独立于硬件堆栈指针的模拟堆栈指针。模拟堆栈及其指针在启动代码文件“STARTUP.A51”中定义和初始化。

μC/OS-II源文件移植

  在了解了P89V51RD2微处理器和Keil C51 编译器的技术细节的基础上,就可以开始μC/OS-II源文件移植的工作了。真正编写移植代码的工作就相对比较简单了。图1表示了基于μC/OS-II的应用的系统结构结构。由图1可以看出由于μC/OS-II自生的绝大部分代码是使用ANSI C编写的,而且代码的层次结构十分干净,与平台相关的移植代码仅仅存在于OS_CPU_A.ASM、OS_CPU_C.C以及OS_CPU.H这三个文件当中。下面分别解释各个文件在P89V51RD2上的移植。

  μC/OS-II中与处理器CPU 类型无关的代码:uCOS_II.H和uCOS_II.C,其中uCOS_II.C 文件包含以下文件:OS_CORE.C OS_TASK.C OS_TIME.C OS_SEM.C OS_MBOX.C OS_MUTEX.C 和OS_FLAG.C 也就是说原则上这些文件可以直接添加不用修改。但是由于Keil C51编译器的特殊性,这些代码仍要多处改动,因为Keil C51缺省情况下编译的代码不可重入而多任务系统要求并发操作导致重入,所以要在每个C 函数及其声明后标注reentrant 关键字,另外“pdata” 和“data” 在uCOS中用做一些函数的形参,但它同时又是Keil C51 的关键字,会导致编译错误。我通过把“pdata”改成“ppdata”,“data”改成“ddata”解决了此问题。OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy 这几个变量在汇编程序中用到了,为了使用寄存器R0或R1访问而不用DPTR,应该用Keil C51扩展关键字IDATA将它们定义在内部RAM中。

?OS_CPU.H的移植

  OS_CPU.H包括了用#define语句定义的、与处理器相关的常数、宏及类型。因为不同的处理器有不同的字长,所以μC/OS-II的移植包括的一系列数据类型定义,以确保其可移植性。μC/OS-II代码不使用语言中的short,int,及long等数据类型,因为它们是与编译器相关的,是不可移植的。采用定义的整形数据结构等既是可移植的,又很直观。参考Cx51编译手册,可以完成OS_CPU.H里所有数据类型的定义。

  与所有的实时内核一样,μC/OS-II需要先关中断,再处置临界段代码,并且在处置完毕后重新开中断。这样可以保护临界段代码免受多任务或中断服务子程序的破坏。为了隐藏不同编译器提供的不同的关中断和开中断的实现方法,增强可移植性,μC/OS-II在OS_CPU.H中定义了2个宏,来开中断和关中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。根据P89V51RD2的结构和Keil C51提供的方法,我们通过置位或清零中断允许位来实现。代码如下:

#define OS_ENTER_CRITICAL() EA="0"
#define OS_EXIT_CRITICAL() EA="1"
MCS-51 堆栈从下往上增长(1=向下0=向上) ,OS_STK_GROWTH 定义为0。
#define OS_TASK_SW() OSCtxSw() ,因为P89V51RD2没有软中断指令所以用程序调用代替。在用汇编语言编写的OSCtxSw()中,模拟系统产生中断时的堆栈操作。以保证系统任务的正确切换。

?OS_CPU_C.C的移植

  μC/OS-II的移植要求用户在OS_CPU_C.C中编写10个简单的C函数。但唯一必要的μC/OS-II的移植要求用户在OS_CPU_C.C中编写10个简单的C函数。但唯一必要的是OSTaskStkInit(),其他九个必须声明,但不一定要任何程序代码。

  OSTaskStkInit()是在系统创建任务时用来初始化任务堆栈的,使堆栈看起来就象中断刚发生一样,所有寄存器都保存在堆栈中。由于P89V51RD2硬件堆栈很小,最多只能有在内部RAM空间的256字节。因此很难将所有任务的堆栈都用硬件堆栈来实现。为了解决这个问题,我们为每个任务在外部RAM空间都分配一段连续的存储区,用来模拟每个任务的堆栈。在μC/OS-II进行任务切换时,首先将P89V51RD2硬件堆栈中的内容复制到要失去CPU拥有权的任务的外部模拟堆栈区,然后将要得到CPU拥有权的任务的外部模拟堆栈中的有效数据复制到P89V51RD2的硬件堆栈中。这样就实现了任务保护和切换。任务模拟堆栈和硬件的堆栈结构如图2所示。TCB 结构体中OSTCBStkPtr 总是指向用户堆栈最低地址,该地址空间内存放用户堆栈长度,其上空间存放系统堆栈映像,即:任务模拟堆栈空间大小=系统硬件堆栈空间大小+1。SP 总是先加1再存数据,因此SP初始时指向系统堆栈起始地址(OSStack)减1 处(OSStkStart)。很明显系统硬件堆栈存储空间大小=SP-OSStkStart。编写OSTaskStkInit()主要完成用户堆栈初始化,从下向上依次保存用户堆栈长度(5),PCL, PCH,PSW, AC C,B, DPL, DPH,R0,R1, R2,R3,R4,R5,R6,R7。不保存SP,任务切换时根据用户堆栈长度计算得出。紧接着的两字节保存可重入函数仿真堆栈的指针X_CP的高8位和低8位,初始化为任务模拟栈的最高地址的高8位和低8位。OSTaskStkInit()总是返回任务模拟栈的最低地址。

OS_CPU_A.ASM的移植

  OS_CPU_A.ASM的移植要求用户编写4个简单的汇编语言函数:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()

  μ C/OS-II的启动函数OSStart()调用OSStartHighRdy()来使就绪态任务中 优先级最高的任务开始运行,我们通过将任务模拟栈的有效长度内的数据复制到系统硬件堆栈,然后使用紧接着的两字节来改写X_CP的值。使可重入函数仿真堆栈指针指向该任务模拟栈的最高地址,这样做是因为Keil C51使用的可重入函数仿真堆栈的增长方向是向下的,和系统硬件堆栈的增长方向相反。这样就完成了OSStartHighRdy()的移植。

  OSCtxSw()和OSIntCtxSw()两个汇编函数的功能主要完成任务的切换。不同的是OSCtxSw()在任务级调用,而OSIntCtxSw()是在中断推出时调用。对于在P89V51RD2上的移植而言,这两个函数的实现基本相同。只是OSIntCtxSw()在中断调用中 由于OSIntExit()和自身对硬件堆栈的影响,需要将要保存的SP指针向下调整4个字节,以消除影响。μC/OS-II在需要任务切换时,根据CPU是否处在中断状态选择调用其中一个函数。如图2堆栈结构 所示,任务切换时先保存当前任务堆栈内容,方法是:用SP-OSStkStart 得出保存字节数。将其写入任务模拟堆栈最低地址内。以任务模拟堆栈最低地址为起址,以OSStkStart为系统硬件堆栈起址,由系统堆栈向用户堆栈拷贝数据。循环SP-OSStkStart次,每次拷贝前先将各自栈指针增1。其次恢复最高优先级任务系统堆栈方法是:获得最高优先级任务用户堆栈最低地址,从中取出长度。以最高优先级任务用户模拟堆栈最低地址为起址,以OSStkStart 为系统堆栈起址,由任务模拟堆栈向系统堆栈拷贝数据。循环“有效长度”数值指示的次数。每次拷贝前先将各自栈指针增1。

  μC/OS-II要求用户提供一个周期性的时钟源,来实现时间的延迟和超时功能。在P89V51RD2中我们通过定时器T0来提供时钟源。频率设为50Hz。T0的初始化函数在OS_CPU_C.C实现。时钟节拍中断服务子程序的编写也很简单,示意性代码如下:

void OSTickISR(void)
{
保存处理器寄存器;
调用OSIntEnter();
定时器计数器重装;
调用OSTimeTick();
调用OSIntExit();
恢复处理器寄存器;
执行中断返回指令;
}


μC/OS-II 移植代码的测试

  完成μC/OS-II移植后,就要对移植的代码进行测试。测试移植的μC/OS-II是否能够完成任务调度、时间管理、任务管理与同步等功能,是否能够启动多 任务环境。在P89V51RD2的移植中,编写简单的测试程序进行多任务的测试。测试程序创建了4任务,任务AA,BB,CC和LedFlash优先级分别为2,3,4,5。任务AA延时一秒通过串口输出一 次,任务BB延时3秒通过串口输出一次,任务CC延时6秒通过串口输出一次。

  LedFlash等待信号量有效时,对P1.1口进行一次取反操作。P1.1连接LED惊醒观察。定时器中断服务子 程序定时发出信号量。这样任务LedFlash实现LED的闪烁功能。

  μC/OS-II测试程序的文件结构,硬件测试结果和Keil C51的软件仿真结果如图3所示。结果表明μC/OS-II在P89V51RD2上 的移植是成功的。

结语

  通过μC/OS-II在P89V51RD2上的移植,掌握了μC/OS-II内核的工作原理和移植方法,测试程序表明移植代码可以稳定可靠的运行,实现了多任务的管理和调度。μC/OS-II实时操作系统的移入,不但可以提高系统的实时性、可靠性和稳定性,还提高了应用软件的可移植性,降低了开发人员的工作量。


文章出处:维库电子市场网

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(60)
发表于:2008-7-18 16:23:59
标签:无标签

1

选择ARM CPU的操作系统

文章出处:21control

嵌入式操作系统

ARM CPU的软件基础

       从8位/16位单片机发展到以ARM CPU核为代表的32位嵌入式处理器,嵌入式操作系统将替代传统的由手工编制的监控程序或调度程序,成为重要的基础组件。更重要的是嵌入式操作系统对应用程序可以起到屏蔽的作用,使应用程序员面向操作系统级开发应用软件,并易于在不同的ARM核的嵌入式处理器上移植。 嵌入式操作系统都具有一定的实时性,易于裁剪和伸缩,可以适合于从ARM7到Xscale各种ARM CPU和各种档次的应用,嵌入式操作系统可以使用广泛流行的ARM开发工具,如ARM公司的SDT/ADS和RealView等,也可以使用开发软件,如GCC/GDB、KDEEclipe开发环境,市场上还有专用的开发工具,如Tornado、mC/View、mC/KA、CODE/Lab、Metroworks等。 

       本文就目前国内在ARM CPU上广泛采用的三种嵌入式操作系统(mC/OS-II、mCLinux和嵌入式Linux)作分析。

mC/OS-II嵌入式实时内核 

       全世界数百种设备已经在使用mC/OS-II,包括手机、路由器、不间断电源、飞行器、医疗设备和工业控制设备。mC/OS-II已经有ARM7TDMI、ARM9和Strong ARM等各种ARM CPU的移植,支持包含Atmel、Hynix、Intel、Motorola、Philips、Samsung、Sharp等公司的ARM核的CPU。mC/OS-II的移植也相当容易,与CPU相关的代码包装在三个文件中,它们是os_cpu.h、os_cpu_a.asm和os_cpu_c.c。 

       mC/OS-II有60多个系统调用,覆盖任务、定时器、信号量、事件标志、邮箱、队列和内存管理,已经包含了传统嵌入式操作系统内核(如PSOS,VRTX)的功能,还支持互斥型信号量,这是90年代的嵌入式操作系统内核,如VxWorks和VRTXsa才有的技术。 

       mC/OS-II因为是可抢占的实时内核,所以μC/OS-II与商业嵌入式实时内核在性能上没有什么差异,mC/OS-II没有用户态和内核态,任务(线程)或中断和任务切换的响应可以很快,主要是和ARM CPU相关的。最新的2.7x版本还增加了算法以避免在移植中修改堆栈指针,这样可以保证mC/OS-II在不同的CPU上运行更稳定,移植更方便。mC/OS-II目前除了内核外还有商业化文件系统mC/FS,图形系统mC/GUI以及任务调试工具mC/KA和mC/View,但是mC/OS-II自己目前还没有TCP/IP协议系统。 

       总的来说,mC/OS-II是一个非常容易学习,结构简单,功能完备和实时性很强的嵌入式操作系统内核,适合于各种嵌入式应用以及大专院校教学和科研。最后需要说明,mC/OS-II不是免费软件,任何人学习使用mC/OS-II需要购买《嵌入式实时操作系统mC/OS-II》一书,使用mC/OS-II的产品需要购买产品生产授权,购买了此授权的还可以得到开发期间的技术支持和升级服务。

mCLinux操作系统 

       mCLinux是Linux小型化后,适合于没有MMU(内存管理单元)的微处理器芯片而裁剪成的操作系统,如果ARM CPU系列中的ARM7 TDMI、ARM940T等产品希望使用Linux操作系统,只能用mCLinux,当然,mCLinux也支持Motorola Dragonball、Coldfire等其它中低端嵌入式处理器。 

       mCLinux保持了传统Linux操作系统的主要特性,包括稳定、强大的网络和文件系统的支持,mCLinux裁剪了大量的Linux内核以缩小尺寸,适合象512k/b RAM、1M/b Flash这样小容量、低成本的嵌入式系统。mCLinux系统小型化的另一简化是采用了mCLib库替代Linux的Glib库,使用mCLib可以大大减少应用程序的代码尺寸,对于中小型嵌入式应用,mCLib功能可以满足需要,所以目前即使是某些采用Linux 2.4内核的嵌入式Linux系统也采用mCLib库的做法。mCLinux中,由于没有内存保护机制,应用代码一般采用静态连接的方式,而且在mCLinux中采用Flat文件执行格式(Linux是Coff或Elf格式), mCLinux和应用代码都可以支持固化,存储在Flash存储介质中,不需象Linux需要经过一次Flash到RAM的拷贝。所有这些,使得mCLinux更象传统意义上的嵌入式操作系统。 

       mCLinux是由Linux 2.0.38内核开始移植的,目前已经有2.4 Linux支持的一些移植的版本,如S3C2500、44B0等ARM芯片,可以在mCLinux的官方网站www.uclinux.org上找到这些版本,mCLinux近期主要是在发展各种2.4.x版本的移植,以期跟上Linux社会主流的发展趋势(因为今后Linux 2.6将开始成为主流的内核)。 

       mCLinux主要是针对没有MMU的嵌入式处理器开发设计,那么它也失去了有MMU所带来的Linux操作系统的特色,比如,上面已经提到的静态加载(Linux支持动态应用的加载),mCLinux对内存操作是直接的物理内存,这样,任何程序的异常都可能导致内核崩溃,mCLinux支持多线程,但需要父子线程协调同步,mCLinux的文件系统相对比较陈旧,支持的CPU和参考设计还比较少,社区的发展和维护也相对缓慢。目前mCLinux官方网站还很少看见象IBM、Intel这样的大型公司身影,只有2~3家小型的硬件或方案提供商,这对于商业化的产品开发中采用是有一定的风险。

嵌入式Linux操作系统 

       这里要讨论的是可以嵌入在ARM CPU上的,具有MMU功能的Linux操作系统,也可以称是嵌入式Linux操作系统。与微软公司的软件不一样,Linux不是由一家公司所拥有、维护开发的,Linux在市场有多种发行版本,所有发行版本都包含一样的Linux内核、基本工具和应用,不同的发行版本主要是在附加的工具链、应用、配置以及各种内核补丁上有所不同。嵌入式Linux主要是在实时性增强、内核精简和裁减、支持多种CPU结构(如ARM CPU)等方面做了改进和提高。 

       使用嵌入式Linux系统有两种途径: 

       第一是用户自己装配(称为DIY内核),你可以在www.kernel.org找到全部Linux代码,或直接到ARM CPU的源代码树下www.armlinux.org.uk找到所需要的Linux版本的移植,或者某些半导体公司,如三星、Motorola在自己的网站或在自己的ARM评估板含有一个最小Linux内核系统。如果这个最小内核没有包含GCC/GDB工具链,可能还要到GNU的网站下载全部的源代码,然后再编译生成所需要版本的ARM工具链和应用程序库,这个过程是相当耗时和困难的。还需要指出,这种DIY内核的配置,添加应用和驱动程序也是不标准的和复杂的,这是嵌入式系统的特殊性所在。 

       第二是选择一个商业化的嵌入式Linux操作系统平台。商业化的嵌入式Linux版本是针对嵌入式处理器,如ARM所优化设计的,支持各种半导体厂家的评估板和主要的设备驱动,商业化的嵌入式Linux包含了文件系统、应用、实时性扩展和技术支持培训服务,现今国外著名的商业化嵌入式Linux产品有:MontaVista Linux、Bluecat Linux、Timesys Linux、Metrowork Linux、Vlinux和Redhat Linux等,国内也有红旗、中软、新华嵌入式Linux。

       MontaVista Linux是MontaVista软件公司于1999年推出的,它是目前全球优秀的嵌入式Linux操作系统和工具供应商,MontaVista在嵌入式Linux的实时性、交叉开发工具、高可用性、动态电源管理等Linux技术要点方面具有领先地位。MontaVista Linux最版本是3.1,采用Linux 2.4.20,针对8种CPU系列(包含ARM和Xscale)优化定制的商业化版本。 

       选择象MontaVista Linux这样商业化嵌入式Linux,可以让用户把时间和资金放在应用软件和特定的硬件接口和设备驱动程序,使用商业化嵌入式Linux可以得到一定时间(一般是1年)的技术支持,升级和培训(这很重要,因为Linux是每天都在变化的)。 

       商业化嵌入式Linux目前除国内的产品外,价格还是很昂贵的,根据配置和服务时间,大约从几千到几万美元,多数国内用户从资金和心理上还很难承受,商业化嵌入式Linux开发工具相对于Microsoft和象Tornado/VxWork的开发工具,在易于使用和丰富性方面还待于提高和改进。 

       同样作为Linux操作系统,笔者推荐使用带有MMU的嵌入式Linux,而不是mCLinux,因为绝大多数新的ARM CPU都是AMR9核,它们都带有MMU了,无论是开放源码的Linux社区还是商业化的嵌入式Linux公司的支持和维护都比mCLinux要好要快和丰富得多。

结语 

       前面我们对三种在ARM CPU上较为流行的嵌入式操作系统作了详细的分析,在进入一个总结之前,笔者还想提到几个在国际上很有名气的嵌入式操作系统,它们是WindRiver公司的VxWorks、ATI的Nucleus、iTron和WinCE,但它们在ARM CPU的应用不多见,介绍从略。 最后归纳一下选择一个合适的ARM CPU的嵌入式操作系统的几个重要因素: 

       第一是应用。如果你想开发的嵌入式设备是一个和网络应用密切相关或者就是一个网络设备,那么你应该选择用嵌入式Linux或者mCLinux,而不是mC/OS-II。 

       第二是实时性。没有一个绝对的数字可以告诉你什么是硬实时,什么是软实时,它们之间的界限也是十分模糊的,这与你选择什么样的ARM CPU,它的主频、内存等参数有一定的关系。如果你使用加入实时补丁等技术的嵌入式Linux,如MontaVista Linux(2.4.17版本),最坏的情况只有436微秒,而99.9%的情况是195微秒。考虑到最新的Linux在实时性方面的改进。它可以适合于90~95%的各种嵌入式系统应用。当然,你如果希望更快的实时响应,如高速的A/D转换需要几个微秒以内的中断延时,可能采用mC/OS-II是合适的。当然,你采用象Vxworks这样传统的嵌入式操作系统也可以满足这样的强实时性要求。 

       第三是开发工具。显然,目前mC/OS-II、mCLinux和嵌入式Linux的开发工具与商业嵌入式操作系统工具还有一些差距,目前在ARM CPU上广泛流行和使用的是ARM公司SDT/ADS工具链,产品无论在功能、稳定性和众多的第三方厂商支持方面都很好,唯一不足的是缺少对嵌入式Linux操作系统的支持,SDT/ADS的升级产品RealView计划支持GCC和嵌入式Linux,但目前还没有看到,mC/OS-II可以使用ARM SDT/ADS,但没有操作系统调试功能。

       第四是所选择的ARM CPU和参考板,象ARM7TDMI和ARM940T(如S3C2500/2510)核是不能使用嵌入式Linux的,如果想用Linux,只能用mCLinux,如果想用VxWorks,需要了解一下提供评估板的公司是否有BSP(板支持包),VxWorks自己只有少数ARM公司评估板的支持。 

       最后是价格和技术服务。在考虑购买商业嵌入式操作系统时,会遇到是买还是自己做的问题,这是很正常的,尤其是在采用开放源代码技术时,这个问题就更加突出。有一点需要注意的是,有些产品如VxWorks是既按用户数收取开发费,也按用户产品售出的实际数量收取每个VxWorks软件运行的版税。mC/OS-II只是收取每种产品一次性版税(不限数量)。Linux无论是mCLinux还是嵌入式Linux(即使是商业版本象MontaVista Linux)是不收版税的,商用嵌入式Linux是以服务费或订阅方式收取开发时的费用。很明显,国外产品价格是贵一些,但不能不承认他们在嵌入式操作系统的技术已经远远走在前方。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(61)
发表于:2008-7-18 16:16:43
标签:无标签

1

WinCE--嵌入式系统简介

转自:与非网

嵌入式这个词现在变得越来越流行,然而关于它的很多概念可能还有一大部分人不是很明确,在本文中,我们不追求具体的概念是否准确,而是要对其有一个准确的理解。

  嵌入式系统是不同于常见计算机系统的一种计算机系统,它不以独立设备的物理形态出现,即它没有一个统一的外观,它的部件根据主体设备以及应用的需要嵌入在设备的内部,发挥着运算、处理、存储以及控制作用。从体系结构上看,嵌入式系统主要由嵌入式处理器、支撑硬件和嵌入式软件组成。其中嵌入式处理器通常是单片机或微控制器;支撑硬件主要包括存储介质、通信部件和显示部件等;嵌入式软件则包括支撑硬件的驱动程序、操作系统、支撑软件以及应用中间件等。

  可见,嵌入式系统是一个很大的概念,一旦嵌入式处理器和支撑硬件选定了,那么工作最多的就集中在嵌入式软件当中了。而嵌入式软件中的嵌入式操作系统部分和应用软件部分就成了重中之中。它们与通常说的操作系统与应用软件的概念是相似的,但也有区别。

  嵌入式操作系统是与应用环境密切相关的,从应用范围角度来看,大致可以分为通用型的嵌入式操作系统如Windows CE、VxWorks、嵌入式Linux等和专用型的嵌入式操作系统如Palm OS、Symbian等。从实时性的角度看,大致可以分为实时嵌入式操作系统和一般嵌入式操作系统。从原理上说,嵌入式操作系统仍旧是一种操作系统,因此它同样具有操作系统在进程管理、存储管理、设备管理、处理器管理和输入输出管理几方面的基本功能,但是由于硬件平台和应用环境与一般操作系统的不同,那么它也有自身的特点,最大的特点就是可定制性,也就是它能够提供可配置或可剪裁的内核功能和其他功能,可以根据应用的需要有选择的提供或不提供某些功能以减少系统开销。

  前已述及,微软公司的Windows CE操作系统就是一种嵌入式操作系统,它1996年开始发布Windows CE 1.0版本,2004年7月发布了Windows CE .NET 5.0版本,目前用得最多的是Windows CE .NET 4.2版本,其发展速度也是很快的,功能上自不必描述,它的主要应用领域有PDA市场、Pcket PC、Smartphone、工业控制、医疗等。

  现代的嵌入式操作系统同嵌入式操作系统的定制或配置工具紧密联系,构成了嵌入式操作系统的集成开发环境。就WinCE来讲,你无法买到WinCE这个操作系统,你买到的是Platform Builder for CE.NET 4.2的集成开发环境,我们也简称为PB,利用它你可以剪裁和定制出一个符合你自己需要的WinCE.NET 4.2的操作系统,因此,我们说的操作系统实际上完全是由自己定制出来的,这就是嵌入式操作系统最大的特点。

  对于嵌入式的应用软件,通常就是指运行在嵌入式操作系统之上的软件了,这种软件由于不再针对常规的操作系统进行开发,因此很多如VB、VC++等开发工具就不方便使用了,那么就有专门的SDK或集成开发环境来提供这种开发需要。在WinCE操作系统上的应用软件开发,微软就提供了Embedded Visual Basic(简称EVB)、Embedded Visual C++(简称EVC)、Visual Studio.NET等工具,它们是专门针对CE操作系统的开发工具,EVB只支持到CE的3.0版本,目前用得最多的还是EVC,把你的CE操作系统中的SDK(软件开发包)导出然后安装在EVC下,就可以变成专门针对你这种设备或系统的开发工具了。而VS.NET中的VB.NET和C#也提供了对以CE为操作系统的智能设备开发的支持,而且也很方便,但必须要求这些设备中提供了对微软的.NET Compact FrameWork的支持才行,如果使用的话就要看具体情况了。

  以上说了这么多,还是举个例子吧。比如说我要做一台医疗仪器,那么我就要选择好嵌入式的硬件环境,然后定制出符合我需要的CE操作系统,利用这个系统导出SDK,然后利用EVC结合这个SDK来开发我的信号采集、处理和病情分析的应用程序,最后就形成了一台合适的利用嵌入式技术开发出的仪器了。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(61)
发表于:2008-7-18 16:12:53
标签:无标签

1

七款嵌入式Linux操作系统简介

转自:与非网

除了智能数字终端领域以外,Linux在移动计算平台、智能工业控制、金融业终端系统,甚至军事领域都有着广泛的应用前景。这些Linux被统称为“嵌入式Linux”。下面就来看看都有哪些嵌入式Linux在以上领域纵横驰骋吧!

RT-Linux

这是由美国墨西哥理工学院开发的嵌入式Linux操作系统。到目前为止,RT-Linux已经成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛领域。RT-Linux开发者并没有针对实时操作系统的特性而重写Linux的内核,因为这样做的工作量非常大,而且要保证兼容性也非常困难。为此,RT-Linux提出了精巧的内核,并把标准的Linux核心作为实时核心的一个进程,同用户的实时进程一起调度。这样对Linux内核的改动非常小,并且充分利用了Linux下现有的丰富的软件资源。

uClinux

uCLinux是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU (Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。uCLinux是一种优秀的嵌入式 Linux版本,是micro-Conrol-Linux的缩写。它秉承了标准Linux的优良特性,经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,却仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的API。它专为嵌入式系统做了许多小型化的工作,目前已支持多款CPU。其编译后目标文件可控制在几百KB数量级,并已经被成功地移植到很多平台上。

Embedix

Embedix是由嵌入式Linux行业主要厂商之一Luneo推出的,是根据嵌入式应用系统的特点重新设计的Linux发行版本。Embedix提供了超过25种的Linux系统服务,包括Web服务器等。系统需要最小8MB内存,3MB ROM或快速闪存。Embedix基于Linux 2.2内核,并已经成功地移植到了Intel x86和PowerPC处理器系列上。像其它的Linux版本一样,Embedix可以免费获得。Luneo还发布了另一个重要的软件产品,它可以让在 Windows CE上运行的程序能够在Embedix上运行。Luneo还将计划推出Embedix的开发调试工具包、基于图形界面的浏览器等。可以说,Embedix 是一种完整的嵌入式Linux解决方案。

XLinux

XLinux是由美国网虎公司推出,主要开发者是陈盈豪。他在加盟网虎几个月后便开发出了基于XLinux的、号称是世界上最小的嵌入式Linux系统,内核只有143KB,而且还在不断减小。XLinux核心采用了“超字元集”专利技术,让Linux核心不仅可能与标准字符集相容,还含盖了12个国家和地区的字符集。因此,XLinux在推广Linux的国际应用方面有独特的优势。

PoketLinux

PoketLinux由Agenda公司采用、作为其新产品“VR3 PDA”的嵌入式Linux操作系统。它可以提供跨操作系统构造统一的、标准化的和开放的信息通信基础结构,在此结构上实现端到端方案的完整平台。 PoketLinux资源框架开放,使普通的软件结构可以为所有用户提供一致的服务。PoketLinux平台使用户的视线从设备、平台和网络上移开,由此引发了信息技术新时代的产生。在PoketLinux中,称之为用户化信息交换(CIE),也就是提供和访问为每个用户需求而定制的“主题”信息的能力,而不管正在使用的设备是什么。

MidoriLinux

由Transmeta公司推出的MidoriLinux操作系统代码开放,在GUN普通公共许可(GPL)下发布,可以在http://midori.transmeta.com上立即获得。该公司有个名为“MidoriLinux计划”。“MidoriLinux”这个名字来源于日本的“绿色”——Midori,用来反映其Linux操作系统的环保外观。

红旗嵌入式Linux

由北京中科院红旗软件公司推出的嵌入式Linux是国内做得较好的一款嵌入式操作系统。目前,中科院计算所自行开发的开放源码的嵌入式操作系统—— Easy Embedded OS(EEOS)也已经开始进入实用阶段了。该款嵌入式操作系统重点支持p-Java。系统目标一方面是小型化,另一方面能重用Linux的驱动和其它模块。由于有中科院计算所的强大科研力量做后盾,EEOS有望发展成为功能完善、稳定、可靠的国产嵌入式操作系统平台。

思考与展望

以上列举的众多嵌入式Linux操作系统中,国内对于uClinux和RT-Linux研究的较多,很多基于它们的产品已经面世,比如华恒公司已经把uClinux成功移植,并投放到市场。

正是由于Linux开放源代码的特点,所以全世界的开发厂商都站在同一个起跑线上。国内的研究机构和企业也正在积极投入人力、物力,力争在嵌入式操作系统上有所为。但应该清醒认识到,绝大多数的嵌入式系统的硬件平台还掌握在外国公司的手中。国产的嵌入式操作系统在技术含量、兼容性、市场运作模式等方面还有很多工作要做。国家对嵌入式领域的发展也极为重视。信息产业部《2003年度电子发展基金项目指南》在软件类重点产品项目中,第五小类就是关于嵌入式软件与系统开发的,并提出要重点进行如下重点项目的研制与开发:嵌入式实时操作系统、嵌入式软件集成开发平台和嵌入式数据库管理软件。由于嵌入式系统研发在国内起步比较晚,我国目前还基本处于实验室阶段。但是嵌入式操作系统的巨大的商业价值和Linux的开放性,为民族软件产业的发展提供了难得的机会。在跟踪国外嵌入式操作系统最新技术的同时,国内厂商要坚持自主产权,力争找到自己的突破点,探索出一条适合中国国情的嵌入式操作系统的发展道路。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(61)
发表于:2008-7-18 15:03:02
标签:无标签

1

浅谈ARM仿真器中的断点资源

转自:电子工程专辑

目前,越来越多的嵌入式开发公司和工程师开始采用JTAG方式的ICE仿真器来进行程序的调试工作。传统的全仿真方式(Full ICE)正在逐渐被使用灵活、成本低廉的JTAG仿真方式所取代。 

       JTAG仿真器目前可以满足嵌入式程序调试的所有基本要求,例如:断点设置、单步调试、内存编辑、变量、寄存器观测等。(如图1所示) 

       断点设置是JTAG仿真器最基本的调试功能。用户需要系统在设置断点处停下来后再进行调试。断点根据原理和用途不同又分为几个不同的种类。本文将简单地介绍一下常用的几种断点类型。 

       断点可分为硬件断点和软件断点两大类: 

       1.硬件断点需要目标CPU的硬件支持,当前流行的ARM7/9内部硬件设计提供两组寄存器用来存贮断点信息,所以ARM7/9内核最多支持两个硬件断点,而ARM11则可以支持到8个硬件断点。这与调试器无关。 

       2.软件断点则是通过在代码中设置特征值的方式来实现的。当需要在某地址代码处设置软件断点的时候,仿真器会先将此处代码进行备份保护,然后将预先设定好的断点特征值(一般为0x0000等不易与代码混淆的值)写入此地址,覆盖原来的代码数据。当程序运行到此特征值所在的地址时,仿真器识别出此处是一个软断点,便会产生中断。当取消断点时,之前受保护的代码信息会被自动恢复。 

       硬件断点可以设置在任何位置的代码上,包括ROM和RAM;而软件断点由于需要修改相应地址的值,所以一般只能设在RAM上,但是数量可以不受限制。由于硬件断点设置的灵活性,所以是最优先选用的断点资源,但是两个断点往往很难满足工程师进行深入调试的需要,于是软件断点可以作为硬件断点的补充资源来使用。 

       由于通常的软件断点只能设在RAM运行的代码上,而随着系统的代码量越来越大,特别是在移动通信领域,扩充大容量的RAM势必会增加产品的成本,所以现在很多系统直接在FlashROM上运行代码。对于这种在FlashROM上运行代码的系统,一般的软件断点是无法设置的,这也是软件断点的局限性。对于这样的系统,只能通过交替使用两个硬件断点满足需要,但是会带来一定的不便。 

       要很好的解决这一矛盾,只有使仿真器增加在FlashROM上设置软件断点的功能,拓展仿真器中可供利用的断点资源。例如,日本横河计算机株式会社(YDC)最新推出的高端ARM仿真器—advicePRO,就是第一个支持Flash断点的ICE仿真器产品。(如图2所示) 

       在FlashROM上设置软件断点的原理与在RAM上设置软断点类似,也是在设定的断点处用特征码替换原有代码,通过识别特征码使断点事件发生。不同的是,在FlashROM上设置软件断点需要对Flash进行擦写操作,这就需要仿真器能够有Flash编程功能,并且能够在尽可能短的时间内完成特征码的写入。完成这一系列的读写操作,就可使在FlashROM上调试代码的工程师获得更充裕的断点资源,从而大大提高了开发效率。

点击看大图

图 1: 调试器界面及常用功能

点击看大图

图 2: 横河公司的最新产品advicePRO


       但是,由于对Flash进行擦写需要一定的时间,所以在执行到Flash断点的时候会感觉到有一个停顿的时间。虽然这一点比RAM上的软件断点要差些,但是相对于给工程师调试工作整体上带来的便利而言,这一点是完全可以接受的。 

       设置断点进行调试是最基本的一种调试手段,选择具有丰富断点资源的ICE仿真器,可以明显地提高调试效率。当然,前提是工程师能够灵活使用各种断点资源。 

       作者: 

       张国跃 

       技术支持工程师

上海横河国际贸易有限公司

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(46)
发表于:2008-7-18 14:57:40
标签:无标签

1

ARM开发的调试方法概述

转自:与非网

用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可少的,至于嵌入式实时操作系统、评估板等其他开发工具则可以根据应用软件规模和开发计划选用。 

       使用集成开发环境开发基于ARM的应用软件,包括编辑、编译、汇编、链接等工作全部在PC机上即可完成,调试工作则需要配合其他的模块或产品方可完成,目前常见的调试方法有以下几种:

1、指令集模拟器 

       部分集成开发环境提供了指令集模拟器,可方便用户在PC机上完成一部分简单的调试工作,但是由于指令集模拟器与真实的硬件环境相差很大,因此即使用户使用指令集模拟器调试通过的程序也有可能无法在真实的硬件环境下运行,用户最终必须在硬件平台上完成整个应用的开发。

2、驻留监控软件 

       驻留监控软件(Resident Monitors)是一段运行在目标板上的程序,集成开发环境中的调试软件通过以太网口、并行端口、串行端口等通讯端口与驻留监控软件进行交互,由调试软件发布命令通知驻留监控软件控制程序的执行、读写存储器、读写寄存器、设置断点等。 

       驻留监控软件是一种比较低廉有效的调试方式,不需要任何其他的硬件调试和仿真设备。ARM公司的Angel就是该类软件,大部分嵌入式实时操作系统也是采用该类软件进行调试,不同的是在嵌入式实时操作系统中,驻留监控软件是作为操作系统的一个任务存在的。 

       驻留监控软件的不便之处在于它对硬件设备的要求比较高,一般在硬件稳定之后才能进行应用软件的开发,同时它占用目标板上的一部分资源,而且不能对程序的全速运行进行完全仿真,所以对一些要求严格的情况不是很适合。

3、JTAG仿真器 

       JTAG仿真器也称为JTAG调试器,是通过ARM芯片的JTAG边界扫描口进行调试的设备。JTAG仿真器比较便宜,连接比较方便,通过现有的JTAG边界扫描口与 ARM CPU 核通信,属于完全非插入式(即不使用片上资源)调试,它无需目标存储器,不占用目标系统的任何端口,而这些是驻留监控软件所必需的。另外,由于JTAG调试的目标程序是在目标板上执行,仿真更接近于目标硬件,因此,许多接口问题,如高频操作限制、AC和DC参数不匹配,电线长度的限制等被最小化了。使用集成开发环境配合JTAG仿真器进行开发是目前采用最多的一种调试方式。

4、在线仿真器 

       在线仿真器使用仿真头完全取代目标板上的CPU,可以完全仿真ARM芯片的行为,提供更加深入的调试功能。但这类仿真器为了能够全速仿真时钟速度高于100MHz的处理器,通常必须采用极其复杂的设计和工艺,因而其价格比较昂贵。在线仿真器通常用在ARM的硬件开发中,在软件的开发中较少使用,其价格高昂也是在线仿真器难以普及的因素。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(36)
发表于:2008-7-14 11:14:30
标签:无标签

1

实时传输协议(Real Time Transport Protocol)

实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。

RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。 RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。

RTP 由两个紧密链接部分组成:

  • RTP ― 传送具有实时属性的数据;
  • RTP 控制协议(RTCP) ― 监控服务质量并传送正在进行的会话参与者的相关信息。RTCP 第二方面的功能对于“松散受控”会话是足够的,也就是说,在没有明确的成员控制和组织的情况下,它并不非得用来支持一个应用程序的所有控制通信请求。

协议结构

1 2 3 8 9 16bit
V P X CSRC Count M Payload Type
Sequence number Timestamp
SSRC CSRC (variable 0 – 15 items 32bits each)
  • V ― 版本。识别 RTP 版本。
  • P ― 间隙(Padding)。设置时,数据包包含一个或多个附加间隙位组,其中这部分不属于有效载荷。
  • X ― 扩展位。设置时,在固定头后面,根据指定格式设置一个扩展头。
  • CSRC Count ― 包含 CSRC 标识符(在固定头后)的编号。
  • M ― 标记。标记由 Profile 文件定义。允许重要事件如帧边界在数据包流中进行标记。
  • Payload Type ― 识别 RTP 有效载荷的格式,并通过应用程序决定其解释。Profile 文件规定了从 Payload 编码到 Payload 格式的缺省静态映射。另外的 Payload Type 编码可能通过非 RTP 方法实现动态定义。
  • Sequence Number ― 每发送一个 RTP 数据包,序列号增加1。接收方可以依次检测数据包的丢失并恢复数据包序列。
  • Timestamp ― 反映 RTP 数据包中的第一个八位组的采样时间。采样时间必须通过时钟及时提供线性无变化增量获取,以支持同步和抖动计算。
  • SSRC ― 同步源。该标识符随机选择,旨在确保在同一个 RTP 会话中不存在两个同步源具有相同的 SSRC 标识符。
  • CSRC ― 贡献源标识符。识别该数据包中的有效载荷的贡献源。

相关协议:RTCPRTSPUDPTCPIP

组织来源:RTP 由 IETF(http://www.ietf.org/)定义在 RFC 3550和3551中。

相关链接:
http://www.javvin.com/protocol/rfc3550.pdf: RTP: A Transport Protocol for Real-Time Applications
http://www.javvin.com/protocol/rfc3551.pdf: RTP Profile for Audio and Video Conferences

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(74)
发表于:2008-7-14 10:44:54
标签:无标签

1

RTP协议栈简介

流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术,本文介绍如何在Linux下利用JRTPLIB进行实时流媒体编程。 

  

一、流媒体简介
        
随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等多媒体格式过渡。目前在网络上传输音频/视频(Audio/Video,简称A/V)等多媒体文件时,基本上只有下载和流式传输两种选择。通常说来,A/V文件占据的存储空间都比较大,在带宽受限的网络环境中下载可能要耗费数分钟甚至数小时,所以这种处理方法的延迟很大。如果换用流式传输的话,声音、影像、动画等多媒体文件将由专门的流媒体服务器负责向用户连续、实时地发送,这样用户可以不必等到整个文件全部下载完毕,而只需要经过几秒钟的启动延时就可以了,当这些多媒体数据在客户机上播放时,文件的剩余部分将继续从流媒体服务器下载。

 

        流(Streaming)是近年在Internet上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。流媒体包含广义和狭义两种内涵:广义上的流媒体指的是使音频和视频形成稳定和连续的传输流和回放流的一系列技术、方法和协议的总称,即流媒体技术;狭义上的流媒体是相对于传统的下载-回放方式而言的,指的是一种从Internet上获取音频和视频等多媒体数据的新方法,它能够支持多媒体数据流的实时传输和实时播放。通过运用流媒体技术,服务器能够向客户机发送稳定和连续的多媒体数据流,客户机在接收数据的同时以一个稳定的速率回放,而不用等数据全部下载完之后再进行回放。

 

由于受网络带宽、计算机处理能力和协议规范等方面的限制,要想从Internet上下载大量的音频和视频数据,无论从下载时间和存储空间上来讲都是不太现实的,而流媒体技术的出现则很好地解决了这一难题。目前实现流媒体传输主要有两种方法:顺序流(progressive streaming)传输和实时流(realtime streaming)传输,它们分别适合于不同的应用场合。

 

顺序流传输

 

        顺序流传输采用顺序下载的方式进行传输,在下载的同时用户可以在线回放多媒体数据,但给定时刻只能观看已经下载的部分,不能跳到尚未下载的部分,也不能在传输期间根据网络状况对下载速度进行调整。由于标准的HTTP服务器就可以发送这种形式的流媒体,而不需要其他特殊协议的支持,因此也常常被称作HTTP 流式传输。顺序流式传输比较适合于高质量的多媒体片段,如片头、片尾或者广告等。

 

实时流传输

 

        实时流式传输保证媒体信号带宽能够与当前网络状况相匹配,从而使得流媒体数据总是被实时地传送,因此特别适合于现场事件。实时流传输支持随机访问,即用户可以通过快进或者后退操作来观看前面或者后面的内容。从理论上讲,实时流媒体一经播放就不会停顿,但事实上仍有可能发生周期性的暂停现象,尤其是在网络状况恶化时更是如此。与顺序流传输不同的是,实时流传输需要用到特定的流媒体服务器,而且还需要特定网络协议的支持。

 

二、流媒体协议
实时传输协议(Real-time Transport ProtocolPRT)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多(multicast,多播)的网络环境中实现传流媒体数据的实时传输。RTP通常使用UDP来进行多媒体数据的传输,但如果需要的话可以使用TCP或者 ATM等其它协议,整个RTP协议由两个密切相关的部分组成:RTP数据协议和RTP控制协议。实时流协议(Real Time Streaming ProtocolRTSP)最早由Real NetworksNetscape公司共同提出,它位于RTPRTCP之上,其目的是希望通过IP网络有效地传输多媒体数据。

 

2.1 RTP数据协议

 

RTP数据协议负责对流媒体数据进行封包并实现媒体流的实时传输,每一个RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前12个字节的含义是固定的,而负载则可以是音频或者视频数据。RTP数据报的头部格式如图1所示:

 

 
1 RTP头部格式

 

其中比较重要的几个域及其意义如下: 

 

  • CSRC记数(CC  表示CSRC标识的数目。CSRC标识紧跟在RTP固定头部之后,用来表示RTP数据报的来源,RTP协议允许在同一个会话中存在多个数据源,它们可以通过RTP混合器合并为一个数据源。例如,可以产生一个CSRC列表来表示一个电话会议,该会议通过一个 RTP混合器将所有讲话者的语音数据组合为一个RTP数据源。 
  • 负载类型(PT  标明RTP负载的格式,包括所采用的编码算法、采样频率、承载通道等。例如,类型2表明该RTP数据包中承载的是用ITU G.721算法编码的语音数据,采样频率为8000Hz,并且采用单声道。 
  • 序列号  用来为接收方提供探测数据丢失的方法,但如何处理丢失的数据则是应用程序自己的事情,RTP协议本身并不负责数据的重传。 
  • 时间戳  记录了负载中第一个字节的采样时间,接收方能够时间戳能够确定数据的到达是否受到了延迟抖动的影响,但具体如何来补偿延迟抖动则是应用程序自己的事情。 

RTP 数据报的格式不难看出,它包含了传输媒体的类型、格式、序列号、时间戳以及是否有附加数据等信息,这些都为实时的流媒体传输提供了相应的基础。RTP协议的目的是提供实时数据(如交互式的音频和视频)的端到端传输服务,因此在RTP中没有连接的概念,它可以建立在底层的面向连接或面向非连接的传输协议之上;RTP也不依赖于特别的网络地址格式,而仅仅只需要底层传输协议支持组帧(Framing)和分段(Segmentation)就足够了;另外RTP 本身还不提供任何可靠性机制,这些都要由传输协议或者应用程序自己来保证。在典型的应用场合下,RTP 一般是在传输协议之上作为应用程序的一部分加以实现的,如图2所示:

 


2 RTP与各种网络协议的关系

 

2.2 RTCP控制协议

 

RTCP 控制协议需要与RTP数据协议一起配合使用,当应用程序启动一个RTP会话时将同时占用两个端口,分别供RTP RTCP使用。RTP本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完成。通常RTCP会采用与 RTP相同的分发机制,向会话中的所有成员周期性地发送控制信息,应用程序通过接收这些数据,从中获取会话参与者的相关资料,以及网络状况、分组丢失概率等反馈信息,从而能够对服务质量进行控制或者对网络状况进行诊断。

 

RTCP协议的功能是通过不同的RTCP数据报来实现的,主要有如下几种类型: 

 

  • SR  发送端报告,所谓发送端是指发出RTP数据报的应用程序或者终端,发送端同时也可以是接收端。 
  • RR  接收端报告,所谓接收端是指仅接收但不发送RTP数据报的应用程序或者终端。 
  • SDES  源描述,主要功能是作为会话成员有关标识信息的载体,如用户名、邮件地址、电话号码等,此外还具有向会话成员传达会话控制信息的功能。 
  • BYE  通知离开,主要功能是指示某一个或者几个源不再有效,即通知会话中的其他成员自己将退出会话。 
  • APP  由应用程序自己定义,解决了RTCP的扩展性问题,并且为协议的实现者提供了很大的灵活性。 

RTCP数据报携带有服务质量监控的必要信息,能够对服务质量进行动态的调整,并能够对网络拥塞进行有效的控制。由于RTCP数据报采用的是多播方式,因此会话中的所有成员都可以通过RTCP数据报返回的控制信息,来了解其他参与者的当前情况。

 

在一个典型的应用场合下,发送媒体流的应用程序将周期性地产生发送端报告SR,该RTCP数据报含有不同媒体流间的同步信息,以及已经发送的数据报和字节的计数,接收端根据这些信息可以估计出实际的数据传输速率。另一方面,接收端会向所有已知的发送端发送接收端报告RR,该RTCP数据报含有已接收数据报的最大序列号、丢失的数据报数目、延时抖动和时间戳等重要信息,发送端应用根据这些信息可以估计出往返时延,并且可以根据数据报丢失概率和时延抖动情况动态调整发送速率,以改善网络拥塞状况,或者根据网络状况平滑地调整应用程序的服务质量。

 

2.3 RTSP实时流协议

 

作为一个应用层协议,RTSP提供了一个可供扩展的框架,它的意义在于使得实时流媒体数据的受控和点播变得可能。总的说来,RTSP是一个流媒体表示协议,主要用来控制具有实时特性的数据发送,但它本身并不传输数据,而是必须依赖于下层传输协议所提供的某些服务。RTSP 可以对流媒体提供诸如播放、暂停、快进等操作,它负责定义具体的控制消息、操作方法、状态码等,此外还描述了与RTP间的交互操作。

 

RTSP 在制定时较多地参考了HTTP/1.1协议,甚至许多描述与HTTP/1.1完全相同。RTSP之所以特意使用与HTTP/1.1类似的语法和操作,在很大程度上是为了兼容现有的Web基础结构,正因如此,HTTP/1.1的扩展机制大都可以直接引入到RTSP 中。

 

RTSP 控制的媒体流集合可以用表示描述(Presentation Description)来定义,所谓表示是指流媒体服务器提供给客户机的一个或者多个媒体流的集合,而表示描述则包含了一个表示中各个媒体流的相关信息,如数据编码/解码算法、网络地址、媒体流的内容等。

 

虽然RTSP服务器同样也使用标识符来区别每一流连接会话(Session),但RTSP连接并没有被绑定到传输层连接(如TCP等),也就是说在整个 RTSP连接期间,RTSP用户可打开或者关闭多个对RTSP服务器的可靠传输连接以发出RTSP 请求。此外,RTSP连接也可以基于面向无连接的传输协议(如UDP等)。

 

RTSP协议目前支持以下操作: 

 

  • 检索媒体  允许用户通过HTTP或者其它方法向媒体服务器提交一个表示描述。如表示是组播的,则表示描述就包含用于该媒体流的组播地址和端口号;如果表示是单播的,为了安全在表示描述中应该只提供目的地址。 
  • 邀请加入  媒体服务器可以被邀请参加正在进行的会议,或者在表示中回放媒体,或者在表示中录制全部媒体或其子集,非常适合于分布式教学。 
  • 添加媒体  通知用户新加入的可利用媒体流,这对现场讲座来讲显得尤其有用。与HTTP/1.1类似,RTSP请求也可以交由代理、通道或者缓存来进行处理。 

三、流媒体编程 
RTP 
是目前解决流媒体实时传输问题的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的RTP库,如LIBRTP JRTPLIB等。JRTPLIB是一个面向对象的RTP库,它完全遵循RFC 1889设计,在很多场合下是一个非常不错的选择,下面就以JRTPLIB为例,讲述如何在Linux平台上运用RTP协议进行实时流媒体编程。

 

3.1 环境搭建

 

JRTPLIB 是一个用C++语言实现的RTP库,目前已经可以运行在WindowsLinuxFreeBSD SolarisUnixVxWorks等多种操作系统上。要为Linux 系统安装JRTPLIB,首先从JRTPLIB的网站(http: //lumumba.luc.ac.be/jori/jrtplib/jrtplib.html)下载最新的源码包,此处使用的是jrtplib- 2.7b.tar.bz2。假设下载后的源码包保存在/usr/local/src目录下,执行下面的命令可以对其进行解压缩:

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(75)
发表于:2008-7-11 13:17:14
标签:无标签

1