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

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

3天内不再提示

构建RTOS Kernel指南 (上)

恩智浦MCU加油站 来源:未知 2023-08-03 08:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1前言试想与我们相伴的MCU如若只存在裸机程序,那么运行到一个包含延时的线程时,我们的CPU就开始“摸鱼”了。为了最大化运行CPU,就需要用到RTOS(RealTime Operating System). 简单来说,RTOS是一个调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统,或者说,其内核是一个任务管理的框架。

市面上已存有许多优秀的RTOS,如FreeRTOS、Zephyr、RT-Thread等。许多小伙伴可能在最初接触RTOS时怯于其超厚的配套书籍或其庞大的代码,但不用害怕,像小编一样庖丁解牛般边学习边构建一个自己的RTOS是一个很好的学习方法,让我们踏上RTOS的学习之旅! wKgaomToOvKAc6OSAADetuivD1w567.png

图1 RTOS版本

就好像要盖一座高楼,必然先得考察地势地貌,地基稳固,才能逐渐添砖加瓦。构建一个RTOS也是同样道理,需要知道它运行在一个怎样的架构上,以NXP的RT系列芯片为例,我们需要了解学习ARM Cortex-M系列的架构内容。这是一个非常庞大的体系,这里推荐《ARM Cortex-M3 Cortex-M4权威指南》,是一本不错的参考书籍。下文将列举构建一个RTOS所需要的最为核心的内容。 wKgaomToOvKAPWsgAAEDZ-tJBPc915.png图2《ARM 图2 Cortex-M3 Cortex-M4权威指南》

2ARM处理器架构相关内容

2.1 操作模式和状态wKgaomToOvKAZRhTAAEn-l5RC5k593.png                     图3操作模式和状态

Cortex-M系列有两种操作状态和两种模式,并可以区分特权和非特权访问等级。其中调试状态只在连接调试器的时候起作用,若处理器在执行程序代码,则处于Thumb状态,Cortex-M处理器不支持ARM状态,所以ARM状态不存在。

两种模式为处理模式线程模式处理模式用作异常处理,并总具有特权访问等级;在执行普通的应用程序代码时,处理器处于线程模式,此时可能处于特权访问等级也可能处于非特权访问等级,前者可向后者切换,但是后者向前者切换则需要借用异常机制。

2.2 寄存器

Cortex-M处理器在内核中具有多个执行数据处理和控制的寄存器,这些寄存器大都以寄存器组的形式进行了分组。以cortex-M4处理器为例,寄存器组中有16个寄存器。wKgaomToOvOAd-CzAAHTXPSpwzU129.png                       图4 寄存器组中寄存器其中R0-R12为通用寄存器,R13为栈指针,用于实现栈存储的访问。物理上存在两个栈指针:主栈指针(MSP)用于处理模式,以及进程栈指针(PSP)只能用于线程模式。R14也被称为链接寄存器,用于函数或子程序调用时返回地址的保存。R15为程序计数器。除了寄存器组中的寄存器之外,处理器中还存在多个特殊的寄存器。下面为几个较为典型的特殊寄存器: wKgaomToOvOAQGDFAACYHdicB_o486.png                                 图5 特殊寄存器 其中,程序状态寄存器包含三个状态寄存器,用于保存处理的状态信息。PRIMASK、FAULTMASK、BASEPRI寄存器都用于异常或中断屏蔽,CONTROL寄存器则用于栈指针的选择和线程模式的访问等级。

2.3 向量表和系统控制块

当Cortex-M处理器接受了某种异常请求后,处理器需要确定该异常处理的起始地址,该信息位于存储器内的向量表中。构建RTOS用到的最为核心的异常为PendSV,其优先级最低,可以被其他中断打断,因此通常用作上下文的切换,也就是任务的切换。wKgaomToOvOATR4NAAFvTZLr7sc572.png                         图6 中断向量表

系统控制块(SCB)中包含了若干用于中断控制的寄存器,其中有一个与RTOS密切相关的为中断控制和状态寄存器(ICSR),通过将第28位进行使能操作,可以触发我们需要的PendSV中断异常。

wKgaomToOvOAH9iVAADzepuMCcI861.png              图7 中断控制和状态寄存器(ICSR)

3任务切换的实现

上述背景知识是为构建RTOS而提炼的内容,作者在这里建议在开发学习过程中带着疑问前进,边学习边扩展。下面就可以对RTOS的最基本功能——任务切换进行实现。首先我们需要知道,不同于裸机程序,RTOS的每个任务都有独立的上下文环境,在发生任务切换时,需对每个任务的状态数据进行保存,那么需要为每个任务配备有独立的栈空间。

当触发任务切换时,需要首先暂停当前任务的执行,并保存当前任务的状态数据到任务对应的栈空间,再将栈指针更新到切换的目标任务的栈空间,最后从该栈空间中恢复其状态数据,至此完成了任务的切换。wKgaomToOvOAHvVHAAD3mNaiefI740.png 图8 任务切换的步骤

需要注意的是,当PendSV异常触发时,硬件系统会自动保存xPSR、LC、R12、R3-R0寄存器,R11-R4的压栈需要代码实现。除此之外,在任务初始化的时候,也需要对栈空间进行初始化,并且在系统运行第一个任务时,无需进行压栈的操作,因此需要判断任务是否为初始任务,一个较为简单的办法是在运行初始任务之前将PSP置0用于判断,但这样对系统的运行效率有一定影响,较为成熟的RTOS中有更为巧妙的处理办法,有兴趣的读者可以自行查阅。

wKgaomToOvOAXEgDAADtvW9c_MM468.png 图9上下文切换的流程

实现到这里,一个RTOS的地基已经铸成,请继续翻看下集学习: 优先级查找,优先级反转,临界区保护和线程同步功能的详细介绍哦!

