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
    +关注

    关注

    12

    文章

    473

    浏览量

    61344
  • 任务管理器
    +关注

    关注

    0

    文章

    14

    浏览量

    7671

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

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

收藏 人收藏

    评论

    相关推荐

    STM32F103 FreeRTOS任务调度异常的原因?

    ) { vTaskDelay(500); //延时函数(任务调度) printf(\"Task1rn\");//串口打印 } } void Task2_Task(void
    发表于 04-16 06:24

    FreeRTOS任务调度器的三种调度算法讲解(下)

    配置如下时,调度算法就会变成不带时间片的抢占式调度
    的头像 发表于 03-21 13:46 605次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b><b class='flag-5'>调度</b>器的三种<b class='flag-5'>调度</b>算法讲解(下)

    鸿蒙OS 分布式任务调度

    形式、数据结构、服务描述语言,屏蔽硬件差异;支持远程启动、远程调用、业务无缝迁移等分布式任务。 分布式任务调度平台在底层实现 Ability(分布式任务
    的头像 发表于 01-29 16:50 237次阅读

    工控机的基本组成作用是什么

    工控机的基本组成作用是什么  工控机是用于生产过程中的控制和管理的计算机设备,它具有高稳定性、高可靠性、高性能和多功能的特点。工控机的基本组成包括主机、显示器、输入设备、存储设备、扩展插槽、通信
    的头像 发表于 01-26 14:56 367次阅读

    如何可视化FreeRTOS任务响应时间

    高效的开发基于FreeRTOS的固件需要理解任务、中断和内核之间的交互以及时间序列。
    的头像 发表于 12-22 11:12 490次阅读
    如何可视化<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>响应时间

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式
    的头像 发表于 11-27 17:03 397次阅读

    FreeRTOS的发展历史和技术演进

    提供了可靠、高效的实时调度任务管理。本文将简要介绍 FreeRTOS 的发展历史、技术演进、技术特点,并介绍 ESP-IDF 对 FreeRTOS 的绑定,
    的头像 发表于 11-18 17:55 911次阅读

    FreeRTOS调度器介绍

    FreeRTOS是一个为嵌入式系统设计的开源实时操作系统。它提供了一个多任务内核和一系列功能组件,适合在资源受限的设备上管理实时任务和应用程序。
    的头像 发表于 10-17 16:08 337次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>调度</b>器介绍

    FreeRTOS任务实现和控制块

    是无返回值,而且任务的参数也是 void 指针类型的!任务 函数名可以根据实际情况定义。 (2)、任务的具体执行过程是一个大循环,for(; ; )就代表一个循环,
    的头像 发表于 09-28 11:28 301次阅读

    FreeRTOS任务与协程介绍

    FreeRTOS 中应用既可以使用任务,也可以使用协程(Co-Routine),或者两者混合使用。但是任务和协程使用不同的API函数,因此不能通过队列(或信号量)将数据从任务发送给协程
    的头像 发表于 09-28 11:02 543次阅读

    工控机的基本组成作用是什么?

    工控机是工业自动化控制中不可或缺的设备,具备了数据采集和处理、远程监控和操作、实时控制和调度、数据存储和分析以及故障诊断和维护等重要作用。工控机的基本组成
    的头像 发表于 09-19 10:12 474次阅读
    工控机的基<b class='flag-5'>本组成</b>和<b class='flag-5'>作用</b>是什么?

    FreeRTOS任务通知简介

    任务通知简介 任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。
    的头像 发表于 07-30 11:34 486次阅读

    FreeRTOS中的空闲任务是什么

    任务就会开始运行,空闲任务最重要的作用就是让处理器在无事可做的时候找点事做,防止处理器无聊,因此,空闲任务的优先级肯定是最低的。当然了,实际上肯定不会这么浪费宝贵的处理器资源,
    的头像 发表于 07-30 10:55 763次阅读

    RA FreeRTOS任务创建

    随着嵌入式应用程序变得越来越复杂,单片机裸机开发已经无法满足工程师对于复杂程序的需求。于是具有多任务调度和实时响应特性的RTOS便越来越受工程师们青睐。瑞萨RA系列MCU兼容FreeRTOS系统
    的头像 发表于 07-12 10:00 201次阅读
    RA <b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>创建

    freeRTOS中空闲任务作用

    在嵌入式实时操作系统中,都会有空闲任务的存在,这个任务是伴随着操作系统启动之后而存在的。正常情况来说,系统不挂掉,空闲任务都会一直存在。
    的头像 发表于 07-04 15:16 878次阅读
    <b class='flag-5'>freeRTOS</b>中空闲<b class='flag-5'>任务</b>的<b class='flag-5'>作用</b>