FreeRTOS的并行与并发思考

FreeRTOS的任务触发是由滴答时钟触发SysTick中断来触发调度器执行或阻塞或挂起和切换任务的。

首先是任务的并发能力,FreeRTOS的任务执行是基于全抢占调度机制,任务优先级按在就绪列表中由高到低排布,系统首先执行最高优先级任务,如果最高优先级在while(1)中,最高优先级任务将永远执行。要想分配CPU资源给其他任务,可以用 vTaskDelay 来暂时将高优先级任务挂起。此时下一个高优先级任务就会抢占CPU资源,开始执行任务,delay时间过后,高优先级重新抢占CPU,恢复执行。

全抢占调度机制比较适用于实时控制,对响应时间要求严格,因为延迟可能导致系统性能下降或安全问题。比如说智能车,电机控制方面,优先级肯定是最高的,但是像camera的数据采集就可以在电机控制之下,智能车在运行的时候,camera采集数据不需要极其的频繁,再往下比如LCD图像显示,就更不需要那么频繁的显示,即便有延迟,对系统安全也不会产生多大的影响。这种设置可以确保电机控制任务的实时性和响应性,同时允许相机数据采集和LCD图像显示任务在不影响关键功能的情况下进行适当的延迟。

接下来是任务的并行能力,时间片轮转调度机制是任务的并行机制,也就是当多个任务处于同一优先级时,CPU通过划分时间片,每个时间片执行任务,任务没有执行完,就将数据或寄存器配置等暂存到CPU的堆栈上,等待其他任务全部执行完对应的时间片,再次恢复到任务被执行的点。
时间片轮转调度机制其实最好的应用法是对于某些任务,需要等待某个事件,或者需要等待什么资源的时候,为了不白白空等,就先去执行其他的任务,等到其他任务执行完了,我这个任务也等到了想要的资源。

比如camera的数据采集和数据处理与分析,可以在同一个优先级,也就是数据该采集采集,等camera数据采集完了我就执行数据分析,之后camera依旧在不同的时间片进行数据采集,采集完的数据在不同的时间片进行分析。(但是这也要注意一些问题,如果数据采集任务在一个时间片内没有完成数据的采集,而数据处理与分析任务在下一个时间片内开始执行,可能会导致数据丢失。因为数据采集任务没有机会在连续的时间片内完成采集,而数据处理与分析任务已经开始处理下一次采集的数据。以及如果数据处理与分析任务占用的执行时间较长,可能会导致相机数据采集任务无法及时响应。这可能会导致数据采集的延迟增加,影响实时性能。此时可能用高低优先级全抢占调度机制实现camera的数据采集和数据处理与分析更稳一点)

时间片轮转调度机制一般用于没有紧急的实时需求情况下,比如智能车需要通过多个传感器(如相机、雷达、激光等)获取环境信息,并进行实时的感知和决策。这几个任务完全可以利用时间片轮转调度机制获取信息吗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212164.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XUbuntu22.04之解决gpg keyserver receive failed no data(一百九十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

STM32CubeIDE 创建 / 导入 .c / .h 文件

目录 CubeMX创建工程 项目管理 将CubeMX创建的工程导入到CubeIDE 创建用于演示的ADD.c文件和ADD.h文件 方式一:在IDE的项目浏览器内创建 方式二:在文件窗口处创建 / 从其他地方复制粘贴过来 将ADD.h添加到头文件搜索路径 将ADD.c添加到源文件搜索…

电脑找不到xinput1_3.dll怎么修复,快速处理dll问题的5个方法分享

在使用电脑的过程中,我们常常会遇到一些常见的问题,其中之一就是“电脑缺少xinput1_3.dll”。这个问题可能会影响到我们对电脑的使用体验,甚至导致某些软件无法正常运行。在我遇到这个问题并解决之后,我深刻地体会到了解决问题的重…

redis运维(十七)事务

一 redis事务 事务核心参考 ① 基础概念 1、场景引入核心:通过现象思考原因? 2、事务的概念 3、事务四大特性说明: redis只具备部分特性 重点1: 原子性和一致性 重点2: 隔离性和持久性 ② redis的事务 1、基础铺垫备注&…

王道p150 20.将给定的表达式树转化为等价的中缀表达式(通过括号反应操作符的计算次序)

本题代码如下 void btreetoexp(tree t, char deep) {if (t NULL)return;else if (t->lchild NULL && t->rchild NULL)printf("%c", t->data);//输出操作数,不加括号else {if (deep > 1)printf("(");btreetoexp(t->l…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 🫧 前言🫧 查看虚表🫧 单继承下的虚函数表🫧 多继承下的虚函数表 🫧 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议EGP这个类别,用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于…

qml ParticleSystem3D使用介绍

在 Qt Quick 3D 中,ParticleSystem3D 是用来创建和控制3D粒子系统的元素。粒子系统是图形编程中用于模拟液体、烟雾、火、星空等现象的技术,它通过生成大量小粒子来模拟这些效果。ParticleSystem3D 提供了一个框架,允许开发者定义粒子的各种属性,如生命周期、速度、颜色、大…

连接的原理(待修改)

搞数据库⼀个避不开的概念就是Join,翻译成中⽂就是连接。 相信很多⼩伙伴在初学连接的时候有些⼀脸懵逼,理解了连接的语义之后⼜可能不明⽩各个表中的记 录到底是怎么连起来的,以⾄于在使⽤的时候常常陷⼊下边两种误区: 误区⼀&…

C++初阶 类和对象(上)

前言:C初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C初阶系列会持续更新,上学期间将不定时更新,但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

Python 十五个炫酷代码

1 炫酷彩虹 视频是动态的,不信你运行试试。 from turtle import *colors ["red", "yellow", "blue", "lime"] bgcolor("black")x 6 t [Turtle(), Turtle()]for index, i in enumerate(t):i.speed(0)i.color(&…

【排序算法】希尔排序(C语言)

【排序算法】—— 希尔排序 目录 一、希尔排序原理1. 插入排序的问题2. 希尔排序的思路 二、希尔排序的相关问题1. 为什么插入排序那么多但效率却很高2. 如何选择希尔增量 三、代码实现1. 代码实现思路2. 实现代码 希尔排序是对直接插入排序的优化,在学习之前&…