基于Cortex-M3核的μCOS-II移植与应用

时间:2022-09-29 05:50:56

基于Cortex-M3核的μCOS-II移植与应用

摘要:在研究了μCOS-II实时操作系统体系结构、运行环境及运行机制基础上,针对Cortex-M3内核的移植需求, 对μCOS-II实时操作系统在Cortex-M3核上的移植进行了实践。同时分析了μCOS-II在Cortex-M3上的移植条件,编写及修改了移植环境的定制与配置,实现了μCOS-II在Cortex-M3上的移植,最后给出了一个基于μCOS-II嵌入式实时操作系统的简单应用。

关键词:实时操作系统;μCOS-II;Cortex-M3;移植

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)18-5111-04

In the Cortex-M3 of the μCOS-II Transplantation and Application

PAN Li-rui, YUAN Bao-she

(College of Information Science & Engineering, Xinjiang University, Urumqi 830046, China)

Abstract:Based on the study of μCOS-II real time operating system structure、operating environment and operational mechanism,it against the demand for transplant Cortex-M3 kernel, real time operating system in the Cortex-M3 of the μCOS-II transplantation on the practice.It also analyzed the conditions of μCOS-II in the Cortex-M3 of the transplant, edited and modified the customization and configuration of the transplant environment,and achieved the μCOS-II in the Cortex-M3 of the transplant. Finally, an embedded real time operating system based on μCOS-II simple application was given.

Key words: real time operating system; μCOS-II;Cortex-M3; transplantation

1 概述

基于嵌入式操作系统平台的掌上设备将是未来各种信息设备的主力军。目前在各种电脑学习机、游戏机、复读机、电子词典、手机、网关设备、交换机、机顶盒、MP4等各种智能电子产品中广泛使用嵌入式操作系统。而比较著名的Vxworks、pSOS、Neculeus 和Windows CE操作系统它们源代码的封闭性大,从而限制了部分开发者的积极性。因此嵌入式系统需要的是一套高度简练、界面友善、质量可靠、应用广泛、易开发、多任务,并且价格低廉的操作系统。

μCOS-II实时操作系统结构小巧,适合小型控制系统,具有执行效率高,占用空间小,实时性能优良和可扩展性能强等特点,具有可剥夺实时内核,提供了实时系统所需的基本功能,其中包括任务的调度与管理,时间管理,任务间同步与通信,内存管理和中断服务等功能,而且非常方便开发。本文实现基于Cortex-M3核的μCOS-II移植与应用。

2 软硬件开发环境及处理器简介

2.1 软硬件开发环境简介

IAR Embedded Workbench for ARM(下面简称 IAR EWARM)是一个针对 ARM 处理器的集成开发环境[3],它包含项目管理器、编辑器、C/C++编译器和 ARM 汇编器、连接器 XLINK 和支持 RTOS 的调试工具 C-SPY。在 EWARM 环境下可以使用 C/C++和汇编语言方便地开发嵌入式应用程序。比较其他的 ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。

目前IAR EWARM支持 ARM Cortex-M3内核的最新版本是5.11,该版本支持Luminary全系列的 MCU。

2.2Cortex-M3处理器简介

Cortex-M3是ARM公司最新推出的功能强大的先进微处理器核,主要特点包括:(1)32 位 ARM 内核,哈佛架构。(2)兼容 Thumb 的 Thumb-2 指令集。(3)50MHz 运行频率。(4)单周期乘法指令,2~12周期硬件除法指令。(5)快速可嵌套中断,6~12个时钟周期。(6)具有 MPU 保护设定访问规则。(7)64KB 单周期 Flash, 16KB 单周期 SRAM。(8)内置可编程的 LDO 输出。(9)支持非对齐数据的访问。(10)支持位操作。(11)内置系统节拍定时器(SysTick),方便操作系统移植。

3 μCOS-II操作系统简介

