0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Cortex-M3处理器上实现μC/OS-III的移植操作

电子设计 来源:郭婷 作者:电子设计 2019-08-14 08:04 次阅读

引言

μC/OS-III是一款基于优先级调度的抢占式实时内核,Micrium公司于2011年8月公开了μC/OS-III的源码,其源码遵循ANSIC标准,因而具有良好的移植性,相信其将会被移植到越来越多的处理器体系上。本文主要完成基于Cortex-M3处理器的μC/OS-III移植,通过本次移植,加深对嵌入式操作系统原理的理解。此外,在μC/OS-III移植成功的基础上进行嵌入式应用程序开发,可以把主要精力集中到应用程序上,而硬件资源交由μC/OS-III管理,从而使得嵌入式应用程序更易开发和维护,在嵌入式软硬件结构变得越来越复杂的今天具有现实意义。

1 μC/OS-III和Cortex-M3特点

相对以前的版本,μC/OS-III最大改进之处在于允许多个任务运行于同一优先级上,相同优先级的任务按时间片轮转调度,内核对象的数量不受限制,以及接近于零的中断禁用时钟周期。

Cortex-M3是ARM公司推出的基于ARMv7-M架构的内核,主要针对高性能、低成本和低功耗的嵌入式应用。Cortex-M3拥有固定的存储器映射,采用更高效的NVIC(Nested Vectored Interrupt Controller)、更简单的堆栈以及更高性能的指令集,且NVIC(包括SysTick)的寄存器位置固定,极大地方便了μC/OS-III的移植及在基丁Cortex-M3内核的处理器之间的迁移。

2 移植

2.1 移植方案

本文移植μC/OS-III内核的版本为V3.02.00,其源代码下载地址见参考文献。选用意法半导体(ST)公司生产的基于Cortex-M3内核的STM32F103RBT6微控制器作为硬件实验平台,而编译环境采用RealViewMDK V3.5。

Cortex-M3支持两种特权级别:特权级和用户级,μC/OS-III内核和用户代码都运行于特权级下。Cortex-M3还支持两个栈指针MSP和PSP,μC/OS-III内核和ISR(Interrupt Service Routine)使用MSP,μC/OS-III的任务则使用PSP。

首先针对Conex-M3处理器的特性编写与内核、CPU和BSP(Board Support Package)相关的源代码,然后创建若干个简单的用户任务,在具体的硬件平台上测试移植后的μC/OS-III。

2.2 内核相关

2.2.1 编写os_cpu.h

os_cpu.h头文件主要是对上下文切换函数和时间戳获取函数进行宏定义。μC/OS-III的上下文切换包括两种类型:任务级上下文切换OS_TASK_SW()和中断级上下文切换OSIntCtxSw()。它们使用相同的代码置位ICSR.PENDSVSET以悬起PendSV异常,由PendSV的ISR“缓期执行”上下文切换。

OS_TS_GET()的作用是获取当前时间戳,若使能μC/OS-III的时间戳功能,则将OS_TS_GET()宏定义为CPU_TS_TmrRd(),否则简单地宏定义为0。

2.2.2 编写os_cpu_a.asm

在os_cpu_a.asm文件中需要用汇编指令实现OSStartHighRdy()函数和PendSV的ISR。OSStartHighRdy()函数被内核用于调度第一个最高优先级的就绪任务,以开始多任务运行环境,汇编代码实现如下:

基于Cortex-M3处理器上实现μC/OS-III的移植操作

Cortex-M3支持PendSV异常,而PendSV异常的典型应用场合就是上下文切换。得益于Cortex-M3的中断机制,μC/OS-III上下文切换只需保存和恢复R11~R4、PSP,而PSR、PC、LR、R12、R3~R0由硬件自动保存和恢复。PendSV的ISR汇编代码如下:

基于Cortex-M3处理器上实现μC/OS-III的移植操作

基于Cortex-M3处理器上实现μC/OS-III的移植操作

2.2.3 编写os_cpu_c.c

