首页 > 范文大全 > 正文

μC/OS-Ⅱ在TMS320F2812上的移植研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇μC/OS-Ⅱ在TMS320F2812上的移植研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:μC/os-Ⅱ是一种可移植应用于多种微处理器的实时内核,在此基础上开发应用软件,可分解多任务系统,简化应用软件的设计。为使某基于μC/OS-Ⅱ开发的实时软件成功移植到tms320f2812上,在分析μC/OS-Ⅱ的硬件/软件结构特点的基础上,首先对与TMS320F2812相关代码和与应用软件相关代码移植问题分别讨论研究。最后通过分析TMS320F2812堆栈空间的寻址方式,给出了扩展TMS320F2812堆栈空间的两种方法。实验证明移植成功。

关键词:μC/OS-Ⅱ;TMS320F2812;堆栈空间;代码移植

中图分类号:TP311文献标识码:B

文章编号:1004-373X(2010)04-086-03

Transplantation of μC/OS- II on TMS320F2812

HE Xiangzhi,WU Hui,ZHOU Wei

(Beijing Aeronautical Technology Research Center,Beijing,100076,China)

Abstract:μC/OS-Ⅱ is a kind of real-time kernel which is transportable in various microprocessor.Application software is develpped,it can decompose multitasking system and simplify application software design.To make software based on μC/OS-Ⅱ successfully transplant to TMS320F2812,the hardware/software structure′s characteristics ofμC/OS-Ⅱ are analyzed firstly,then the code relevant with TMS320F2812 and application software are analyzed and researched respectively.Finally,two kinds of stack TMS320F2812 method are proposed through the analysis of stack TMS320F2812 addressing mode.Experiments prove the transplantation is successful.

Keywords:μC/OS-Ⅱ;TMS320F2812;stack;code transplantation

0 引 言

嵌入式实时控制软件按是否采用操作系统分为两类:前/后台式系统(Foreground/Background)和使用实时操作系统(RTOS)[1]。其中,基于实时操作系统(RTOS)的控制软件设计是在某一操作系统上进行二次开发,操作系统通过一个内核的调度来管理微控制器来保证所有关键的事件都能够尽可能得有效运行。这是由于它允许系统被分成多个独立的模块称之为任务,而且每个任务都可以认为CPU只属于自己,而任务之间的调度则由内核完成,实现相对意义下的“并行”。同时采用基于优先级的可剥夺性调度算法来保证实时性。RTOS将应用分解成多任务,简化了应用软件的设计,同时使得控制的实时性得到保证,可以接近理论上能达到的最好水平[2]。这里主要对在TMS320F2812上移植使用μC/OS-Ⅱ操作系统展开研究与讨论。

1 TMS320F2812

TMS320F2812(以下简称F2812)是TI公司最新一代的2000系列32位定点DSP控制器,支持PWM控制电机,是目前控制领域最先进的处理器之一。其频率高达150 MHz,可以大大提高控制系统的控制精度和芯片的处理能力[3]。F2812提供浮点数学函数库,可以实现浮点运算。F2812集成了128 KB的闪存,优化的事件管理器和可编程通用计数器,还包括了16通道的12 b ADC转换器。片上集成了SCI,SPI,EV,URAT和eCAN等标准通信接口。

2 μC/OS-Ⅱ操作系统

μC/OS-Ⅱ意为“微控制器操作系统版本2”,它是一个完整的,可移植、可固化、可裁减及可剥夺的多任务实时内核,包含了多个相对独立的,短小精悍的目标模块。这些模块分别提供任务管理,时间管理,任务间的通信和同步、内存管理等系统服务。至今,从8 b到64 b,μC/OS-Ⅱ已经超过在40种不同架构的微处理器上完成移植[4]。所谓移植,就是使一个实时内核能在其他的微处理器上运行,基本上就是编写与处理器相关的代码[5]。为了方便移植,大部分μC/OS-Ⅱ的代码是用C语言编写,只有与处理器硬件相关的代码采用汇编语言编写,因此μC/OS-Ⅱ可移植性强。

图1为μC/OS-Ⅱ硬件/软件体系结构图[6]。

图1 μC/OS-Ⅱ硬件/软件体系结构

从图1 可看出μC/OS-Ⅱ是由与处理器相关的代码,与处理器无关的代码及与应用程序相关的代码组成。

3 与处理器相关代码

在μC/OS-Ⅱ的移植中,主要是编写与处理器相关的代码,即主要是头文件OSCPU.H,C文件OSCPUC.C,ASM文件OSCPUA.ASM。

3.1 OSCPU.H文件

OSCPU.H包括了用#defines定义的预处理器相关的常量,宏和类型定义。

(1) 与处理器相关的数据类型定义。因为不同的处理器有不同的字长,所以μC/OS-Ⅱ包括一系列的类型定义以确保其可移植性。对于F2812而言,所有的整数类型包括字符型,短整数和整数及其对应的无符号数类型都用16 b的二进制数表示;长整数和无符号的长整数用32 b的二进制数表示。

(2) 中断处理方式。μC/OS-Ⅱ 定义了两个宏来禁止和允许中断: OSENTERCRITICAL() 和OSEXITCRITICAL()。实现中断的方法有两个:一是在OSENTERCRITICAL()中调用处理器指令来禁止中断,以及在OSEXITCRITICAL()中调用允许中断指令;二是先将中断禁止状态保存到堆栈中,然后禁止中断。而执行OSEXITCRITICAL()时,只是从堆栈中恢复中断状态。对F2812移植采用第二种方法。代码如下:

#define OSENTERCRITICAL() asm(" SETC INTM ")

#define OSEXITCRITICAL()asm(" CLRC INTM ")

