任务与协程

区别

一个程序可以只有任务、只有协程、二者都有,但不可以通过队列/信号量互相传递数据

任务特点

  1. 任务之间可以互相独立

  2. 每个任务分配自己的堆栈,提高了RAM使用率

  3. 操作简单、按优先级抢占式执行

  4. 抢占容易导致重入(执行任务时被其他线程或进程调用了)

协程特点

  1. 一般用于小型,RAM有限制的处理器上

  2. 所有协程共用一个堆栈

  3. 通过一组宏实现的

  4. 减少了重入问题,但是和任务混用总抢不过人家

任务状态

运行、就绪、阻塞、挂起

任务优先级

  1. 0--configMAX_PRIORITIES - 1,最大值定义在FreeRTOSConfig.h中

  2. 设置的越小越好,某些特殊情况不得超过32

  3. 空闲任务优先级为0

  4. 默认情况,相同优先级按时间切片轮流运行

任务调度

单核调度

  1. 抢占式调度,即使在同一时间片,出现了一个高优先级任务,也会打断当前的低优先级任务。

  2. 时间片指两个tick中断之间的时间,相同优先级的任务,一人一个时间片依次执行。

  3. 如果一个高优先级任务永远不阻塞、不挂起,低优先级任务永远也不会执行,因此推荐创建事件驱动的任务,等待事件的时候阻塞掉它,收到事件再解除阻塞

  4. 高优先级任务处于“阻塞”状态时, 低优先级任务会运行。

  5. FreeRTOSConfig中:

    configUSE_PREEMPTION=0关闭抢占,只有阻塞/挂起/运行的任务调用 taskYIELD()/ISR才会切换下文的任务

configUSE_TIME_SLICING=0关闭时间片,相同优先级的任务不会在tick间隔后切换。

AMP调度

非对称多核处理,每个核心独立运行字节的实例,不需要有相同架构

SMP调度

对称多核处理,一个程序跨多个处理器调度

  • 单核移植到SMP
  1. configRUN_MULTIPLE_PRIORITIES = 0 ,可以同时运行优先级相同的多个任务

  2. configUSE_CORE_AFFINITY = 1,通过vTaskCoreAffinitySet() 方法定义某个任务可以在哪个核运行

任务实现

定义任务
void vMyTask(void *pvParameters)
{
for(;;){
Task coding here...
//任务代码写在死循环里,非必要不退出,退出一定要delete
}
vTaskDelete(NULL);
}

typedef void (*TaskFunction_t)(void*);

  • 这句话是什么意思呢,就是TaskFunction_t是一个指向函数的指针,这类函数具有void * 类型的形参,返回值类型是void

  • 事件型驱动代码框架,WaitForEvent是消息队列接收/事件等待等

if(WaitForEvent(事件,等待超时时间))
{Tasking coding here...}
else
{报错、处理错误等}
  • 通过宏定义实现一个任务定义

    portTASK_FUNCTION_PROTO( vMyTask, pvParameters );

队列

队列是任务间通信的主要形式,先入先出

  • 数据被拷贝到队列中,而不是传地址

  • 读空队列、写入满队列都会导致阻塞,高优先级的优先解除阻塞

  • 队列API允许指定阻塞最长时间,

信号量

是一种实现任务间通信的机制,是一个计数器

每当有个任务获取信号量计数器就减一,变成0后所有试图获取信号量的任务都阻塞了

信号量当前的值就是可用资源数,

二值信号量

许多情况下可以用任务通知代替二值信号量

  • 信号量API允许指定最大阻塞时间,阻塞时间指的是tick间隔的数量

  • 二进制信号量可视为容量为1的队列

用处

一个任务只用来服务一个外设,但不是一直服务的,还有轮询或者其他无关操作,这时候就可以用二值信号量减少资源浪费。

具体操作为:

  1. 任务执行时获取信号量,所谓获取信号量就是让计数器-1,变成0了,于是进入阻塞状态,其他任务想执行就可以执行

  2. 当外设需要任务了,就触发中断给出信号量,也就是变成1了,原来的任务不阻塞了,继续为外设服务。

  3. 我觉得可以理解成把主动权交给外设,需要任务就叫他

计数信号量

长度大于1的队列

用处

  1. 初始定义信号量为0,用来盘点事件,发生一个事件+1,处理后-1

  2. 初始定义信号量为MAX,用于资源管理,每执行一次任务减一

互斥锁

互斥锁是包含优先级继承机制的二进制信号量

在 FreeRTOS 中,通常采用抢占式调度。这意味着当一个高优先级任务准备好并且具备运行条件时,它会立即抢占当前正在执行的低优先级任务。

然而,即使是抢占式调度,仍然可能出现低优先级任务占用资源导致高优先级任务无法执行的情况,原因就是高优先级任务没有准备好

  • 互斥锁之所以叫互斥,是因为它执行当前的任务时把他优先级调到最高了,就算浪费资源也要先把它执行完

  • 不要在中断中使用互斥锁,因为中断无法保持阻塞等待互斥锁的任务执行完毕,而且优先级继承机制要求从任务中拿出而不是中断中

递归互斥锁

只有一个任务成功执行n次(递归深度)才可以解锁

