当前位置: 首页 > ai >正文

0,freeRTOS基础知识

freeRTOS基础知识

注:本文为正点原子“手把手教你freeRTOS系统”视频的总结文字。

1.裸机与RTOS对比

​ 裸机也称前后台系统,前台系统指的是终端服务函数,后台系统指的是while(1)大循环。

特点:

​ 实时性差,只有一个while(1)进行轮询循环。

​ delay函数空等待,不能做其他任务。

​ 所有功能都放在一个无限循环函数中。

​ RTOS(Real Time OS,实时操作系统),对比裸机更强调其实时性,以及CPU资源的使用效率。

特点:

​ 将功能划分为多个任务,每个任务以时间片为最小时间单位,交替运行,宏观上而看作多个任务同步运行。

​ 具有独特的延时函数,不会让函数空等待,而是把CPU资源让出给其他任务使用。

​ 任务分高优先级-低优先级,高优先级任务会抢占低优先级任务。多个任务可以挂载在同一个优先级下。

​ 每个任务都有自己的栈空间,用于保存局部变量和任务上下文信息。

​ 中断不属于软件优先级划分内容,属于硬件中断,可以打断所有优先级的任务。

​ 高优先级的任务不可以一直运行,否则会一直抢占CPU资源,使得低优先级任务无法运行。

2.freeRTOS特点

​ RTOS有很多,如分别为μClinux、μC/OS-II、eCos、FreeRTOS、mbed OS、RTX、Vxworks、QNX、NuttX,而国产的嵌入式操作系统包括都江堰操作系统(djyos)、Alios Things、Huawei LiteOS、RT-Thread、SylixOS。相对于C/OS-II、 embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为6.0版。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

FreeRTOS的不足:

相对于常见的μC/OS—II操作系统,FreeRTOS操作系统既有优点也存在不足。其不足之处, 一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方 面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。

选择freeRTOS的原因:

​ 免费开源,无需担心商业风险。

​ 核心代码量小,最核心的freeRTOS代码仅有9000行左右,并且支持裁剪。

​ 简单易用,可以移植性好。

​ 支持抢占式、携程式、时间片流转任务调度

3.freeRTOS的任务

3.1任务调度

​ 调度器即使用相关调度算法来决定当前需要执行哪个任务。

调度方式适用情况说明备注
抢占式调度优先级不同优先级高的任务抢占优先级低的任务数字大优先级高
时间片调度优先级相同多个优先级相同的任务同时运行多任务轮询
协程式调度优先级不同当前执行任务已知运行,但高优先级任务不会抢占低优先级实时性较差

注:协程式调度官方已不更新。

抢占式调度:

低优先级切换低高先级(条件):低优先级任务运行,高优先级任务就绪(非阻塞)就会抢占低优先级的运行。

高优先级切换低优先级(条件):高优先级任务阻塞状态(系统延时或等待信号量等),切换为低优先级任务(此时优先级次高的任务)运行。

时间片调度:

相同优先级的任务轮流使用CPU时间(时间片),在freeRTOS中一个时间片即SysTick(滴答定时器)中断周期。

在这里插入图片描述
如果Task3在运行时突然进入阻塞状态(系统延时或等待信号量等),则直接切换为Task1进行(不论此时Task3时间片进行的时间,全部丢掉,没有用完的时间片不会再使用)。

3.2任务状态

freeRTOS任务的四种状态:

  • 运行态:正在执行的任务就处于运行态,对于单核CPU同一时间仅有一个任务处于运行态。

  • 就绪态:该任务能够被执行,但当前还未被执行,那么该状态处于就绪态。

  • 阻塞态:由于任务延时/等待外部事件发生,那么此任务处于阻塞态。

  • 挂起态:类似暂停,调用函数vTasSuspend()进入挂起态,需要用解挂函数vTasResume()才可以进入就绪态。
    在这里插入图片描述
    任务的四种状态转换要点:

  • 仅就绪态可转为运行态。

  • 其他状态想运行必须先转变为就绪态。

3.3任务状态列表

  • 运行态:运行态无列表。
  • 就绪态:就绪列表。pxReadyTasksLists[x],其中x代表任务优先级数值(0-31,数字大的优先级高)。
  • 阻塞态:阻塞列表。pxDelayedTasksLists[x]。
  • 挂起态:挂起列表。pxSuspendedTasksLists[x]。

特点:

​ 任务调度器总在就绪列表中移动。

​ 任务想运行,需要将列表转为就绪态,然后根据就序列表从高优先级到低优先级执行。

​ 相同优先级的任务会连接到同一个就绪列表位中。

http://www.xdnf.cn/news/13075.html

相关文章:

  • SpringBoot API接口签名(防篡改)
  • win11 找不到 GPEDIT.MSC Win11找不到gpedit.msc怎么办?Win11提示缺少gpedit.msc文件怎么办???
  • PyCharm 和 Anaconda 搭建Python环境【图文教程】
  • 32位寻址与64位寻址
  • 轻量级屏蔽文件管理方案
  • Ascend NPU上适配Step1X-Edit模型
  • 线程池与并发工具:让并发编程更简单、高效!
  • CodeRider 2.0 体验手记:当 AI 编程照进现实,颠覆想象的开发之旅
  • 【51单片机】4. 模块化编程与LCD1602Debug
  • 中国大学本科专业采用‌学科门类—专业类—具体专业‌三级体系
  • 【DAY44】预训练模型
  • sql语句执行流程
  • 指令管理—弹幕/礼物/快捷键—抖音直播伴侣—使用教程
  • omi开源程序是AI 可穿戴设备的源码。戴上它,说话,转录,自动完成
  • 用大白话解释一下“高基数特征”
  • java+webstock
  • 什么是API调用?通俗解释+实际应用场景详解
  • 【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
  • PAN/FPN
  • Flotherm许可的并发用户数限制
  • 【案例解析】一次 TIME_WAIT 导致 TPS 断崖式下降的排查与优化
  • ThreadLocal 源码
  • RabbitMq安装
  • deepseek: GPU 配套
  • 联邦学习同态加密以及常见问题
  • Vue动态/异步组件
  • 1991-2024年上市公司个股换手率数据
  • Haption 力反馈遥操作机器人:6 自由度 + 低延迟响应,解锁精准远程操控体验
  • 设置Outlook关闭时最小化
  • mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!