RTOS官方文档学习

这篇具有很好参考价值的文章主要介绍了RTOS官方文档学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务与协程

区别

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

任务特点

  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开始算,之前的计时清零文章来源地址https://www.toymoban.com/news/detail-666398.html

到了这里,关于RTOS官方文档学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 微软官方学习文档

    链接:https://learn.microsoft.com/zh-cn/dotnet/csharp/ 在C#的学习过程中,我们可以参考微软官方的学习文档。它是一个免费的学习平台,提供了丰富的C#学习路径和教程(如下图),对我们入门到高级应用开发都很有帮助。 如果我们想初步了解可以看 了解如何使用C# 模块: 学习或查

    2024年04月25日
    浏览(46)
  • RTOS任务进行单元测试的4种策略

    https://www.beningo.com/4-tactics-to-unit-test-rtos-tasks/ 超过50%的嵌入式软件项目使用实时操作系统(RTOS)。不幸的是,使用RTOS会给使用现代开发技术(如测试驱动开发(TDD)、DevOps或自动测试)的开发者带来一些问题。例如,当开发者试图为他们的任务编写测试时,他们遇到的第一个

    2024年02月09日
    浏览(35)
  • 学习笔记-elstaciElasticSearch7.17官方文档

    特征 适用于所有 Elasticsearch API 的强类型请求和响应。 所有 API 的阻塞和异步版本。 在创建复杂的嵌套结构时,使用流畅的构建器和功能模式允许编写简洁但可读的代码。 通过使用对象映射器(例如 Jackson 或任何 JSON-B 实现)无缝集成应用程序类。 将协议处理委托给一个 h

    2024年02月14日
    浏览(46)
  • Flink|《Flink 官方文档 - 部署 - 概览》学习笔记

    学习文档:《Flink 官方文档 - 部署 - 概览》 学习笔记如下: 上图展示了 Flink 集群的各个构建(building blocks)。通常来说: 客户端获取 Flink 应用程序代码,将其转换为 JobGraph,并提交给 JobManager JobManager 将工作分配给 TaskManager,并在那里执行实际的算子操作 在部署 Flink 时,

    2024年01月19日
    浏览(55)
  • Flask官方文档学习--从零开始解读(一)

    Flask是一个基于Python语言的轻量级Web框架,与之经常对比的框架还有Django、Tornado等框架,当然学习这些肯定首先要有一点Python基础,当然由于框架带来的优越性,通常在实际应用过程中配置出现的问题要多于编程的问题,如果是在工作中的业务上使用的话,那么更多的是针对

    2023年04月26日
    浏览(42)
  • OpenMMLab MMTracking目标跟踪官方文档学习(一)

    MMTracking 是PyTorch的开源视频感知工具箱。它是OpenMMLab项目的一部分。 它支持 4 个视频任务: 视频对象检测 (VID) 单目标跟踪 (SOT) 多目标跟踪 (MOT) 视频实例分割 (VIS) 第一个统一视频感知平台 我们是第一个统一多功能视频感知任务的开源工具箱,包括 视频对象检测、多对象跟

    2024年02月16日
    浏览(45)
  • python3 爬虫相关学习9:BeautifulSoup 官方文档学习

    目录 1 BeautifulSoup 官方文档 2 用bs 和 requests 打开 本地html的区别:代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1=BeautifulSoup(html1,\\\"lxml\\\") 2.3 用requests打开 本地 html 文件 2.3.1 本地html文件 2.3.2 print(html1) 3 用bs 和 requests 打开 本

    2024年02月08日
    浏览(44)
  • 微控制器实时操作系统实践2了解RTOS任务

    超级循环编程范式通常是嵌入式系统工程师最先接触到的编程方法之一。用超级循环实现的程序有一个单一的顶层循环,在系统需要执行的各种功能之间循环。这些简单的while循环很容易创建和理解(当它们很小的时候)。在FreeRTOS中,任务与超级循环非常相似--主要区别在于

    2024年02月08日
    浏览(48)
  • Flink|《Flink 官方文档 - 内幕 - 文件系统》学习笔记

    学习文档:内幕 - 文件系统 学习笔记如下: Flink 通过 org.apache.flink.core.fs.FileSystem 实现了文件系统的抽象。这种抽象提供了一组通用的操作,以支持使用各类文件系统。 为了支持众多的文件系统, FileSystem 的可用操作集非常有限。例如,不支持对现有文件进行追加或修改。

    2024年02月03日
    浏览(37)
  • 【笔记】Spring Boot 历史官方文档学习(持续更新)

    Spring Boot 2014正式发布1.0版本,距今已经快10年了。看历史官方文档了解重点feature, 帮助自己建立知识网络。 与 Spring 5 官网历史文档学习 一样,尽量保证不误解文档作者的原意,不好翻译的会有原文摘录(包括一些专有名词),并辅以自己的理解。限于篇幅原因,只摘录工作

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包