μCOS-II是由美国人Jean J.Labrosse编写的一个公开源代码的微内核嵌入式实时操作系统。μCOS-II已经在世界范围内得到广泛的应用,包括手机、路由器、不间断电源、飞行器、医疗设备及工业控制等诸多领域。而且μCOS-II已经通过了非常严格的测试,得到了美国航空管理局的认证,可用在飞行器上。

μCOS-II有如下特点:(1)源代码公开。(2)可移植性好。(3)可固化。(4)可裁剪。(5)可剥夺性。(6)多任务性。(7)可确定性。(8)任务栈。(9)系统服务。(10)中断管理。(11)稳定性与可靠性好。

4 μCOS-II移植的条件及移植的层次结构

4.1 移植的条件

μCOS-II的大部分代码是使用 ANSI C 语言书写的, 因此μCOS-II具有很好的可移植性。但是要使 μCOS-II 正常运行,处理器必须满足以下要求[1]:

(1)处理器的 C 编译器可以产生可重入型代码;

(2)用C语言可以开/关中断;

(3)处理器支持中断,并且能够产生定时中断;

(4)处理器能支持一定数量的数据存储硬件堆栈;

(5)处理器有将堆栈指针以及其他CPU寄存器的内容读出、并存储到堆栈或内存中去的指令。

4.2 移植的层次结构

本移植的层次结构由用户层、中间件层、μCOS-II 源码层、μCOS-II移植层和驱动库层等五个层次组成,每个层次分别对应相应的目录,目录中又包含对应的文件。掌握了这个层次结构,有助于对移植过程的更好理解。此层次结构如1表所示。

5 μCOS-II在Cortex-M3核的移植过程

μCOS-II在Cortex-M3核上的移植主要是改写两部分内容,一部分内容是与应用相关的代码,主要包括2个文件:OS_CFG.H和INCLUDES.H;另外一部分内容是与处理器相关的代码,主要包括3 个文件:OS_CPU. H、OS_CPU_C .C 和 OS_CPU_A.ASM。这三个文件中主要包含以下几个重要函数:OSTaskStkInit()、OSStartHighRdy()、OSCtxSw()和OSIntCtx_Sw()等[4]。

5.1 与应用相关的部分

这一部分包括2个文件:OS_CFG.H和INCLUDES.H。其中OS_CFG.H 用来配置内核,用户根据需要对内核进行修改,而且所有的配置更改包括头文件的增减都在该文件中进行。

INCLUDES.H文件是一个主头文件,它出现在每个.C文件的第一行。我们还可以重新编辑INCLUDES.H,增加自己的头文件。

5.2 与处理器相关的部分

5.2.1 OS_CPU. H文件的编写

OS_CPU. H文件中包含了用#define语句定义的宏、与处理器相关的常数、以及类型。

由于不同的微处理器要求有不同的字长,所以μCOS-II的移植包括了一系列的数据类型定义,以保证其可移植性。以下是修改OS _CPU.H中与编译器相关的数据类型重定义部分。修改后的代码如下所示[2]:

typedefunsigned charBOOLEAN;

typedefunsigned charINT8U;

typedefsigned charINT8S;

typedefunsigned shortINT16U;

typedefsigned shortINT16S;

typedefunsigned longINT32U;

typedefsigned longINT32S;

typedeffloatFP32;

typedefdoubleFP64;

typedefunsigned longOS -STK; /* 堆栈是32位宽度 */

typedefunsigned longOS -CPU -SR; /* (PSR = 32 bits) */

在本移植中,对临界代码的进出定义了一种新的方法,叫方法 4。它定义了一个全局变量 OsEnterSum,OS_ENTER_CRITICAL()关闭中断后,OsEnterSum 加一;OS_EXIT_CRITICAL()首先把OsEnterSum 减一,如果它为零,则重开中断,否则不打开中断,直接返回。其宏定义如下所示:

#defineOS_CRITICAL_METHOD4

