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

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

3天内不再提示

FreeRTOS任务调度器外部接口、以及大体作用,基本组成情况

Q4MP_gh_c472c21 ? 来源:嵌入式ARM ? 作者:逸珺 ? 2020-12-24 15:56 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

学习梳理一下FreeRTOS任务管理单元实现思路,代码分析基于V10.4.3。从本文开始计划写个图解freeRTOS内核系列笔记分享给朋友们,希望大家喜欢。文章中或有错误,也请留言交流指正

本文主要学习梳理FreeRTOS任务管理器的基本原理,大体框架。

内核任务管理器需求

先来对比一下裸奔系统与RTOS应用系统的编程模型,看看两种编程的不同画风。

裸奔系统

在不用RTOS的单片机应用开发时,编程模型大概是这样的画风:

db8ffb76-45b8-11eb-8b86-12bb97331649.png

程序的主体是一个死循环,该应用程序由一系列协同工作的函数片段组成,相互实现逻辑配合,实现用户业务需求。该应用程序独占单片机,常规的单片机系统都仅有有一个计算单元核。

普通外设I/O,这里所说I/O是指广义的I/O,比如GPIO、PWM、ADCDAC、LCD显示(当然这里并不严谨,比如ADC,DAC、LCD等也可以产生中断)等。中断函数将异步事件接收成或报文或标志或数值,在与主循环发生逻辑关联。

中断外设,比如UARTUSBI2C定时器DMA等根据应用需求而使用的中断。这些中断都需要相应的中断函数进行处理异步中断事件。对于输出可能采样主动输出,一般由主循环某一个动作执行;对于输入设备或许采用轮询方式,在与主循环进行耦合

RTOS应用系统

在一个基于RTOS应用系统中,其编程模型大致是下面这样一个画风,有多个并行的任务在相对长的宏观时间维度看起来,多个任务是并行运行的,但对于常规单片机而言(一般都是单核),任一时刻只有一个任务或中断函数在独占CPU核。

dbbe5854-45b8-11eb-8b86-12bb97331649.png

常见的RTOS没有设备驱动模型,没有对外设设备进行抽象,中断函数将会由用户或调用RTOS 机制,比如event/signal等与任务进行通信

任务间还有可能需要通信,或传递消息,或完成某项需求相互间需要同步等

同样任务需要与硬件普通IO外设进行打交道,或入或出。但有可能是这个任务实现,也有可能是哪个任务执行。完全取决于开发人员如何设计。

RTOS实现任务的切入切出,切入使某任务运行;切出使某任务挂起,出让CPU,暂停运行。

RTOS充当底层支持功能,RTOS还提供丰富的时间管理,队列、邮箱等机制供应用开发使用。

......

对于单片机而言,一般只有一个核,所有RTOS为了方便理解,可以看成是最最主要的目就是通过软件方法将硬件CPU核程序运行环境抽象为每一个应用任务虚拟出一个软核。这样从时间维度上看起来多任务是并行的,而事实上这种并行是伪并行。

dc1a7f8a-45b8-11eb-8b86-12bb97331649.png

上图仅仅为理解RTOS作用方便,这种虚拟核本质上并不存在,只是将硬件CPU核的运行时上下文(PC指针、状态寄存器等寄存器组、任务运行时临时变量等)通过快照保存切入切出而实现多任务的伪并行运行。

FreeRTOS任务管理器需求

从前文看出,任务管理要实现任务的切入、切出,则首先需要对任务进行抽象描述,以实现在CPU上能够实现切换。根据阅读代码以及文献加上自己的理解,将内核任务管理器的主要功能需求大致梳理成下面这样一张用例图Use case Diagram,仅仅为理解方便,或许并不严谨。

dc47f4d8-45b8-11eb-8b86-12bb97331649.png

从上图,大致可以看出FreeRTOS任务调度器需要以下一些功能需求:

任务抽象描述,一个任务一般本质上是一个死循环程序片段(当然也有任务运行着会退出被杀掉的可能)。对于任务的抽象:

