一、FreeRTOS用途

FreeRTOS一般被用于硬件设计上RAM大小存在一定限制(成本、资源、性能功耗比等)的平台之中,它是目前运用的比较多的实时操作系统之一。选用FreeRTOS作为项目应用一般从以下几方面考虑:

  • 实时性(时间约束):与多数的RTOS一样,每个时钟节拍,就绪的高优先级任务会抢占CPU(FreeRTOS是一个实时调度器,项目在此内核基础上构建满足硬实时的应用)。

  • 确定性(可预测):规定的时间完成任务之间的切换,在有限时间内完成必须的工作,低优先级任务的执行时间是可预测的。

  • 开源免费:对比于其他的一些收费RTOS,FreeRTOS是开源免费的

  • RAM占用:FreeRTOS占用较小的RAM(2K~3K亦可运行)

  • 任务管理:同时支持任务抢占与时间片轮转

基于以上几点特性,FreeRTOS广泛应用于对实时性有一定要求以及资源有一定的限制的系统中,在汽车行业、消费电子、网络服务等行业中的MCU芯片、DSP芯片以及定制化SOC芯片中被大量使用。

二、任务状态

FreeRTOS上面的任务类似Linux上的进程,为实时操作系统上进行系统调度运行的单元。对于单核的CPU而言,任意FreeRTOS系统运行时刻,只有一个任务被执行。

FreeRTOS的任务主要分为以下几个状态:

  • Running

任务正在使用处理器在执行相应的操作,此时任务被称作处于运行态。如果运行的硬件环境为单处理器环境,在一定的时间内只有一个任务在运行。

  • Ready

就绪任务为那些可以做被执行,但因有更高优先级或者同等优先级的任务正在执行,暂时未执行的任务。

  • Blocked

如果任务正在等待定时周期运行或者外部事件、外部资源,则当前任务处于阻塞态。任务可以通过调用系统提供的vTaskDelay函数(或vTaskDelayUntil)进入阻塞状态,设置不一样的系统delay周期进行唤醒进入Ready态。另外任务也可以通过等待队列、信号量、事件组、通知或信号量事件等任务通信机制进入阻塞态,等待这些通信资源是可以设置自身的阻塞时间的,阻塞时间即可以以系统节拍作为最小单元设置timeout时间。Timeout超时时间过去,任务从Blocked态自动切换为Ready态。

  • Suspended

任务的挂起态类似任务的阻塞态,与Blocked态不同的是,处于挂起态的任务不可以通过系统心跳周期唤醒运行,并且Suspended的任务不能以系统心跳作为最小单元设置挂起的超时时间,Suspended的任务不存在自动的从Suspended切换为ready态的情况,只能分别通过vTaskSuspend()和xTaskResume()API调用显式命令任务进入或退出挂起状态。等待任务通信资源的时候,若开启系统挂起功能(INCLUDE_vTaskSuspend 值为1)以及将等待时间设置为portMAX_DELAY,任务直接挂起直到资源满足进行唤醒。此外处于Ready态的任务是可以显示调用vTaskSuspend()让自身进入Suspended态,但是处于Ready的任务意味着等待资源满足,是不会直接切换为Block态。Blockd态一般是运行中的任务发现自身运行资源不满足进行等待资源或者主动进行系统delay才会进入的一个状态。

FreeRTOS任务间状态的联系可参考下图:

三、任务调度

FreeRTOS任务调度方式采用的是抢占式调度与时间片轮转结合的方式。系统默认会将两种方式共同开启。不同优先级的任务采用的是抢占式调度,同等优先级的任务采用的是时间片轮转的方式调度。通过配置configUSE_TIME_SLICING的值,可以选择开启时间片轮转或者关闭时间片轮转。因此,FreeRTOS同时提供在开启时间片轮转时的有时间片的优先抢占式调度算法,在关闭时间片轮转时的无时间片的优先抢占式调度算法。此外,FreeRTOS提供taskYIELD()接口给在运行态任务进入阻塞态或运行态任务调用,进行请求重新调度。

FreeRTOS的任务调度过程主要为任务创建阶段、任务调度器的启动阶段以及任务调度器启动后的正常工作阶段,以下基于ARM的cortex-m4系列平台举例进行说明。

1. 任务创建阶段

FreeRTOS在芯片复位,BootLoader阶段加载完成代码,进入main函数,在main函数完成CPU资源、中断资源以及外设资源等配置之后,根据项目的任务规划创建相应的任务。FreeRTOS提供两种创建任务的方式与相应的API,为动态创建任务方式以及静态创建任务方式,一般而言,多数采用动态创建任务的方式进行任务的创建(以动态创建任务进行说明)。