任务通知

每个任务都有一个任务通知数组,数组里每条通知都有挂起、不挂起俩状态和一个32位通知值

  • configTASK_NOTIFICATION_ARRAY_ENTRIES 设置任务通知数组最大索引

  • 直达任务通知是直接发到任务的事件,而不是通过队列信号量等间接发送到任务的事件

  • 发送通知的任务,发送前后状态不变(就绪/运行);接收通知的任务,接收前可能是阻塞/运行,取决于通知的状态是否已经是挂起(挂起就是已经发过了,读取后变为非挂起);接收后取决于接收到的通知内容变化

  • 任务通知创建任务时就带了,是一个任务通知另一个任务,或者通知自己!!!

软件定时器

概述

作用是 让函数在未来的设定时间执行,这个函数就叫做回调函数

  • 定时器启动--经过一个周期--回调函数执行

  • 定时器回调函数,不要调用vTaskDelay()等会阻塞的函数

  • 定时器服务任务,通过队列接收命令(通过API函数发出),这个队列叫定时器队列,不可直接操作,只能用API写入,定时器任务函数读取并删除

定时器是可选功能,想用的话:

  1. timer.c

  2. FreeRTOSConfig.h中,configUSE_TIMERS = 1,表示创建调度器自动创建定时器任务

  3. configTIMER_TASK_PRIORITY 定时器任务优先级,其实就是任务优先级

  4. configTIMER_QUEUE_LENGTH 定时器队列长度

  5. configTIMER_TASK_STACK_DEPTH 分配给定时器任务的堆栈大小,取决于回调函数

一次性定时器和自动重载定时器

  • 一次性定时器只执行一次回调函数,后面再想执行需要手动启动

  • 自动重载定时器,执行完后自动重新执行

  • 定时器可以重置,重置后从0开始算,之前的计时清零

RTOS官方文档学习的更多相关文章

  1. Spring 4 官方文档学习(十二)View技术

    关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...

  2. Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

    内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...

  3. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  4. Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图

    接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...

  5. Spring 4 官方文档学习(十一)Web MVC 框架

    介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...

  6. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  7. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)

    题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...

  8. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  9. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  10. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

随机推荐

  1. .NET8中的Microsoft.Extensions.Http.Resilience库

    接上一篇,https://www.cnblogs.com/vipwan/p/18129361 借助Aspire中新增的Microsoft.Extensions.ServiceDiscovery库,我们 ...

  2. LRU缓存及其实现

    缓存是我们日常开发中来提高性能最直接的方式,经常会听到有人说:性能不行?是因为你没加缓存!常见的缓存有外部缓存服务以及程序内部缓存,外部缓存服务包括:Redis.Memcached等,内部缓存就是我们 ...

  3. 力扣1070(MySQL)-产品销售分析Ⅲ(中等)

    题目: 销售表 Sales: 产品表 Product: 编写一个 SQL 查询,选出每个销售产品 第一年 销售的 产品 id.年份.数量 和 价格. 结果表中的条目可以按 任意顺序 排列. 查询结果格 ...

  4. EasyNLP开源|中文NLP+大模型落地,EasyNLP is all you need

    ​简介:EasyNLP背后的技术框架如何设计?未来有哪些规划?今天一起来深入了解. 作者 | 临在.岑鸣.熊兮 来源 | 阿里开发者公众号 一 导读 随着BERT.Megatron.GPT-3等预训练 ...

  5. 聚焦 | 数据湖分析如何面向对象存储OSS进行优化?

    简介: 最佳实践,以DLA为例子.DLA致力于帮助客户构建低成本.简单易用.弹性的数据平台,比传统Hadoop至少节约50%的成本.其中DLA Meta支持云上15+种数据数据源(OSS.HDFS.D ...

  6. [GPT] 同为 nodejs 库的 Puppeteer 和 cheerio 的区别是什么

    Puppeteer 和 cheerio 是两个完全不同的库,用途和功能也截然不同. Puppeteer 是一个 Node.js 库,它使用 Chrome 或 Chromium 浏览器作为渲染引擎,通过 ...

  7. dotnet C# 使用 Vortice 支持 Direct2D1 离屏渲染

    本文告诉大家如何使用 Vortice 进行 D2D 的离屏渲染功能,本文将在一个纯控制台无窗口的应用下,使用 Direct2D1 进行离屏绘制,将绘制结果保存为本地图片文件 本文属于使用 Vortic ...

  8. java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    解决错误: java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider 整合一遍通用mapp ...

  9. Go:基于 MongoDB 构建 REST API — Fiber 版

    本文主要在于带着大家完成一个基本的 CRUD 工作,让大家熟悉 Fiber + MongoDB 构建 RESTful API,熟悉工作流程.同时了解相关库的使用. 本文的完整代码见:https://g ...

  10. 记录——Qt Qcreator 顶部菜单栏的隐藏与恢复

    问题 我有一个朋友(嗯~无中生友),手残点击了 QCreator 中视图下的这个玩意儿: 当人的眼神不好时,可能不会看到这些快捷键以及无视这些弹窗. 解决方案 快捷键 ctrl + alt + M 可 ...