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

    文章

    483

    浏览量

    62000
  • 任务管理器
    +关注

    关注

    0

    文章

    15

    浏览量

    7700

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

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

收藏 人收藏

    评论

    相关推荐

    freertos最多支持多少个任务

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

    定时的基本组成和工作模式

    定时是计算机或电子设备中常见的一个硬件或软件组件,其主要功能是测量和控制时间的流逝。它在各种应用中起着至关重要的作用,如操作系统调度、多媒体播放、网络通信、工业自动化控制以及家电设备
    的头像 发表于 08-19 18:28 975次阅读

    简述光纤传输线路的基本组成

    光纤传输线路作为现代通信网络的基石,其基本组成涵盖了多个关键部分,共同协作以实现高效、稳定的光信号传输。以下是对光纤传输线路基本组成的详细描述,旨在全面解析其技术架构与工作原理。
    的头像 发表于 08-09 15:15 475次阅读

    数字光纤通信系统的基本组成和关键技术

    数字光纤通信系统作为现代通信技术的重要组成部分,以其高速率、大容量、长距离传输等显著优势,在通信领域发挥着至关重要的作用。该系统主要由光发射机、光纤传输线路、光接收机以及一系列辅助设备组成
    的头像 发表于 08-09 10:48 1161次阅读

    鸿蒙开发接口资源调度:【@ohos.workScheduler (延迟任务调度)】

    开发者在开发应用时,通过调用延迟任务注册接口,注册对实时性要求不高的延迟任务,该任务默认由系统安排,在系统空闲时根据性能、功耗、热等情况进行
    的头像 发表于 06-04 10:01 857次阅读
    鸿蒙开发<b class='flag-5'>接口</b>资源<b class='flag-5'>调度</b>:【@ohos.workScheduler (延迟<b class='flag-5'>任务</b><b class='flag-5'>调度</b>)】

    浅析FreeRTOS任务调度的三种调度算法和应用

    FreeRTOS在MCU领域应用非常广泛,今天就给大家讲解一下FreeRTOS调度中的三种调度算法,
    的头像 发表于 05-10 14:02 6963次阅读
    浅析<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b><b class='flag-5'>调度</b><b class='flag-5'>器</b>的三种<b class='flag-5'>调度</b>算法和应用

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

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

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

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

    FreeRTOS调度中的三种调度算法实践(上)

    在优先级高于运行态任务任务进入就绪态时,调度立即让这个高优先级的任务“抢占”运行态任务。被抢
    发表于 03-21 13:45 445次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>调度</b><b class='flag-5'>器</b>中的三种<b class='flag-5'>调度</b>算法实践(上)

    RFID系统的基本组成 rfid系统的工作原理

    RFID(Radio Frequency Identification)是一种通过无线电信号识别物品的技术,它由基本组成和工作原理两个方面构成。在本文中,我们将详细介绍RFID系统的基本组成以及
    的头像 发表于 02-04 13:48 3624次阅读

    鸿蒙OS 分布式任务调度

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

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

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

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

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

    陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用

    陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用 陀螺仪和重力传感有什么区别呢? 陀螺仪是一种测量和感知设备,可用于测量或检测物体的角速度和角度变化。它由几个基本组成部分组成,包括旋
    的头像 发表于 12-07 11:26 2917次阅读

    FreeRTOS中的任务管理

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