os_cpu_c.c文件包含了OSTaskStkInit()函数和若干钩子函数。OSTaskStkInit()函数的作用是在创建任务时初始化任务栈,并返回新的栈顶位置。μC/OS-III基于Cortex-M3的任务栈结构如图1所示。其中PSR、PC、LR、R1、R0五个寄存器应赋予正确的初值,而其他11个寄存器的初值无关重要。

基于Cortex-M3处理器上实现μC/OS-III的移植操作

os_cpu_c.c文件中的钩子函数是μC/OS-III为了扩展用户功能而定义的。进行μC/OS-III移植时至少需要定义OSTaskSwHook()、OSIn itHook()、OSTimeTickHook()、OSIdleTaskHook()、OSStatTaskHook()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskReturnHook()

八个钩子函数。为了简单起见,本次移植不埘钩子函数作功能扩展。

2.3 CPU相关

2.3.1 编写cpu. h

cpu.h头文件主要包括对标准数据类型、字长、栈、临界区的相关定义。标准数据类型与具体的编译器相关,需要查阅相应的编译器手册。Cortex-M3字长是32位,则CPU_DATA和CPU_ADDR皆定义为CPU_INT32U类型。Cortex-M3使用满降序栈,栈增长方向应为从高地址到低地址。临界区方法选用CPU_CRITICAL_METHOD_STATUS_LOCAL。

2.3.2 编写cpu_a.asm

cpu_a.asm文件的最主要部分是临界区函数的实现。根据所选用的临界区方法,中断使能函数CPU_SR_Save()和中断禁用函数CPU_SR_Res tore()代码实现如下:

基于Cortex-M3处理器上实现μC/OS-III的移植操作

Cortex_M3的指令集提供了CLZ指令,则可选地使用汇编指令实现CPU_CntLeadZeros()函数,以加快μC/OS-III调度器查找最高优先级的就绪任务的速度,CPU_CntLeadZeros()函数汇编代码实现如下:

CPU_CntLeadZeros

CLZ R0,R0

BX LR

2.4 BSP

Cortex-M3内核包含了一个SysTick定时器,可以用来给μC/OS-III提供系统时钟节拍。SysTick初始化和ISR的源代码实现分别如下:

基于Cortex-M3处理器上实现μC/OS-III的移植操作

μC/OS-III新增了时间戳功能,用于测量中断禁用时长、代码执行时长和确定事件发生时间等。时间戳定时器可以由DWT(Data Watchpo int and Tracc)的时钟周期计数器CYCCNT充当,该计数器是一个自由运行的32位递增计数器,溢出时自动重载为0,周而复始。时间戳定时器初始化和读取函数源代码实现分别如下:

基于Cortex-M3处理器上实现μC/OS-III的移植操作

此外,本移植过程的BSP还涉及RCC、GPIO、NVIC和LED/LCD等硬件的初始化函数和驱动程序。

3 测试

首先不加任何用户任务来测试移植好的μC/OS-III内核自身运行情况,待验证内核正常运行之后,编写TaskLed1、TaskLed2、TaskLe d3、TaskProfile四个任务,其中前3个任务被赋予相同的优先级(本移植是假设使能了μC/OS-III的轮转调度功能),实现对3盏LED灯不停地

闪烁;而TaskProfile的功能是在液晶屏上显示上下文切换次数。

基于Cortex-M3处理器上实现μC/OS-III的移植操作

运行结果如图2所示。图中3盏LED灯不停地闪烁,验证了μC/OS-III的相同优先级任务轮转调度的特征;LCD上显示CtxSwCtr的值一直在增加,指示不断发生上下文切换。系统连续稳定运行5个小时以上没出现任何问题,可见本移植是成功的。

结语

本文主要论述了基于Cortex-M3内核处理器上μC/OS-III的移植过程并给出关键代码,移植后的μC/OS-III能够稳定运行于STM32F103RB T6处理器上。本移植能通用于大部分Cortex-M3内核的处理器,并对于将μC/OS-III移植到其他体系结构的处理器上具有参考价值。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5056

    文章

    18954

    浏览量

    301649
  • 内核
    +关注

    关注

    3

    文章

    1357

    浏览量

    40179
  • 操作系统
    +关注

    关注

    37

    文章

    6658

    浏览量

    123110