(3) 堆栈增长方式。F2812堆栈的增长方式是从下往上,因此定义OSSTKGROWTH=0(OSSTKGROWTH=1表示堆栈从上往下)。

3.2 OSCPUC.C文件

μC/OS-Ⅱ的移植要求编写6个C 函数:OSTaskStkInit(),OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。函数OSTaskStkInit()是惟一必要的,其他5个函数必须声明,但没必要包含代码[7]。OSTaskStk In it()是在用户建立任务时系统内部自己调用的,对用户任务的堆栈进行初始化,使建立好的进入就绪态任务的堆栈与系统发生中断并且与环境变量保存完毕时的堆栈结构一致。

3.3 OSCPUA.ASM

在ASM 文件OSCPUA.ASM 中需要编写4个汇编语言函数:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OSTickISR()。

(1) OSStartHighRdy():OSStartHighRdy() 在多任务系统启动函数OSStart()中调用。实现的功能是:设置系统运行标志位OSRunning = TRUE,将就绪表中最高优先级任务的栈指针装载到SP 中,并强制中断返回。这样就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转。

(2) OSCtxSw():OSCtxSw()其功能是实现任务级的切换。任务级的切换是通过执行软中断指令,或者依据处理器的不同,执行TRAP(陷阱)指令来实现的。F2812中定义TRAP#31实现。

(3) OSIntCtxSw():OSIntCtxSw()完成退出中断服务函数OSIntExit()通过调用OSIntCtxSw(),在ISR中执行任务切换功能。OSCtxSw()是任务间的切换,OSIntCtxSw()则是在中断中发生的任务切换。OSIntCtxSw()函数中的绝大多数代码同OSCtxSw()。区别只是因为ISR已经保存了CPU的寄存器,而不需要再在OSIntCtxSw()函数中保存CPU的寄存器[8]。

(4) OSTickISR():OSTickISR()实现时间的延时和期满功能。该函数具体内容包括:保存寄存器,调用OSIntEnter(),调OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回。

4 与应用相关代码

与应用相关的代码包括两个文件: OSCFG.H和INCLUDES.H。OSCFG.H用来配置内核,用户根据需要对内核进行定制,设置系统的基本情况。比如系统可提供的最大任务数量、是否定制邮箱服务、是否需要系统提供任务挂起功能、是否允许钩子函数等。代码的削减可以通过设置OSCFG.H中的#defines OS???EN 为0或1来实现,当设置为0时,该服务代码就不会生成。INCLUDES.H是系统头文件,包括了内核和用户的头文件。

5 用户代码

μC/OS-Ⅱ在F2812移植中必须使用SP寄存器,该寄存器是16位的,且不支持间接寻址,因此只能使用低64 KB存储空间。这样用户创建任务的堆栈空间,也必须分配在SP能够访问的低64 KB空间里,而在低64 KB空间中只有10 KB空间可以分配给应用程序,具体地址空间地址为[9]:1 KB(M0)+1 KB(M1)+4 KB(L0)+4 KB(L1)=10 KB。这样在碰到开发多任务应用软件时可能就会遇到堆栈空间不够用的问题。解决的办法有两个:一种方法是采用堆栈空间拷贝技术[10],即定义用户堆栈空间,该空间不在低64 KB空间里。而在TCB 结构体中定义OSTCBStkPtr 总是指向用户堆栈最低地址,用于存放系统堆栈映像。在进行任务切换时,首先保存当前任务系统堆栈内容的同时向用户堆栈拷贝数据。其次恢复高优先级任务系统堆栈,方法是:获得最高优先级任务用户堆栈最低地址,以最高优先级任务用户堆栈最低地址为起址,以OSStkStart 为系统堆栈起址,由用户栈向系统栈拷贝数据。这种方法的优点是可使操作系统任务数及任务栈大小不受限制,缺点是过程复杂。第二种方法则比较简单,即在进行每个任务定义时,尽量不定义局部变量,而将大的数组定义为全局变量,因为全局变量是可以不存放在低64 KB空间的。压缩每个任务所需堆栈空间,同时对任务进行合理优化,减少任务数,这样也可达到压缩堆栈空间的目的。笔者在进行移植时,采用的是第二种方法。

6 结 语

至此,完整的移植过程就结束。经实际测试,各个功能部件都能很好的工作,移植工作是成功的。μC/OS-Ⅱ具有很高的可移植性,在TMS320F2812上应用μC/OS-Ⅱ嵌入式操作系统后,由操作系统来管理硬件和软件资源,大大方便了应用程序的设计和扩展。

参考文献

[1]王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2002.

[2]田泽.嵌入式系统开发与应用教程[M].北京:北京航空航天大学出版社,2005.

[3]宁改娣.DSP控制器原理及应用[M].2版.北京:科学出版社,2009.

[4]王奕.基于μC/OS-Ⅱ的无人直升机飞行控制系统软件设计[D].南京:南京航空航天大学,2008.

[5]魏洪兴,周亦敏.嵌入式系统设计与实例开发实验教材[M].北京:清华大学出版社,2005.

[6]Jean J Labrosse.嵌入式实时操作系统μC/OS-Ⅱ[M].邵贝贝,译.北京:北京航空航天大学出版社,2003.

[7]秦绍华,陈涤.μC/OS-Ⅱ在80C51下的移植[J].信息技术与信息化,2005(2):39-40.

[8]田力,张小林,胡永红.基于μC/OS-Ⅱ的无人机数据采集系统[J].计算机测量与控制,2009(17):237-239.

[9]孙丽明.TMS320F2812原理及其C语言程序开发[M].北京:清华大学出版社,2008.

[10]沈睿,许峰.μC/OS-Ⅱ在DSP2407上若干移植问题的研究 [J].中国水运,2007(5):175-176.