参数:

  • pxTaskCode:任务实现函数,一般函数中存在无限循环语句以及无返回值,此函数为任务的入口。任务实现的具体功能在此函数中进行调用执行。

  • pcName:任务名字(不可超过预设的configMAX_TASK_NAME_LEN长度)

  • usStackDepth:任务堆栈大小(默认情况下,实际的堆栈大小为usStackDepth的4倍)

  • pvParameters:传递给任务实现函数的参数

  • xPriority:任务优先级,范围为(0 ~ configMAX_PRIORITIES-1),FreeRTOS的任务优先级等级通过宏定义值configMAX_PRIORITIES可进行配置,xPriority的值越大则任务的优先级越高,一般进行任务创建的时候,任务优先级的选择从0 ~ configMAX_PRIORITIES-1进行规划。(其他部分RTOS存在值越小优先级越高)

  • pxCreatedTask:任务的句柄(TCB任务控制块),若创建成功,则此句柄生效

返回值:

  • pdPASS:任务创建成功

  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:堆栈不足,创建任务失败

2. 任务调度开启阶段

FreeRTOS任务调度器开启依赖svc中断与vTaskStartScheduler函数,在cortex-m4系列芯片完成CPU、外设与中断等硬件资源初始化进入到主要函数main函数后,创建项目运行的所需任务,调用vTaskStartScheduler函数开启FreeRTOS任务调度(如下图所示)。

FreeRTOS在任务调度器的启动阶段,会默认自动创建idle任务,idle任务优先级默认为系统最低优先级,源码中会调用prvCheckTasksWaitingTermination函数进行删除任务的资源释放(TCB与任务栈)以及提供idle任务的钩子函数vApplicationIdleHook进行系统负荷的计算,或者使用者可在此钩子函数添加基于自身项目的监控以及feedback。Idle任务的任务入口为portTASK_FUNCTION,部分源码如下:

3. 任务调度运行阶段

基于ARM的cortex-m4系列平台芯片的FreeRTOS的系统中,systick中断、普通外部中断、SVC与pendSV中断与任务(线程)的优先级一般被设计如下:

systick中断 > 普通外部中断 > SVC与pendsv中断 > 任务(线程)

SVC中断多数在任务调度器启动阶段或者进行任务抢占时使用,作为启动任务调度器或者抢占任务。在任务调度器启动完成后,依赖systick中断进行周期性任务调度(时间片轮询或者抢占)以及pendSV中断进行任务的上下文切换与保存。下图以任务A与任务B在任务调度时,中间穿插systick中断以及普通外部中断进行实例说明。

四、任务堆栈

FreeRTOS的任务堆栈总空间大小可以根据具体的项目资源进行配置,FreeRTOS根据具体项目中的RAM的大小规划任务堆栈的总空间,宏定义configTOTAL_HEAP_SIZE值决定总的任务堆的大小。每次创建一个新的任务都会在总的任务堆中申请对应创建的新任务的任务堆栈空间,任务总堆栈的使用如下所示。

五、任务监控

同时配置configUSE_TRACE_FACILITY与configUSE_STATS_FORMATTING_FUNCTIONS的值为1会prvWriteNameToBuffer(),vTaskList()与vTaskGetRunTimeStats()三个函数,开启FreeRTOS的任务监控。此功能可以将当前FreeRTOS的存在的任务的任务状态、任务优先级以及每个任务的最大堆栈剩余空间进行反馈。FreeRTOS的源码中提供的是调用sprintf对这些数值的打印,部分源码如下:

官方的demo打印结果如下所示:

Name:任务名

State:任务状态

Priority:任务优先级

Stack:剩余堆栈(可根据此值对总体的RAM空间进行优化)

六、小结

FreeRTOS的任务机制使得它有很好的实时性,同时原生系统中的各个可裁剪的配置项很好的给不同的嵌入式提供因地制宜的适配,更加吸引各大厂商的是:系统商业免费开源。嵌入式应用中功耗、资源、成本等因素往往是各个厂商进行系统选择的重要依据。目前消费类电子的应用中,因考虑到功耗、资源、成本等,有时会采取大核CPU+小核CPU的架构。大核中往往会加载通用的操作系统(Linux、Android、IOS等),小核中越来越多的厂商考虑在上面搭载FreeRTOS,根据小核的不同应用场景进行裁剪适配使用。免费、开源、易裁剪以及占用资源少使得FreeRTOS有不输于其他RTOS的竞争力。