原型声明如下:

#if OS_CRITICAL_METHOD == 4

void OS_ENTER_CRITICAL(void);

void OS_EXIT_CRITICAL(void);

#endif

这样做的好处是,OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()不需要一对一地使用,而可以先调用数次OS_ENTER_CRITICAL()后,再调用相同次数的 OS_EXIT_CRITICAL(),重新使能中断。

头文件OS_CPU.H中还需要对以下两个宏定义进行修改:

#defineOS_STK_GROWTH1

#defineOS_TASK_SW() OSCtxSw()

其中OS_STK_GROWTH置为1,表示堆栈从上(高地址)往下(低地址)递减。而宏OS_TASK_SW()是在μCOS-II从低优先级任务切换到高优先级任务时用到的。为了任务调度,可以通过执行OS_TASK_SW()模仿中断的产生。绝大多数处理器会提供软中断或指令陷阱来完成,而这些异常处理函数的中断向量地址必须指向汇编语言函数OSCtxSw()。

5.2.2 OS_CPU_C .C文件的编写

OS _CPU.C中有 10个 C语言函数需要编写:

OSTaskStkInit();

OSTaskSwHook();

OSTCBInitHook();

OSTimeTickHook();

OSTaskStatHook();

OSTaskIdleHook();

OSTaskDelHook();

OSTaskCreateHook();

OSInitHookEnd();

OSInitHookBegin()。

在以上这10个函数中必要的一个函数是OSTaskStkInit(), 但是其他 的9个函数必须声明。为了移植工作的简便,在本移植过程中只编写了OSTaskStkInit()函数。这个函数在OSTaskCreat()和OSTaskCreatExt()的中被调用,其作用是初始化任务的栈结构,让任务堆栈看起来好像刚发生过中断一样,所有的寄存器都保存在堆栈中。函数OSTaskStkInit()代码如下所示:

OS_STK *OSTaskStkInit (void(*task)(void*parg), void*parg, OS_STK*ptos, INT16Uopt)

{

OS_STK *stk;

(void)opt; /*防止编译警告*/

stk = ptos;/*装载堆栈指针*/

*(stk) = (INT32U)0x01000000L;

*(--stk) = (INT32U)task; /*任务入口地址*/

*(--stk) = (INT32U)0xFFFFFFFEL;/*R14 (LR)*/

*(--stk) = (INT32U)0x12121212L;/*R12 */

*(--stk) = (INT32U)0x03030303L;/*R3*/

*(--stk) = (INT32U)0x02020202L;/*R2*/

*(--stk) = (INT32U)0x01010101L;/*R1*/

*(--stk) = (INT32U)parg; /*R0 : argument输入参数 */

*(--stk) = (INT32U)0x11111111L;/*R11 */

*(--stk) = (INT32U)0x10101010L;/*R10 */

*(--stk) = (INT32U)0x09090909L;/*R9*/

*(--stk) = (INT32U)0x08080808L;/*R8*/

*(--stk) = (INT32U)0x07070707L;/*R7*/

*(--stk) = (INT32U)0x06060606L;/*R6*/

*(--stk) = (INT32U)0x05050505L;/*R5*/

*(--stk) = (INT32U)0x04040404L;/*R4*/

return(stk);

}

5.2.3OS_CPU_A.ASM文件的编写

μCOS-II的移植中编写的汇编语言函数如下:

OSStartHighRdy();

OSCtxSw();

OSIntCtxSw();

OSPendSV();

IntDisAll()。

OSStartHighRdy()函数的作用是使用调度器运行第一个任务,也就是运行就绪态任务中优先级最高的任务。

OSCtxSw()函数的作用是进行任务级的上下文切换。任务级的切换是通过执行软中断指令来实现的,要求中断服务子程序、陷阱或异常处理的向量地址要指向OSCtxSw()。

