基于Cortex―M4内核的μCOS―Ⅱ移植

时间:2022-10-10 07:34:42

【摘 要】针对TI公司新推出的基于cortex-m4内核的TM4C123G高性能低功耗芯片,详细介绍了嵌入式开源实时操作系统μcos-Ⅱ在芯片上的移植方法。根据移植的需求,首先介绍了芯片的一些基本功能以及相关的软件开发环境,然后结合芯片的固有特性以及μCOS-Ⅱ移植的需求,使用C语言和汇编语言修改了相关的源文件,并详细阐述了修改的原因。

【关键词】Cortex-M4;μCOS-Ⅱ;TM4C123G;移植

0 引言

目前,嵌入式芯片已经被广泛应用到我们的生活工作中,各种智能电子设备中都有他们的身影,例如智能冰箱、云电视、智能窗帘、扫地机器人等等。嵌入式处理器在所有的处理器市场中已经占据了94%以上份额。在诸多的嵌入式芯片中,基于Cortex-M系列芯片以它高能效的兼容性以及易于使用性获得了广大开发者的青睐。

随着芯片性能的提高,芯片所承担的任务将变得更为复杂,与之前的MCU相比,嵌入式芯片可能需要同时运行几十个不同的任务,因此如何更有效的编写应用层软件,管理众多的硬件模块以及满足每一个任务对实时性的要求已成了亟待解决的问题。使用传统的方式进行嵌入式开发时,开发人员需要在充分了解硬件的基础上设计出驱动程序,并直接在主程序中调用不同的驱动函数完成相关功能。然而,当系统需要完成的任务数量变多时,设计人员将很难保证每一个任务所需要的CPU资源。使用嵌入式实时操作系统的优点是:它可以统一管理系统资源,让开发人员从复杂的CPU资源分配中解脱出来,自动调度多个不同任务程序,提高程序开发效率;将硬件与软件剥离开来,减少软件与硬件的直接相关度,提高系统的可靠性。

μC/OS-II由美国嵌入式系统专家Jean J.Labrosse设计开发,可被移植到多种微处理器中,它是一个可以裁剪的操作系统,通过设置os_cfg.h头文件中的相关宏定义,可启用或者禁用相关的功能。它拥占256个优先级,是一个多任务抢占式的实时内核,优先级序号越低,其任务的优先级就越高,当高优先级任务就绪,就会中断低优先级任务,保证高优先级任务的实时性。μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。

Cortex-M4处理器是ARM公司开发的新一代嵌入式处理器,在M3的基础上,它新增了FPU、DSP和并行计算等功能,极大提高了运算能力。本次移植使用了TI公司生产的TM4C123G芯片,其基于ARM Cortex M4F的内核设计实现,浮点运算符合IEEE754标准,CPU位数32位,主频最高可达80MHz,拥有低功耗模式, systick时钟和嵌套向量中断控制器NVIC,适用于μC/OS-II的移植。软件使用了TI公司提供的CCS集成开发环境。

1 μC/OS-II的移植

μC/OS-II v2.91的源代码分为三个部分,其中第一部分文件放置在Configure文件夹中,用于配置/裁剪系统;另外一部分文件放在Source文件夹中,此部分程序是操作系统的核心文件,无需修改;最后一部分文件在Ports文件夹中,内部包含OS_CPU.h、OS_CPU.c、OS_CPU_A.asm三个文件。在不同的芯片上使用μC/OS-II时,需要结合芯片的特性,对这三个文件进行修改。

1.1 OS_CPU.h文件的移植

该头文件定义了数据类型、处理器堆栈数据字长度、堆栈的增长方向、任务切换的宏定义和临界区访问的处理方法。

由于不同的处理器其内部一次所能处理的字长不一致,因此对于不同的CPU来说,int,unsigned int等数据类型它的字长可能是不同的,μC/OS-II为了保证可移植性,程序中自己定义了一套数据类型,例如使用INT32U表示无符号32位整形,TM4C123G是32位处理器,其unsigned int表示32位无符号整形,因此可以使用typedef将unsigned int定义为INT32U。然而,对于其它一些16位的处理器来说,unsigned int可能表示的是16位无符号整形,因此INT32U必须被定义为unsigned long型。

临界段又被称为关键代码区,是指一小段代码,同一时刻只能够允许一个线程存取资源。在它能够执行前,必须独占某些共享资源的访问权,一旦线程进入了临界段,就意味着在这期间,其它想要获得该共享资源访问权的线程必须等待该线程处理完成,并释放资源。这是让若干行代码能够以原子操作方式来使用资源的一种方法。μC/OS-II是一个抢占式的实时内核,在进入和退出临界段时需要关闭和打开中断,它使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()这两个宏来控制中断打开或者关闭,并提供了三种方式:①直接通过使用指令_disable_interrupt()和_enable_interrupts()开关中断;②将当前的中断状态字压至堆栈,然后再关闭中断,当中断结束后,再将堆栈中的状态字弹出;③保存当前CPU状态字至局部变量,然后关中断,当需要开中断时,再将局部变量恢复至CPU寄存器中。使用前两种方式会造成CPU在中断前后状态不一致,但第三种方式需要汇编指令支持。TM4C123G芯片使用Thumb-2指令集,支持MRS指令,可以将CPU状态寄存器的值返回至通用寄存器中,因此可以使用第三种方式控制中断。OS_CPU_SR_Save和OS_CPU_SR_Restore在.asm文件中定义,由于ARM编译器默认会将函数的第一个参数传送至R0通用寄存器,因此它们可以定义为:

OS_CPU_SR_Save

MRS R0, PRIMASK //保存CPU状态寄存器

CPSID I //关中断

BX LR

OS_CPU_SR_Restore

上一篇:稳心颗粒联合美西律片治疗快速性心律失常的临... 下一篇:中国电信支撑系统业务规则模型的设计