APP下载

uCOS—Ⅲ在Cortex—M4平台上的移植和实现

2018-03-30梁小骜宋庆国王勃

电子技术与软件工程 2017年16期
关键词:嵌入式系统

梁小骜 宋庆国 王勃

摘要

介绍了嵌入式实时操作系统uCOS-Ⅲ的内核架构,通过对ST公司基于Cortex-M4平台数字信号控制器STM32F407的体系结构进行分析,给出了移植的具体方案。描述了uCOS-Ⅲ在Cortex-M4平台的移植关键技术并给出部分关键代码,最后设计了多任务的应用程序-险证了移植的成功。

【关键词】嵌入式系统 uCOS-Ⅲ Cortex-M4 STM32F407

1 引言

uCOS-Ⅲ是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。它作为Micrium推出的第三代操作系统内核,提供了现代实时内核所期望的大部分功能包括资源管理、同步、内部任务通信等功能。uCOS-Ⅲ也提供了很多特性是在其他实时内核中所不具备的。比如能在运行时测量运行时间性能,直接的发送信号或消息给任务,任务能同时等待多个信号量和消息队列等。因此将uCOS-Ⅲ移植到嵌入式处理器上,对于提高软件产品质量,推进软件产品化及缩短产品研发周期等方面有着重要意义。本文主要介绍uCOS-Ⅲ在ST公司数字信号控制器STM32F407上的移植。

2 STM32F407硬件平台架构

STM32F407作为ST公司推出的嵌入式数字信号控制器系列产品之一,具有更先进的Cortex M4内核、更多的存储空间、较高的运行速度、支持较多高级外设、更低的功耗等优点,其主要指标具体如表1所示。

STM32F407系列处理器的通用寄存器如图1所示,其中R0?R7为低组寄存器,字长全为32位,所有指令均可对其进行访问;R0?R8为高组寄存器,字长全为32位,只有很少16位Thumb可对其进行访问。R13为堆找指针,在CortexM4处理器内核中共有两个堆栈指针,主堆栈指针(MSP)为缺省指针,由内核、异常服务例程及所需特权访问的应用程序代码来使用;进程堆栈指针(PSP)则用于常规的应用代码。R14是链接寄存器,用于在调用子程序时返回存储地址;R15是程序计数器,可用于程序内部分支跳转。

此外,Cortex M4处理器内核还搭载了若干特殊功能寄存器,程序状态字寄存器组(PSRs)用于反映程序执行状态;中断屏蔽寄存器组(PRIMASK、FAULTMASK、BASEPRI),用于控制异常的使能和禁能;控制寄存器(CONTROL)则用于定义特权级别和切换堆栈指针。处理器内部的SysTick定时器可产生固定的中断信号,可作为操作系统的时钟信号。

3 uCOS-lII移植关键技术

3.1 uCOS-Ⅲ源文件体系结构

uCOS-Ⅲ源文件按照由底层到上层的排列顺序进行整理,具体源文件体系结构如图2所示。用户应用程序软件位于最上层,通过调用uCOS-Ⅲ内核的接口函数来实现多任务调度和切换、内存管理和进程间通信等功能。从图2可知,移植uCOS-Ⅲ操作系统的主要任务是对④、⑤两部分代码的更改,使其正常运行于Cortex-M4平台。

3.2 uCOS-Ⅲ与移植相关代码编写

3.2.1 os—cpu—c.c文件

uCOS-Ⅲ移植时首先需确定任务的堆栈结构,进行任务堆栈的初始化工作,以方便第一次任务切换时将堆栈弹出,开始运行任务。需实现的C函数为OSTaskStklnit(),此函数主要功能是将寄存器的内容入栈,要注意堆栈的增长方向,严格按照Cortex M4处理器入栈的顺序将寄存器的内容放入栈中。依据Cortex-M4内核的任务堆栈结构,OSTaskStklnit()函数具体实现如图3所示。