OSIntCtxSw()函数在ISR中执行任务切换功能。与OSCtxSw()函数基本相同,不同的只是不用在OSIntCtxSw()函数中保存CPU的寄存器。

OSPendSV()函数的作用是进行上下文切换。

IntDisAll()函数用于关闭中断控制器中的所有中断。

6 μCOS-II的测试及简单应用

6.1 μCOS-II的测试

当为处理器做完μCOS-II的移植后,紧接着的工作就是验证移植的μCOS-II是否正常工作,而这可能是移植中最复杂的一步。应该首先不加任何应用代码来测试移植好的μCOS-II,也就是说,让内核自己测试自己。有2个理由促使这样做:首先,用户不希望将事情复杂化;其次,如果出现了问题,可以明白问题是出现在移植的内核代码中,而不是应用程序的问题。

可以使用不同的技术测试自己的移植工作,这里通过以下4个步骤测试移植代码:

(1)确保C编译器、汇编编译器及链接器正常工作;

(2)验证OSTaskStkInit()和OSStartHighRdy()函数;

(3)验证OSCtxSw()函数;

(4)验证OSIntCtxSw()函数。

详细步骤在此就不再赘述,以下给出具体的应用来说明。

6.2 简单应用

当移植代码测试成功后,可以测试一些具体的任务,这些任务可以由简单到复杂,不断的进行测试,从而进一步验证内核的稳定性和系统的性能。

这里建立了一个按键控制蜂鸣器的控制任务,其代码如下[5]:

int main (void)

{

OSInit();/* OS-II 初始化uCOS-II的内核 */

OSTaskCreate( taskBuzzer, (void *)0,&GstkBuzzer[TASK_BUZZER_STK_SIZE-1],

TASK_BUZZER_PRIO);/* 初始化启动任务 */

OSStart();/* Start uCOS-II启动uCOS-II */

return(0);

}static void taskBuzzer (void*parg)

{(void)parg;

while(1)

{OSTimeDlyHMSM(0, 0, 0, 100); /* 扫描周期100ms */

switch(keyRead()) /* 读按键值 */

{case 0xFE:/* 只有Key1按下 */

buzzerSound(1000); /* 蜂鸣器以1000Hz频率发声 */

OSTimeDlyHMSM(0, 0, 0, 550); /* 延时550ms */

buzzerQuiet(); /* 关闭蜂鸣器,停止发声 */

break;

case 0xFD: /* 只有Key2按下 */

buzzerSound(1500);/* 蜂鸣器以1500Hz频率发声 */

OSTimeDlyHMSM(0, 0, 0, 550); /*延时550ms */

buzzerQuiet(); /* 关闭蜂鸣器,停止发声 */

break;

default:

break;

}}}

加载后,按下Key1或者Key2分别会使蜂鸣器发出不同频率的声音,说明测试成功,内核能够正常运行。如果测试未成功,要认真找出存在的问题,尤其不能忽略硬件的问题。当然也可以采用其它的测试,如LED灯流水闪烁、串口测试等。

7 结束语

通过对μCOS-II实时操作系统体系结构、运行环境和运行机制以及Cortex-M3内核的移植需求的研究,并正确编写及改写了移植环境的定制与配置,实现了μCOS-II 到Cortex-M3核上的移植。试验表明,移植是成功的,最终实现了移植后的应用。

参考文献:

[1]魏洪兴.嵌入式系统设计师教程[M].北京:清华大学出版社,2006.

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

[3]周立功.ARM 微控制器基础与实战[M]. 2版.北京:北京航空航天大学出版社,2005.

[4]关海,冯大政.μCOSII在基于Cortex-M3核的ARM处理器上的移植[J]. 电子科技,2009(3).

[5]广州周立功单片机发展有限公司. 基于群星Cortex-M3的μCOS-II移植模板的使用[M]. 2009.2.

上一篇:计算机基础课程实践教学体系的构建 下一篇:软件质量度量分析与研究