![](https://img-blog.csdnimg.cn/bbe9f3e22d67474c9b4015d4464618c4.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
双核 RTOS 进阶篇
文章平均质量分 92
RTOS 系统化学习的参考资料,
以 ESP32 双核 FreeRTOS 为例,课程介绍参考https://blog.csdn.net/wangyx1234/article/details/127201095
理论与实践结合,以通俗易懂的问题为出发点,循序渐进讲述 RTOS 中编程的要点。
物联网老王
从事嵌入式、物联网开发工作。熟悉单片机、RTOS、Linux、物联网云平台、各种物联网通信协议。致力于成为全栈工程师、开源技术推广者。
欢迎打扰,欢迎订阅我的专栏。
展开
-
RTOS共享资源保护-通过临界区实现 RTOS 中任务之间共享资源的保护
1)临界区是为了避免并行访问共享资源导致非期望或者错误行为而保护对应资源的一种上锁-去锁机制。2)实现临界区的方法有很多,在大部分 RTOS 系统,通过关闭全局中断来实现临界区机制,ESP32 中也是如此。3)ESP32 是双核系统,因此对临界区的 API 添加了一个参数 mutex 来保证双核下的临界区工作正常。4)临界区可以保证临界区内的代码不被中断、任务打断。5)临界区有副作用,因此临界区内的代码应该尽可能短,并且不能包含任何延时或在阻塞。我们将在下节讲述影响更小的共享资源保护方法。原创 2022-11-09 08:00:00 · 1406 阅读 · 0 评论 -
RTOS 驱动开发篇-通过 RTOS 组件实现按键驱动-优化1
1)本小节主要是对上节按键驱动的优化。面向对象编程的思路就是将需要的数据类型打包成一个类、一个结构。在将按键的所有信息打包成一个结构体后,数据信息变的很清晰,添加新的按键也变得容易。原创 2023-02-24 23:25:24 · 1207 阅读 · 0 评论 -
RTOS 驱动开发篇-通过 RTOS 组件实现按键驱动-优化2
1)按键驱动虽然是一个很简单的应用,但该项目综合地包含了 RTOS 中的诸多内容,包括队列、定时器、任务、GPIO、共享资源保护等几个方面。2)本小节继续优化按键驱动,实现一个相对完善的真实的产品中可能使用的按键驱动程序。不仅极大地改善了代码复用性差、数据关系更清晰、支持非常驻模式动态创建、取消一个按键。在后续的学习中,我们将基于 RTOS 实现更复杂的产品级的代码设计,一起努力吧。原创 2023-02-24 23:25:43 · 722 阅读 · 0 评论 -
RTOS 驱动开发篇-通过 RTOS 组件实现按键驱动1
1)RTOS 中的驱动编程,可以结合外设特点,RTOS 中的通信组件、定时器组件、任务来实现。2)按键驱动作为一个典型的外设驱动,需要实现识别按键、识别抖动、执行按键事件的功能,这里介绍一种通过 RTOS 组件实现按键驱动的方法,综合使用了 RTOS 中的软件定时器 + 状态机编程 + 消息队列 + 任务 的相关知识。3)当前的实现虽然实现了基本的功能,但是代码的可复用性差、数据信息也比较混乱,没关系,我们不必一次性写出很NB的代码。原创 2023-02-19 18:03:44 · 1231 阅读 · 0 评论 -
RTOS 系统篇-Tickless 模式简介与测试
1)在不改动 SysTick 中断频率的情况下,想要降低功耗,RTOS 就提供了一种 Tickless 模式。通过 Tickless 模式,当处理器进入空闲任务以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被从低功耗模式中唤醒。2)通常 Tickless 模式下设备还会自动进入低功耗模式,这与设备对 Tickless 模式实现的相关代码相关。原创 2023-02-17 23:41:19 · 410 阅读 · 0 评论 -
RTOS 系统篇-统计任务的 CPU 使用率
1)RTOS 中可以通过一些函数来统计每个任务对 CPU 的占用率,即使用 CPU 的时间占比。2)通过 RTOS 中的可以统计任务自系统启动到当前时间的 CPU 占用率。3)通过使用函数、函数来实现统计某个任务从 T1 时刻到 T2 时刻这段时间的 CPU 占用时间。4)统计 CPU 的使用率通常可以用来发现发现特别占用 CPU 的任务、帮助设置合适的看门狗时间、优化任务之间的优先级设计以及监控设备性能。原创 2023-02-16 10:46:45 · 1005 阅读 · 0 评论 -
RTOS 系统篇-看门狗 WatchDog 2
1)本小节主要讲述如何通过将自定义的任务加入到 任务看门狗监控队列,并通过来喂狗。原创 2023-02-14 21:52:55 · 781 阅读 · 0 评论 -
RTOS 系统篇-看门狗 WatchDog[不喂狗就咬你]
1)本节讲述了 RTOS 中的看门狗(Watchdog)机制。看门狗本质上是一个需要定时复位的定时器,用于确保部分任务\中断能正常得到执行。2)看门狗有中断看门狗、任务看门狗两种,他们的原理和机制类似,只是一个用于监控task 层面的CPU使用情况,一个是用于监控中断层面的 CPU 使用情况。3)默认情况下,负责任务切换的 SyStick 中断通常被加入到中断看门狗,idle task会被加入到任务看门狗。其他中断、任务也可以加入到看门狗,加入后需要及时喂狗(重置定时器)防止触发看门狗。原创 2023-02-14 21:02:58 · 1356 阅读 · 0 评论 -
RTOS 系统篇-双核系统下任务优先级调度与设计
1)本小节首先介绍了双核 RTOS 系统下的抢占式调度、时间片调度与传统 RTOS 的不同。2)然后,讨论了 RTOS 中任务优先级设计的基本原则。3)最后本小节还简介了公共函数使用时互斥访问与可重入设计的问题。原创 2023-02-12 17:12:27 · 504 阅读 · 0 评论 -
RTOS 系统篇-多任务协同与复杂消息的设计
1)本小节介绍了 RTOS 中任务的特性、状态、并重点介绍了任务划分的基本原则与方法。2)本小节还介绍了复杂消息的设计,复杂消息中除了包含数据内容外,还可以包含 callback()、ID等信息(实际上函数、指针等类型本省就是特殊的数据)。原创 2023-02-11 21:41:47 · 327 阅读 · 0 评论 -
RTOS 时间管理篇-使用 SysTick 钩子函数实现定时采样及本章小节
1)本节介绍了使用 SysTick 的钩子函数来完成定时需求的方法和使用背景。2)除此之外,本节总结了 RTOS 时间管理篇中涉及的一些议题。关于时间管理,重点是理解不同机制的产生的时间精确度、系统开销、使用场景与对系统中其他任务或者中断的影响。在实践中验证、在实践中学习。原创 2023-02-04 18:32:15 · 203 阅读 · 0 评论 -
RTOS 系统篇-空闲任务及其钩子函数
1)空闲任务是系统自动创建的,优先级比较低(如上所示,优先级为 0)的系统任务。双核系统下有两个空闲任务。2)空闲任务对于系统的正常运行很重要,一些资源回收(如删除任务后,对应内存的回收工作)、设置处理器工作在低功耗模式的工作就是空闲任务来完成的。3)RTOS 提供了一些钩子函数,允许用户向空闲任务中插入一段自定义的代码。4)空闲任务中适合插入一些重要性、优先级、紧急度底的事情,不能在空闲任务中插入含延时、阻塞的代码。原创 2023-01-03 20:35:12 · 234 阅读 · 0 评论 -
RTOS 系统篇-资源管理模式
1)本小节重点介绍,资源的两种创建模式。常驻模式:任务等资源被创建后,一直存在并运行,当有相应的事件触发时就处理对应的事件。非常驻模式:当相应的事件触发时,才被创建的任务,任务执行完一定的功能后,立即推退出。2)与任务这种资源类似,freeRTOS 中的 信号量、队列、事件组等等组件,其创建模式均可以分为常见的这两种模式。原创 2023-01-03 20:21:58 · 187 阅读 · 0 评论 -
RTOS 内存使用篇-可变长度内存块的使用
1)变长内存块是指使用时按照需要的长度申请内存块,能分配任意大小的空间,但分配和回收效率低,容易形成内存碎片。原创 2023-01-02 16:05:51 · 134 阅读 · 0 评论 -
RTOS 内存使用篇-固定长度内存块的使用
1)定长存储块是长度固定的存储块,具备访问效率高,分配释放快,内存碎片的风险比较小的优点。原创 2023-01-02 16:03:48 · 219 阅读 · 0 评论 -
RTOS 时间管理篇-含信号处理功能的周期性任务
1)本文演示了关于时间管理的另一种常见需求,即定时周期任务中实现处理突发信号的能力。2)可以通过在软定时器中实现状态机、或者通过本文所讲的依靠通信组件的阻塞等待机制实现含信号处理功能的周期性功能。原创 2022-12-26 12:02:35 · 367 阅读 · 0 评论 -
RTOS 时间管理篇- 软定时器 xTimer 的共享资源保护
1)软件定时器 xTimer 同样会与其他任务、中断产生共享资源的竞争访问。2)xTimer 的定时回调与其他任务、中断共享资源时应参考前述讲述的任务与任务、任务与中断之间的共享资源保护方法实现互斥访问。原创 2022-12-26 11:55:06 · 129 阅读 · 0 评论 -
RTOS 时间管理篇- 软定时器 esp_timer 的使用
1)esp_timer 与 RTOS 提供的软件定时器 xTimer 本质都是软件定时器,它们有很多相似的地方可以对比理解。2)esp_timer 的分辨率更高、并且可以在高优先级任务或者中断中执行其回调函数。但同时,这种高优先级甚至中断对回调函数的要求也更严格,要求其尽可能地精简快速。3)esp_timer 的精度也并不是无限提高的,其有一个下限值,并且与优先级、回调函数的设计、创建的软定时器的数量有关。原创 2022-12-19 20:54:58 · 393 阅读 · 0 评论 -
RTOS 时间管理篇-软定时器 xTimer 处理周期性定时事件
1)FreeRTOS 提供的软件定时器支持单次模式和周期模式,周期模式的定时事件每隔一断时间就触发一次一段代码的执行。2)周期定时事件适合完成 状态定时再查询,定时状态切换的功能。3)软定时器 xTimer 精度与 系统时间节拍的精度、定时器任务的优先级、定时器回调函数的设计、创建的软定时器的数量相关。合理调整这些因素可以改善 xTimer 精度。原创 2022-12-19 20:49:47 · 352 阅读 · 0 评论 -
RTOS 时间管理篇-软定时器xTimer处理一次性定时事件
1)FreeRTOS 提供的软件定时器 xTimer 支持单次模式和周期模式。2)FreeRTOS 通过一个 TimerTask 任务(也叫守护任务Daemon)管理软定时器xTimer,该任务主要完成接收命令、管理链表、执行回调函数的任务。3)软件定时器的状态分为 Inactive\active,刚创建的 xTimer 处于 Inactive 状态。4)软件定时器的回调函数要求尽可能地快。原创 2022-12-19 20:41:49 · 240 阅读 · 0 评论 -
RTOS 时间管理篇-RTOS 延时专题
1) RTOS 提供的延时函数,实际的延时往往不准,较坏的情况下误差为一个时钟节拍,更坏的情况下可能更长。2)设计、选择延时函数要考虑延时精度以及 CPU 利用率、系统实时行性的影响。3)介绍了五种常用的延时策略,没有一种延时策略是百分百准确并且完全没有副作用的。在选择延时策略时,必须根据实际的延时精度,选择尽可能对系统影响小(减小CPU空转与负载、减小因使用临界区导致的影响等)的一种策略。4)无论那种延时策略最终都会受到更高优先级的任务,中断的影响,造成最终的延时不够准确。原创 2022-12-14 21:31:00 · 679 阅读 · 0 评论 -
RTOS 时间管理篇-认识 RTOS 中时间相关的概念
1)本节主要介绍 RTOS 中对时间管理的一些需求,以及 ESP-IDF 中提供哪些与时间管理相关的组件。2)回顾了系统时钟节拍 System Tick的概念和配置、以及对系统延时、定时、系统负载的影响。3)介绍了 esp_timer 与RTOS 提供的软定时器 xTimer 的区别。本节涉及的概念颇多,读者只需要充分理解示例即可,不必深入地理解所有内容,写这些是希望朋友们可以有一个大致的认识,大家可以在学习后面的章节后再回顾本节内容。原创 2022-12-13 22:06:53 · 356 阅读 · 0 评论 -
RTOS 中断篇-总结
中断实际是裸机编程的范畴,设备通过中断进入不同的处理程序,RTOS 是 SysTick 中段驱动的大型软件。1)中断与任务是设备中调用资源,执行开发人员指定功能的主要载体,读者可以结合本章的基础知识,研究学习更多关于中断与任务的用法。2)中断嵌套、中断之间的共享资源访问,仍旧遵循”短时间内独占共享资源“的基本思想。原创 2022-12-11 22:01:54 · 492 阅读 · 0 评论 -
RTOS 中断篇-通过资源守护保护共享资源
1)通过资源拥有者机制可以解决中断与中断、中断与任务之间共享资源竞争访问的问题。2)资源拥有者机制的优点是可以减小关闭中断(包括临界区、关闭指定中断)的时间,改善系统对中断的响应能力,缺点是可能造成中断响应的延时、较大的资源开销。3)在使用资源拥有者机制时应考虑是否造成中断响应的遗漏或者延时对系统功能的影响。原创 2022-12-11 16:23:30 · 147 阅读 · 0 评论 -
RTOS 中断篇-使用关中断保护共享资源
1)ESP32 是双核系统,可以通过关闭当前核心的中断、关闭参与访问共享资源的指定中断来保护共享资源。2)与临界区、关指定核心的中断相比,关闭指定中断的方法影响最小,仅影响关闭中断的响应。原创 2022-12-10 18:44:10 · 233 阅读 · 0 评论 -
RTOS 中断篇-优化共享资源保护中的临界区使用
1)临界区是通过关中断实现的,因此临界区内的代码越长,设备上的中断被延迟响应的时间就越长。2)在编写临界区内的代码时,对代码的要求是尽可能的简短。但是,有些低优先级中断或者任务访问共享资源的时间可能很长,为了减小这种情况下对系统实时性的影响,可以将耗时的操作提取出来,或者通过多次开关临界区减小其影响。原创 2022-12-10 18:23:19 · 205 阅读 · 0 评论 -
RTOS 中断篇-使用临界区保护共享资源
可以在任务、中断 ISR 中使用临界区。中断版本的进入临界区的 API 只能优先级低于的中断才能使用,(高于优先级的中断,根本没必要使用它,因为它的优先级高,它不会被低于优先级的中断打断的)。此外,IDF 中还可以使用类似()()()()()()()()()()1)临界区可以使用于 任务与任务、任务与中断、中断与中断的共享资源保护2)临界区可以有多种实现方式,通常使用关闭全局中断的方式来实现,ESP-IDF 中对临界区的实现是关闭不大于中断的所有中断(包括 SysTick 中断)。原创 2022-12-10 17:54:06 · 339 阅读 · 0 评论 -
RTOS 中断篇-中断与任务共享资源冲突示例
在前述 Task 之间资源共享示例 章节中我们已经学习了共享资源的概念,以及共享资源面临的正确性、完整性的威胁。当引入中断后,中断与中断之间、中断与任务之间同样存在共享资源的访问使用竞争的问题。如前所述,中断相比于任务拥有绝对的优先权,因此中断可以看作非常高优先级的任务,并且中断之间也有优先级。高优先级中断和低优先级中断发生共享资源竞争的现象和中断与任务发生共享资源竞争的现象非常相似,因为低优先级的一方总是被抢走 CPU 的使用权(高优先级中断>低优先级中断>高优先级任务>低优先级任务)。原创 2022-12-07 21:14:26 · 322 阅读 · 0 评论 -
RTOS 中断篇-中断与任务同步与数据传递
在 RTOS 提供的 API 中有很多后缀带 ISR 的API,比如:这些函数是用来干嘛的呢?这些函数用来实现中断与任务的通信。1)中断与任务的通信要依赖 RTOS 提供的一些 API 来实现,前述讲解的信号量、事件组、队列、环形队列等通信组件,都可以实现中断上半程和下半程的通信。2)中断版本的消息发送函数通常是以 ISR 结尾的函数。3)中断与中断、中断与任务之间的通信要考虑是否涉及采集数据、数据的实时性、对其他中断的影响、是否会出现数据丢失问题进行分析。原创 2022-12-07 21:11:23 · 356 阅读 · 0 评论 -
RTOS 中断篇-初识中断
想要让设备能够快速的反应和简单的编程吗? 使用中断是一个好的想法。1)中断是设备自身的功能,设备通过中断实现处理突发事件、感知外界正在发生的事情的能力。2)中断发生的时候,会打断当前正常执行的函数,通过现场保护暂存系统状态,然后执行中断服务函数ISR,最后**恢复现场**,重新继续之前打断的程序。6)RTOS 中提供的了开关中断、配置中段的功能。7)大部分中断的处理是两个部分完成的:即中断上半部分在 ISR 中完成,下半部分由任务完成接收 ISR 的信号或者数据,然后处理信号和使用数据。原创 2022-12-04 17:55:00 · 401 阅读 · 0 评论 -
RTOS共享资源保护-任务间共享资源保护总结及再议死锁
1)本章讲述了适用于任务与任务的共享资源的保护方法,通过加锁-去锁机制、请求-执行机制可以实现多种共享资源的保护方法。2)保证共享资源的核心是分时独占,不同的方法包括临界区、关调度、信号量、事件组、队列、互斥信号量、递归互斥信号量、守护任务等,这些方法适用场景、是否支持嵌套、使用后的影响都不一样,读者要了解它们的特性,选择最合适的方法。3)一些 ESP32 是双核系统,具备不同于单核系统的系统特性,在开发中,要注意章节中提到的双核系统的不同。4)死锁(Deadlock)发生的场景主要是环路等待。原创 2022-12-01 11:22:27 · 468 阅读 · 0 评论 -
RTOS共享资源保护-通过守护任务实现共享资源保护
1)守护任务(Gatekeeper、daemon task)是守护共享资源访问的专用任务,该任务拥有相关共享资源的唯一访问权限。其他任务想要访问对应的共享资源,必须向守护任务发起申请,才能间接使用共享资源。2)不同与前述使用临界区、调度锁、信号量、队列等组件实现加速-去锁机制,守护任务使用独占机制,或者是是一种请求-执行机制。3)守护任务的优先级要视共享资源是否要及时处理来安排。原创 2022-11-30 19:28:12 · 279 阅读 · 0 评论 -
RTOS共享资源保护-递归互斥信号量实现共享资源的保护
1)递归互斥信号量是互斥信号量的改进版本,它向互斥信号量一样支持优先级继承、并且不允许在中断中使用,在此基础上增加了可以嵌套使用的特性。2)递归互斥信号量通过在互斥信号量的基础上增加了一个字段C来记录被嵌套使用的次数,以此实现可以嵌套使用的特性。原创 2022-11-30 11:14:14 · 100 阅读 · 0 评论 -
RTOS共享资源保护-互斥量实现共享资源的保护
1)互斥信号量 mux 是二值信号量的改造,其通过优先级继承机制,可以降低优先级反转问题的影响。2)互斥信号量并不能完全消除优先级反转,只能尽可能地降低优先级反转带来的影响(具体来说是使得高优先级任务被延迟执行的时间缩短些)。在程序设计之初,应尽可能地避免优先级反转的发生。3)互斥信号量只能用于任务-任务之间的共享资源的保护,不可以用于中断相关的代码中。4)除互斥信号量外,还有其他方法降低或者避免优先级反转的问题,敬请期待。原创 2022-11-27 18:43:14 · 249 阅读 · 0 评论 -
RTOS共享资源保护-优先级反转与解决策略
1)使用类似二值信号量的通信组件保护共享资源时,虽然共享资源得到了访问保护,但同时带来了出现优先级反转的隐患。2)优先级反转对外的表现通常为高优先级任务(任务3)、低优先级任务(任务1)长期得不到执行,中优先级任务(任务2)长期得到执行。3)优先级反转的本质原因为共享资源的被请求后的独占性导致。4)解决优先级反转问题可以通过使用互斥信号量 mux、使用 gatekeeper 守护任务、优先级极限(priority ceilings)等策略进行改善。原创 2022-11-27 16:54:01 · 220 阅读 · 0 评论 -
RTOS共享资源保护-通过信号量实现共享资源的保护
1)使用二值信号量的等待-通知机制(pend-post机制),来实现共享资源的保护的方法,相比关中断、关调度的方法更加轻量级,对系统的实时行影响最小。2)其他通信组件如计数信号量,queue、EventGroup同样可以实现对共享资源的保护。3)二值信号量对任务调度有较小的影响,但由于通过二值信号量实现资源保护的共享资源具备不区分优先级的独占性,可能导致系统出现优先级反转问题。原创 2022-11-27 15:19:14 · 199 阅读 · 0 评论 -
RTOS共享资源保护-关调度实现共享资源的保护
1)当共享资源比较复杂或者操作的数据规模很大时,关调度可以防止其他任务对共享资源的竞争。2)ESP32 是双核系统,关调度时,需考虑使用共享资源的几个任务是否在同一个核心上。3)关调度,是关闭了 SysTick 中断响应中执行任务切换的代码,中断,包括 SysTick 中断在内,都仍旧可以正常响应。4)关调度相比关中断保留了中断的响应,因此对系统实时性的影响相对较小。原创 2022-11-26 22:07:26 · 169 阅读 · 0 评论