收藏 人收藏

    评论

    相关推荐

    【图书分享】Cortex-M3 + μC/OS-II嵌入式系统开发入门与应用

    Cortex-M3 + μC/OS-II嵌入式系统开发入门与应用》作  者:陈瑶,李佳,宋宝华 编著 内容简介本书首先讲解了Cortex-M3
    发表于 03-13 11:02

    μCOS-III怎么在Cortex-M3处理器移植

    处理器体系上。本文主要完成基于Cortex-M3处理器的μCOS-III移植,通过本次
    发表于 03-31 08:19

    Cortex-M3处理器是什么

    STM32单片机STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器
    发表于 07-16 06:33

    STM32的核心Cortex-M3处理器是什么

    STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CP
    发表于 08-02 08:52

    STM32的核心Cortex-M3处理器简介

    Cortex-M3处理器是什么?Cortex-M3的CPU支持哪两种运行模式?
    发表于 09-23 09:15

    STM32的核心Cortex-M3处理器的标准化是什么意思

    STM32的核心Cortex-M3处理器是一个标准化的微控制结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CP
    发表于 12-06 07:53

    Cortex-M3处理器操作技术有何作用

    Cortex-M3处理器操作技术——“位带”传统的位操作位带操作C语言举例传统的位
    发表于 01-25 06:51

    制造一种基于Cortex-M0和Cortex-M3处理器的SoC

    DesignStartDesignStart计划可以让用户无需预付授权费用,就可以开始设计、制造基于Cortex-M0和Cortex-M3处理器的SoC,当产品成功量产出货之后再支付版税。ARM
    发表于 07-27 16:58

    高性能低成本Cortex-M3处理器

    高性能低成本Cortex-M3处理器,参考下。
    发表于 01-22 14:23 27次下载

    基于ARM Cortex-M3处理器的电源设计及应用

    今天我们就来介绍一个基于Cortex-M3处理器的电源系统设计——GD32F1x0,希望对大家有所帮助。
    发表于 08-28 11:20 14次下载
    基于ARM <b class='flag-5'>Cortex-M3</b><b class='flag-5'>处理器</b>的电源设计及应用

    STM32系列ARM Cortex-M3处理器微控制原理与实践

    STM32系列ARM Cortex-M3处理器微控制原理与实践
    发表于 09-22 16:34 24次下载
    STM32系列ARM <b class='flag-5'>Cortex-M3</b><b class='flag-5'>处理器</b>微控制<b class='flag-5'>器</b>原理与实践

    基于STM32处理器的μC_OS_移植

    基于STM32处理器的μC_OS_移植
    发表于 09-25 11:18 6次下载
    基于STM32<b class='flag-5'>处理器</b>的μ<b class='flag-5'>C_OS</b>_<b class='flag-5'>移植</b>

    基于Cortex-M3处理器的开关磁阻电机控制设计

    基于Cortex-M3处理器的开关磁阻电机控制设计
    发表于 09-29 09:15 9次下载
    基于<b class='flag-5'>Cortex-M3</b><b class='flag-5'>处理器</b>的开关磁阻电机控制<b class='flag-5'>器</b>设计

    STM32系列Cortex-M3处理器编程手册免费下载

    本编程手册为应用程序和系统级软件开发人员提供信息。它对STM32F10xxx/20xxx/21xxx/l1xxx Cortex-M3处理器编程模型、指令集和核心外设进行了完整的描述
    发表于 09-12 08:00 37次下载
    STM32系列<b class='flag-5'>Cortex-M3</b><b class='flag-5'>处理器</b>编程手册免费下载

    Cortex-M3处理器内核与基于Cortex-M3的MCU关系

    Cortex-M3Cortex-M3简述Cortex-M3是ARM公司设计的ARMv7架构下Cortex系列的首秀,其目的是为了让32位处理器加入单片机市场,
    发表于 11-05 18:35 8次下载
    <b class='flag-5'>Cortex-M3</b><b class='flag-5'>处理器</b>内核与基于<b class='flag-5'>Cortex-M3</b>的MCU关系