一般会有任务的执行主体,利用函数主体函数指针进行抽象

RTOS常规都是的基于优先级抢占调度算法,因此需要抽象出哪个任务具有更高概率能被执行,用优先级进行描述

任务需要得以切换,就需要将任务在切换间的临时状态进行保存,栈机制就能很好的满足这样的需求,因此每个任务都有一个或大或小的任务栈。其本质上是一片连续的FILO(先入后出)内存。

.....

任务创建、删除等API接口,供应用开发使用。

任务调度器控制接口,启动调度器、停止调度器、挂起所有任务、恢复运行等调度器接口。

任务杂项信息接口,比如获取任务状态、tick信息、调试、获取任务名等API接口

任务调度算法,基于调度策略对运行时的任务进行调度,或挂起、或运行、或就绪等,主要根据调度策略管理任务的切入切出。这里主要涉及到任务间上下文切换、任务与中断函数间的上下文切换两种场景。

抽象C运行时环境,现代RTOS应用系统一般基于C语言,抽象C运行时环境,这里主要指栈,当然很多RTOS内核也内核堆,freeRTOS也不例外。熟悉C编程的朋友都知道,堆内存由malloc/free函数操作集提供用户接口,既然C堆已有,为何RTOS内核重新造轮子?为啥内核额外需要实现自己的堆管理器呢?这大体是基于下面些缘由:

编译器C堆实现,在小型嵌入式系统上有时候并不能直接使用。

C堆的实现可能相对较大,占用了较大代码空间。比较浪费有限的代码存储空间。

C堆很少是线程安全的。

C堆申请执行时间不是确定的, 执行功能所需的时间因调用而异。

C堆会在单片机有限的内存资源引发内存碎片问题。

C堆会使链接器配置复杂化。

C堆如引发未知错误,不便于调试。

FreeRTOS任务描述抽象

dcb19dca-45b8-11eb-8b86-12bb97331649.png

对于其中几项必须的关键数据域描述一下其抽象作用:

pxTopOfStack:指向任务栈栈顶指针

xStateListItem:任务状态链表描述节点,用于动态将该任务添加、删除到就绪或阻塞任务对列链表中

xEventListItem:事件链表描述节点,描述本任务相关事件,用于将本任务添加到事件链表中。

uxPriority:任务优先级,用于描述本任务的优先级。

pxStack:任务栈指针,指向本任务的任务栈。

pcTaskName:任务名字符串存储区,长度可配。默认为16字节

其他的数据域,可裁剪实现一些更丰富的功能,比如主要用于防治优先级反转的优先级继承机制,trace追踪功能等。限于篇幅,也主要梳理任务管理器的主要原理,就不展开了。

任务创建删除管理

FreeRTOS为用户提供一组函数集用于任务的创建、删除等管理,先看任务的创建API:

xTaskCreate/xTaskCreateStatic 都是用于创建任务而用,其区别在于:

xTaskCreate 申请任务控制块以及栈从内核堆申请

xTaskCreateStatic 创建的任务,其任务控制块内存以及任务栈内存由用户传入。或许有朋友会问StaticTask_t这不是任务控制块嘛,仔细看看其结构定义其内存对齐及大小刚好是前面说的任务控制块的定义。

xTaskCreateRestricted() /xTaskCreateRestrictedStatic(),主要用于在有或使能MPU单元的芯片中创建任务。这里的MPU是指Memory Protection Unit (MPU),不是微处理器的意思。这两者的区别与上面两个API类似,主要在于其内存分配方式不同,xTaskCreateRestricted是从内核堆动态申请,xTaskCreateRestrictedStatic用户传入。

PRIVILEGED_FUNCTION 这个宏是用于存储保护单元芯片的。

这几个任务创建函数都是用于任务创建,任务一旦创建就会被插入任务就绪链表中,当调度器调度启动后就按任务状态机根据调度策略以及外部输入事件进行调度接管。这里以xTaskCreate绘制一下其内在干了些啥:

