【摘要】为了降低DSP 系统软件的开发难度,保证系统的实时性,缩短开发周期,将嵌入式实时操作系统μC/OS-Ⅱ移植到DSP 芯片中是目前比较常用的一种方法。本文介绍了嵌入式实时操作系统μC/OS-Ⅱ的特点,并研究分析了μC/OS-Ⅱ操作系统在目前比较流行的DSP芯片TMS320C6713上的移植方法,解决了移植μC/OS-Ⅱ过程中的重点和难点。最后对移植后的操作系统进行测试,最终测试结果表明:该操作系统是一个稳定、可靠的实时嵌入式操作系统。
【关键词】μC/OS-Ⅱ;嵌入式实时操作系统;TMS320C6713;DSP;移植
1 μC/OS-Ⅱ操作系统介绍
μC/OS-Ⅱ是一种可以免费使用,源代码公开的嵌入式操作系统,具有结构小巧、可裁剪、可固化、可移植性强等优点,同时拥有可剥夺的内核。主要有以下特点:稳定性和安全性能好,实时多任务,可裁剪可固化,且具有较强的移植性。作为一种软件平台,它提供了包括任务管理和调度、时间管理、内存管理、消息邮箱以及任务间的通信和同步等系统服务功能。
μC/OS-Ⅱ内核的主要功能是为任务提供系统服务,根据任务的当前状态,及时执行优先级最高的处于就绪态的任务,采用占先式调度机制,保证系统的实时性。μC/OS-Ⅱ软件结构如图1所示。
2 μC/OS-Ⅱ操作系统在DSP上移植的意义
随着科学技术的不断发展,我们已经进入了数字化的时代,而数字化时代的核心引擎就是数字信号处理器(Digital SignalProcessor,DSP)。从20世纪60年代数字信号处理理论诞生以来,数字信号处理器取得了迅猛的发展,DSP已经广泛的应用到社会生活的各个领域,正在改变着我们的生活方式。但是,随着社会的发展,大规模软件越来越成为当前软件行业的主流。伴随着大规模软件的普及,系统软件的复杂度也越来越高,系统软件对实时性的要求也在不断增加。如何在大规模软件开发中保持系统良好的实时性,已经成为DSP系统开发的重点和难点,也是制约着DSP系统进一步发展的瓶颈。因嵌入式实时操作系统μC/OS-Ⅱ在DSP芯片上的移植与测试此,在很多实际应用中,我们考虑使用μC/OS-Ⅱ实时内核来管理系统软件,可以以较小的代价,更大幅度地降低DSP 系统软件的开发难度,同时兼顾系统的实时性和可靠性,缩短软件开发周期,具有很强的现实意义。
DSP芯片TMS320C6713由于其出色的运算能力、高效的指令集、智能外设、大容量的片内存储器和大范围的寻址能力等,得到了越来越广泛的应用。但是目前在6713芯片上进行的开发大都是在没有操作系统的情况下进行的,效率较低。而且目前没有针对μC/OS-Ⅱ操作系统在DSP6713 上进行移植的研究。因此,本文就是以此为目的,对在TMS320C6713DSP 芯片上移植μC/OS-Ⅱ操作系统进行研究,并进行了测试验证。
3 μC/OS-Ⅱ在TMS320C6713上的移植
3.1 μC/OS-II 的移植条件
μC/OS-Ⅱ的大部分代码都是用C语言编写的,只有少量与处理器相关的代码使用汇编编写的,因此具有很强的可移植性。目前流行的多种处理器上都可以移植μC/OS-Ⅱ操作系统,要移植μC/OS-Ⅱ,目标处理器必须满足以下要求:1)处理器的C编译器能产生可重用代码;2)用C语言就可以打开和关闭中断;3)处理器支持中断,并能产生定时中断;4)处理器支持一定数量的数据存储硬件堆栈;5)处理器有将堆栈指针和寄存器内容读出、并存储到堆栈或内存中的指令。
DSP 芯片TMS320C6713的特点及其软件开发环境CCS都能满足μC/OS-Ⅱ操作系统的移植要求,所以可以在该DSP芯片上进行移植。
3.2 μC/OS-II操作系统移植的主要工作
μC/OS-Ⅱ的体系结构如图2所示,由图可以看出用户编写的应用程序软件位于整个系统的顶层,只与跟应用相关的代码和μC/OS-Ⅱ中与处理器无关的代码相关联。这种体系结构可以很好的保证应用软件的可重用性,当应用程序运行在不同处理器上时,只需要对与处理器相关的代码进行修改即可。
由图可以看出,与处理器相关的代码主要在OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM 三个文件中,因此要实现μC/OS-Ⅱ操作系统的移植,需要对这三个文件中的代码进行修改。下面将详细说明在DSP芯片TMS320C6713上移植μC/OS-Ⅱ操作系统时修改这三个文件需注意的问题。
1)OS_CPU.H移植实现
OS_CPU.H中主要定义了与所使用的编译器有关的数据类型,同时还定义了选择开关中断方法的宏OS_CRITICAL_METHOD、关中断宏OS_ENTER_CRITICAL()、开中断宏OS_EXIT_CRITICAL()、任务切换宏OS_TASK_SW()和堆栈存放顺序的宏OS_STK_GROWTH。
C语言中定义的数据类型的位数在不同的处理器中是不相同的,因此这部分内容是不可移植的。因此μC/OS-Ⅱ自己定义了一系列可移植且直观的数据类型来确保系统的可移植性,例如:
typedef unsigned intINT32U;
typedef unsignedshort INT16U;
typedef unsignedchar INT8U;
typedef unsignedchar BOOLEAN。
μC/OS-Ⅱ通过OS_STK 来声明任务堆栈的数据类型,TMS320C6713芯片的处理器堆栈为32 位的,所以OS_STK 声明为:
typedef INT32UOS_STK。
在进行中断响应时,μC/OS-Ⅱ通过先关中断,然后处理临界段代码,处理完毕后重新打开中断这个机制保护临界段代码免受多任务或中断服务子程序的破坏。
为了增加可移植性,μC/OS-Ⅱ定义了宏OS_ENTER_CRITICAL()来开中断,宏OS_EXIT_CRITICAL()来关中断。
我们通过在OS_CPU.H中定义OS_CRITICAL_METHOD常数来选择OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的不同实现方法。
本文中采用第一种方式来实现对临界区的保护,实现代码如下:
#defineOS_ENTER_CRITICAL()Disable_int( )
#defineOS_EXIT_CRITICAL()Enable_int( )
宏OS_TASK_SW的作用是实现任务切换,如果任务处于就绪状态,μC/OS-Ⅱ就会将任务的寄存器从任务堆栈中恢复,并且执行中断返回。中断服务子程序的中断向量地址必须指向汇编语言函数OSCtxSw( )。
#define OS_TASK_SW() OSCtxSw( )
处理器的压栈顺序是由宏OS_STK_GROWTH来定义的,我们使用的DSP芯片TMS320C6713的堆栈顺序是从高地址向低地址递减的,因此,我们定义OS_STK_GROWTH 为1。
2)OS_CPU_C.C移植实现
这部分定义了10个C语言编写的函数,除了OSTaskStkInit( )函数之外,其他函数可以只进行声明,在有需要扩展相关功能是才添加相应代码。在用户建立任务时,系统内部自己调用OSTaskStkInit( )函数,对用户的任务堆栈进行初始化。针对本次在DSP芯片TMS320C6713上的移植,建立了初始化堆栈帧INIT_STACK_FRAME,对堆栈的每个寄存器进行初始化。
3)OS_CPU_A.ASM
移植O S_CPU_A.ASM 的文件需要编写OSStartHighRdy( ),Enable_int( ),Disable_int( ),OSCtxSw( )和OSIntCtxSw( )等几个汇编语言函数。
OSStartHighRdy( )函数的作用是指向优先级最高的处于就绪态的任务。系统通过调用该函数,来使优先级最高的就绪状态下的任务运行。
6713芯片需要用汇编语言编写一个OSCtxSw( )函数来用于任务切换。该函数使DSP系统从当前运行的低优先级任务切换到优先级更高任务。系统通过执行向量地址指向OSCtxSw( )的软中断或陷阱(TRAP)来实现任务级的切换。如果有更高优先级的任务进入就绪状态,μC/OS-Ⅱ可以通过指向OSCtxSw( )函数的向量地址找到OSCtxSw( )函数,从而完成任务的切换。Disable_int( ),Enable_int( )函数可以实现对临界区的保护。这两个函数利用状态控制寄存器(CSR)控制全局中断,在屏蔽中断时,先将GIE位的值写入PGIE中,再将GIE写0屏蔽中断。在Enable_int( )中则从PGIE中读值,写入GIE。这样就可以避免意外改变系统的中断状态。
经过对OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM这3个文件中的函数进行编辑,就可以完成μC/OS-Ⅱ操作系统在TMS320C6713芯片上的移植。
4 测试移植代码
将μC/OS-Ⅱ操作系统移植到TMS320C6713芯片上后,还需要对移植后的操作系统进行测试。本次测试需将程序下载到6713开发板中进行验证。测试共分为两个步骤:首先是在没有添加任何用户任务的前提下,对内核本身进行测试;第二步是建立基于消息邮箱的多个任务,在此基础上验证操作系统内核的多个任务调度是否正确,从而验证系统移植成功与否。
首先不添加任务应用代码测试内核自身的运行情况,测试代码为:
#include “includes.h”
void main(void)
{
printf(“InitializinguC/OS-II.\n”);
OSInit();
printf(“StartinguC/OS-II.\n”);
OSStart();
}
内核测试的运行结果表明μC/OS-Ⅱ内核运行正常。在此基础上创建两个任务,任务1是控制6713开发板上的小灯打开,任务2是控制小灯关闭,两个任务技术之间使用消息邮箱通信,进行任务切换。操作系统初始化后,创建任务1和任务2两个任务。在创建任务时,定义任务1的优先级高于任务2。所以系统首先执行任务1。在任务1执行3S之后,向任务2发送一条消息,任务1挂起,任务2开始执行;任务2执行1S之后,再向任务1发送一条消息,任务2挂起,任务1又开始执行,如此循环。系统任务调度流程图如3所示。
运行后,看到6713开发板的LED灯以3S亮,1S灭的频率闪烁,该结果表明操作系统调用的所有函数都工作正常,从而表明整个移植及其测试工作已经完成。至此可以验证μC/OS-Ⅱ已经正常工作,可以在此基础上添加新的应用程序,实现用户需要的功能。
5 结束语
本文论述了嵌入式操作系统μC/OS-Ⅱ在DSP上的迫切需求,实现了嵌入式实时操作系统μC/OS-Ⅱ在TMS320C6713芯片上的移植,并在TDS6713EVM开发板上对移植后的操作系统进行了测试和验证工作。经测试证明:移植后的操作系统在DSP芯片TMS320C6713能够正常运行,可靠性得到了保证,并且实时性也有很大提高。同时,本文介绍的移植方法在同类DSP 架构处理器上具有较强的通用性,对μC/OS-Ⅱ操作系统在其它的DSP处理器上的移植也有一定的指导意义。
参考文献
[1] Jean J.Labrosse 著.邵贝贝等译.嵌入式实时操作系统μC/OS-Ⅱ(第2 版)[M] .北京:北京航空航天大学出版社,2003.
[2] 三恒星科技著.TMS320C6713DSP 原理与应用实例[M].北京:电子工业出版社,2009.4.
[3] 皇甫睿,宋志刚.嵌入式实时操作系统μC/OS-Ⅱ在DSP上的移植[J].航空计算技术,2008.38(4).
[4] 刘海峰,刘百芬. 嵌入式操作系统μC/OS-Ⅱ在DSP 上的移植研究[J].华东交通大学学报,2006.23(1).
[5] 吴小毛.基于点对点即时信息交换安全通信协议模型研究[J].信息网络安全,2012,(04):72-74.
[6] 王希忠,曲家兴,黄俊强等.网络数据库安全检测与管理程序设计实现[J].信息网络安全,2012,(02):14-18.