还需编写时钟节拍中断初始化函数OS_CPU_SysTickInit()及中断服务函数0S_CPU_SysTickHandler()以便进行系统的时间管理。OS_CPU_SysTickInit()需在系统的第一个任务开始前进行调用,若在此之后调用,则可能导致系统异常崩溃。OS_CPU_SysTickHandler()函数具体实现如图4所示。

3.2.2 os_cpu_a.asm及os_cpu.h

在os_cpu_a.asm文件中需要编写关于CPU进行任务切换的汇编函数,0S_cpu.h则声明了相关宏定义。该部分重点是编写宏0S_TASK_SW()和宏OSIntCtxSw()。其中宏OS_TASK_SW()用于触发一个软件中断或调用一个函数来实现任务切换,具体实现如图5所示。

调用函数实现切换的具体过程为将当前任务的寄存器入栈,接着待切换任务出栈放入寄存器中即可。入栈时应注意入栈顺序、是否全部入栈等细节。若采用触发软件中断来实现切换时,则需在0s_cpu_a.asm中編写中断服务函数PendSV_Handler()。该函数实现系统未入栈的部分寄存器,然后将待切换任务的堆栈弹到各个寄存器中来实现。宏OSIntCtxSw()用于当执行中断服务程序时,若更高优先级任务就绪,在退出中断时进行任务切换。其代码实现和OS_TASK_SW()类似。

3.3 uCOS-Ⅲ与CPU相关代码编写

该部分代码中cpu_def.h文件用于定义和CPU配置相关的宏,cpu_core.c和cpu_core.h主要包含的是CPU命名、时间戳计算等。以上文件和移植无关,不用进行更改。Cpu_c.c和cpu_a.asm文件和CPU底层相关,这两个文件必须要实现开关中断函数CPU_IntSixEn()、CPU_IntSrcDis()。CPU_IntSrcEn()函数实现如图6所示,CPU_IntSrcDis()函数实现类似。

4 uCOS-Ⅲ移植结果测试

本文定义了3个任务来验证uCOS-Ⅲ在Cortex-M4平台上的移植结果,如图7所示,网络数据处理任务对网络数据包接收任务的数据包进行数据按位取反操作;数据处理完成后通过网络数据包发送任务回送相应数据。任务之间通过邮箱机制进行同步。

系统运行结果如图8所示,STM32F407可正常接收网络数据包并进行数据处理,然后通过网络数据包发送任务将数据处理结果返回,实现了移植测试的预期功能。

5 结语

本文选用ST公司的STM32F407数字信号控制器作为硬件平台,针对Ccmex-M4的体系架构,对嵌入式实时操作系统uCOS-Ⅲ的源码进行相应更改,实现了uCOS-Ⅲ操作系统在Cortex-M4平台上的移植。对于将uCOS-Ⅲ操作系统移植到同类架构芯片上,具有实际的工程应用价值。

参考文献

[1]ARM.Cortex-M4 Devices Generic User Guide [M]. ARM CORP, 2010.

[2]STMicroelectronics.STM32F3 and STM32F4 Series Cortex-M4 programming manual [M].STMicroelectronics group of companies, 2014.

[3]uC0SIII source code [EB/OL].www. micrium.com/downloadcenter/.

[4]吴常玉,曹孟娟,王丽红,译. Joseph Yiu. ARM Cortex-M3 与 Cortex-M4 权威指南[M].北京:清华大学出版社,2015.

[5]刘渊,田彦云,张天宏.基于μC/OS-Ⅲ和ARM的空心杯电机控制器设计[J].单片机与嵌入式系统应用,2015, 15 (04): 51-53.

猜你喜欢

嵌入式系统
Teaching Research on IoT and—Embedded System of Software Engineering
面向应用的智能专业嵌入式系统教学
办公自动化系统的设计
嵌入式系统课程“中断、异常与事件”教学实践及启示
面向实践创新人才培养的嵌入式系统教学研究