dcfc9af0-45b8-11eb-8b86-12bb97331649.png

再看看另外两个函数:

o4YBAF_kSxaAdRRhAAAqUyKbKfE918.jpg

vTaskAllocateMPURegions: 定义一组内存保护单元(MPU)区域,供MPU受限任务使用.

vTaskDelete: 删除用使用xTaskCreate()或xTaskCreateStatic()创建的任务。

任务控制管理接口

pIYBAF_kSzKANjjhAADQex0DNEM347.jpg

这一系列的API接口操作集主要用于对任务进行挂起延时、获取优先级、自中断函数获取优先级、挂起、恢复运行等操作。基本从其函数名就可以看出其作用。比如:

vTaskDelay调用,会使调用该函数的任务进入阻塞状态一段时间,时间为传入的tick数。

这里需要注意的是有的函数在中断函数体里面不可以调用,需要使用专用版本,具体可以看看手册或注释。

调度器控制接口

o4YBAF_kS0SAKlIGAAA2n1n171k428.jpg

这一组函数API集主要用于调度器的启动、停止控制:

vTaskStartScheduler,主要用于待用户任务创建好后,硬件初始化后,启动内核调度器

vTaskEndScheduler,可用于停止内核调度器,一般很少用到,在一些安全相关的应用可能会在出故障时主动停止调度器。

vTaskSuspendAll,挂起所有任务,可以用用户逻辑主动挂起所有的任务

xTaskResumeAll,恢复所有任务为就绪态。

任务杂项API集

我根据代码及注释及自己理解,将这些API归类到杂项API集合:

pIYBAF_kS2eALpnfAADvoaBzhRg859.jpg

o4YBAF_kS22Abh_WAACTpsQ3fUU002.jpg

这些函数具体作用就不赘述,这里仅仅梳理分类,用到时候查手册即可。

跨平台移植接口

这些接口不同硬件平台需要做具化的移植,做差异化的处理,但是对于FreeRTOS统一了内部调用的接口。这样的思路在应用开发时也可以考虑使用,对于公共部分可以抽象出统一的接口,这样在不同平台上可以很方便的进行移植。对于这些接口后面有机会学习整理分享。

对于用例图中的其他部分,核心调度部分以及上下文切换,篇幅所限留在后面学习整理分享。

总结一下

本文基本学习梳理了一下对于FreeRTOS任务调度器外部接口、以及大体作用,基本组成情况,水平所限,文章中错误难免,欢迎交流指正。

责任编辑:xj

原文标题:图解FreeRTOS 原理系列之任务管理器基本框架

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

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

    关注

    13

    文章

    495

    浏览量

    64769
  • 任务管理器
    +关注

    关注

    0

    文章

    15

    浏览量

    7873