END

更多恩智浦AI-IoT市场和产品信息,邀您同时关注“NXP客栈”微信公众号

wKgaomToOvSAeEyxAABCdkRE230598.jpg      

NXP客栈


恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

长按二维码,关注我们

恩智浦MCU加油站


这是由恩智浦官方运营的公众号,着重为您推荐恩智浦MCU的产品信息、开发技巧、教程文档、培训课程等内容。

wKgaomToOvSAfqN9AAATNlPH08Y848.jpg  

长按二维码,关注我们


原文标题:构建RTOS Kernel指南 (上)

文章出处:【微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。


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

    关注

    147

    文章

    19107

    浏览量

    403207
  • 恩智浦
    +关注

    关注

    14

    文章

    6122

    浏览量

    153344

原文标题:构建RTOS Kernel指南 (上)

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux Kernel 6.1 tools目录全解析 | RK平台ARM64交叉编译实战指南

    、硬件测试等全场景能力。 本文完整拆解 Linux Kernel 6.1 tools 目录所有模块功能,并给出 RK 平台 ARM64 架构交叉编译的标准指令 ,一站式解决内核工具使用与编译问题,适合
    的头像 发表于 04-16 18:42 4571次阅读
    Linux <b class='flag-5'>Kernel</b> 6.1 tools目录全解析 | RK平台ARM64交叉编译实战<b class='flag-5'>指南</b>

    基于极海APM32F4的Azure RTOS ThreadX移植过程分享

    最近在玩APM32F407IG的板子,发现官方提供了两个RTOS的demo,FreeRTOS和RT-thread。想着APM32F4这么丰富的资源,是不是也可以跑一下ThreadX RTOS看看
    的头像 发表于 04-02 11:30 650次阅读
    基于极海APM32F4的Azure <b class='flag-5'>RTOS</b> ThreadX移植过程分享

    如何在 VF2 编译东西?

    了 gcc 的 riscv 版本,但我在这里不知所措。 你们中的一些人设法在 VF2 编译了该模块。 你能写一个简短的 gnereic 指南,介绍如何在黑板编译它吗? 这也可以用作通用编译
    发表于 03-03 07:15

    【瑞萨RA × Zephyr评测】Zephyr RTOS保姆级环境构建与编译下载踩坑版

    笔者介绍一下Zephyr RTOS 保姆级环境构建与编译下载
    的头像 发表于 01-10 10:03 9458次阅读
    【瑞萨RA × Zephyr评测】Zephyr <b class='flag-5'>RTOS</b>保姆级环境<b class='flag-5'>构建</b>与编译下载踩坑版

    使用RTOS时需要注意的几点内容分享

    。 像Open Kernel Labs的OKL4虚拟化RTOS平台解决了该问题。 基本通信 一些文献把任务同步和通信分开来说,但总的来说,它们是一回事。实际就是讲信息是如何交换的。基于消息传递
    发表于 12-23 06:34

    选择RTOS的要点

    更小和资源有限的MCU。例如,CMX的CMX-RTX和CMX-Tiny+可运行在8位MCU到64位处理器RTOS核心:调度和分割 大多数程序员不熟悉RTOS的限制和要求。大多数人通常因其性能
    发表于 12-12 08:00

    RTOS Crash 问题全维度分析与解决指南

    RTOS Crash 问题全维度分析与解决指南 RTOS(实时操作系统)的Crash(崩溃)是嵌入式实时系统中最致命的故障之一,直接破坏系统的实时性、可靠性,甚至引发安全事故。不同于通用操作系统
    发表于 12-08 03:56

    学习RTOS的意义?

    站上可以看到,同样是嵌入式软件工程师,懂RTOS的岗位的薪资普遍高20~50%。 首先,要学会操作系统的应用接口,用好操作系统实现项目功能; 其次,可以学习开源操作系统的源码,这些都是世界最优
    发表于 11-27 08:16

    使用RTOS的SDK,调整rtsmart-menuconfig出现编译错误怎么解决?

    /rtsmart/kernel/rt-thread/components/drivers/include/drivers/usb_host.h:19,from /home/yanxu/rtos
    发表于 07-22 07:59

    请问编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?

    编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?
    发表于 07-11 07:22

    请问cyw20719或cyw20721是否支持RTOS

    请确认 cyw20719 或 cyw20721 是否支持 RTOS? 我们希望使用 RTOS 控制外设 SPI、I2C、PWM、ADC 等。 如果有,您有移植指南吗?
    发表于 07-02 06:54

    下一代PX5 RTOS具有哪些优势

    许多古老的RTOS设计至今仍在使用,包括Zephyr(1980年代)、Nucleus(1990年代)和FreeRTOS(2003年)。所有这些旧设计都有专有的API,通常更大、更慢,并且缺乏下一代RTOS的必要安全认证和功能。
    的头像 发表于 06-19 15:06 1251次阅读

    有没有关于使用英飞凌产品构建充电式 VPD 设备的指南

    有没有关于使用英飞凌产品构建充电式 VPD 设备的指南? 标准中的一个例子: 目标是维持智能手机从外部 PD 充电器的供电,同时保持与 USB 2.0 辅助设备(具体来说,是 USB-uart)的连接。 辅助设备功耗&lt;0.1W。
    发表于 05-16 06:24

    rtosrtos&amp;linux能否调整连接windows后的设备名称?

    rtosrtos&amp;linux 能否调整连接windows后的设备名称
    发表于 05-14 06:19

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER实时软件分析工具SystemView已经在ThreadX v6.4.2上进行了测试。SystemView从v3.60c版本支持Eclipse ThreadX(Azure RTOS),用户
    的头像 发表于 05-06 17:11 1593次阅读