参考文献;

FreeRTOS官方文档:https://www.freertos.org/features.html

FreeRTOS官方代码:https://www.freertos.org/a00104.html

FreeRTOS 任务简介相关推荐

  1. 【FreeRTOS】简介

    文章目录 一.FreeRTOS是什么? 二.发展历史 三.相似操作系统 一.FreeRTOS是什么? FreeRTOS是一款开源 免费的嵌入式设备用实时操作系统(Real Time Operating ...

  2. FreeRTOS系列|FreeRTOS简介

    FreeRTOS简介 1. RTOS简介 RTOS全称为 Real Time Operation System,即实时操作系统.RTOS强调的是实时性,又分为硬实时和软实时.硬实时要求在规定的时间内必 ...

  3. FreeRTOS 文件夹内容简介

    FreeRTOS 文件夹内容简介 1.Source 文件夹 底下单位portable文件夹内的RVDS 文件夹,下面包含了各种处理器相关的文件夹. 接口文件都是跟硬件密切相关的,不同的硬件接口文件是不 ...

  4. 【STM32】FreeRTOS简介

    00. 目录 文章目录 00. 目录 01. 什么是FreeRTOS 02. 为什么选择FreeRTOS 03. FreeRTOS特点 04. FreeRTOS商业许可 05. 预留 06. 附录 0 ...

  5. 一、FreeRTOS简介

    初识FreeRTOS 1.什么是FreeRTOS? Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统.注意,RTOS 不是指某一个确定的 ...

  6. FreeRTOS 简介

      FreeRTOS 是一个 RTOS 类的嵌入式实时操作系统.它的社会占有量很高,许多半导体厂商产品的 SDK 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI.蓝牙这些带协议栈的芯片或 ...

  7. FreeRTOS简介

    初识FreeRTOS 1.什么是FreeRTOS? Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统.注意,RTOS 不是指某一个确定的 ...

  8. FreeRTOS学习一(简介)

    1.什么是FreeRTOS RTOS从名字上可以分为free和RTOS两部分.free是免费的意思,RTOS全称是Real Time Operation System,译为实时操作系统.那FreeRT ...

  9. FreeRTOS -- 简介

    FreeRTOS是一个迷你的实时操作系统内核.作为一个轻量级的操作系统,功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能.软件定时器.协程等,可基本满足较小系统的需要. 任务调度机制 ...

最新文章

  1. 某程序员吐槽自己追求某字节HR,暧昧半年,见面后却被告知是普通朋友!心态已崩!网友:别追HR!道行太深!...
  2. php时间之差,PHP获得任意时间与当前时间的时间差
  3. android中利用实现二级联动的效果
  4. (转)C#开发微信门户及应用(1)--开始使用微信接口
  5. request.getParameter、request.getParameterValues、request.getParameterMap用法
  6. 表白代码大全,快来向你的ta表白吧~~~
  7. 元气骑士没有手柄怎么解锁机器人_元气骑士机器人怎么解锁?机器人获取方式和技能介绍...
  8. 69个网盘搜索引擎资源(最全)
  9. 【数据处理】——利用Excel VBA批量将详细地址转换成省市区三级行政区划
  10. PMP 考点 第六章 项目进度管理
  11. ppt模板怎样用到html中,PPT模板怎么设置(ppt模板怎么竖版)
  12. Python绘制正态分布图及求分位数
  13. C语言每日一练——第50天:八进制转十进制
  14. 公务员考试行测、申论答题时间分配
  15. 我的世界boat运行库JAVA10_boat运行库导入下载
  16. 基于SSM的生产计划排程管理系统
  17. 提取小米手机的备份数据
  18. 北京汽车转型背后:“大北汽”棋局中的变与不变
  19. 清华大学的同学,究竟有多难?
  20. docker守护进程启动容器时报错Error response from daemon: Container is not running

热门文章

  1. SSM三大框架整合(Spring+SpringMVC+MyBatis)
  2. 农庄规划软件测试,《模拟农场17》游戏评测:现代化农场让你学会如何种田
  3. 微型计算机的多级存储结构,微型计算机存储系统结构.doc
  4. 地理坐标系之间的转换及经纬度、方位角、距离之间的计算!
  5. pycharm配置python2.7.6环境_pycharm如何配置python环境
  6. C++编译时提示类型未定义(undefined)的可能原因
  7. pip install multiprocessing失败?可以这样解决
  8. c语言中signal函数详细说明--举例
  9. RC并联电路常见应用总结
  10. 钜泉光电2018年 IC校招笔试题目