原文标题:图解FreeRTOS 原理系列之任务管理器基本框架

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS任务中发送事件队列是有什么限制吗?

    到了TMC的芯片,但是在到位上报的信息中少了卡死电机的上报。所以有的电机的到位中断并没有成功写入任务。 一开始是每个电机都开启了一个定时查询,后续改成一个定时查六个电机并将定时
    发表于 06-11 07:57

    FreeRTOS读取ADS1299数据有误

    您好,请问,用stm32的FreeRTOS的队列对ADS1299传感读取数据,已设置采样率为2khz 在采集任务中:通过spi读取数据——滤波(-DSP库)——将数据写入队列——延时
    发表于 05-05 22:48

    stm32f103用freertos对一个采样率为1kHz的传感,进行采样,数据出差

    您好,请问,用FreeRTOS的队列对采样率1khz的传感读取数据, 在采集任务中:通过spi读取数据——滤波(ARM-DSP库)——将数据写入队列——延时vTaskDelay(1) 在发送
    发表于 05-05 22:44

    【RA-Eco-RA4M2开发板评测】RA-Eco-RA4M2 移植FreeRTOS

    FreeRTOS、Threadx,这里选择FreeRTOS。 Figure 2?5 选择RTOS 接下来就是选择工程模板。 Figure 2?6 工程模板选择 接下来在新建一个空任务。点击“Stacks
    发表于 05-03 23:24

    LPC1227FBD48如何在没有SDK的情况下配置FreeRTOS

    我想在基于 LPC1227FBD48 系列的现有项目中使用 FreeRTOS,但我们没有可用于控制的 SDK。我们如何在没有 SDK 的情况下配置 FreeRTOS
    发表于 04-02 06:33

    移植LWIP+FREERTOS时遇到的问题怎么解决?

    :将ST官网的LWIP1.4.1 的例子(关于LWIP的部分)移植到步骤1 的FreeRTOS 系统的工程里面,只是添加LWIP初始化的任务,并没有调用任何接口情况下可以Ping 通
    发表于 03-11 06:48

    惯性测量单元的作用组成

    物体的加速度、角速度以及磁力信息,进而推算出物体的位置、速度和姿态等参数。本文将详细介绍IMU的作用组成以及应用领域,以期为相关领域的研究和应用提供参考。
    的头像 发表于 02-03 14:19 ?1871次阅读

    基于Flexus X加速MySQL镜像搭建XXL-JOB任务调度平台

    随着云计算技术的飞速发展,Flexus 云服务 X 凭借其高性能和高可用性,成为了众多企业和开发者的首选。本文旨在通过搭建基于 Flexus X 加速 MySQL 镜像的 XXL-JOB 任务调度
    的头像 发表于 12-29 15:45 ?524次阅读
    基于Flexus X加速MySQL镜像搭建XXL-JOB<b class='flag-5'>任务</b><b class='flag-5'>调度</b>平台

    传感的基本组成要素

    在当今科技日新月异的时代,传感作为连接物理世界与数字世界的桥梁,扮演着举足轻重的角色。从智能家居到工业自动化,从医疗健康到环境监测,传感的身影无处不在,它们默默地收集着各种数据,为我们的生活带来了前所未有的便利与智慧。那么,这些神奇的传感
    的头像 发表于 11-28 08:45 ?2055次阅读

    医疗机器人有哪些基本组成_医疗机器人有哪些功能

     医疗机器人是由多个关键部分组成的复杂系统,这些部分共同协作以实现其在医疗领域中的各种功能。以下是医疗机器人的基本组成
    的头像 发表于 10-21 15:31 ?2391次阅读

    自激振荡由什么组成 自激振荡的基本组成有什么和什么

    自激振荡(自激震荡)是一种能够产生连续振荡信号的电子设备,其基本组成主要包括 放大器 和 正反馈网络 。以下是对自激振荡组成部分的介绍
    的头像 发表于 10-06 15:58 ?1056次阅读

    外部存储有哪些

    外部存储是指用于存储数据的独立设备,它们通常与计算机或其他电子设备连接,并提供额外的存储空间,允许用户在不改变主设备内部存储的情况下保存和访问大量数据。常见的外部存储
    的头像 发表于 09-05 10:42 ?5526次阅读

    freertos最多支持多少个任务

    以下几个因素: 系统资源 :FreeRTOS能够支持的任务数量受到系统硬件资源的限制,特别是处理的RAM大小和性能。RAM用于存储任务的控制块(TCB)和
    的头像 发表于 09-02 14:21 ?2413次阅读

    freertos和rtos区别是什么

    。RTOS 的主要特点是实时性、多任务处理、资源管理、中断处理等。 FreeRTOS 是一个开源的实时操作系统,由英
    的头像 发表于 09-02 14:18 ?3320次阅读

    freertos和裸机有什么区别

    的、抢占式实时操作系统(RTOS),适用于微控制和小型处理。它提供了多任务处理、任务优先级、时间管理、内存管理、同步机制等功能,使得开发者能够更容易地编写复杂的实时应用程序。 1.
    的头像 发表于 09-02 14:13 ?3177次阅读