当前位置: 首页 > article >正文

FreeRTOS开发和裸机开发的区别

目录1.裸机程序设计模式1.1 轮询模式示例代码如下1.2 前后台示例程序如下在这个场景里给同事回复信息非常及时1.3 定时器驱动示例代码如下1.4 基于状态机可以使用状态机来解决这个缺点示例代码如下关键在于这 2 个函数的内部实现使用状态机每次只执行一个状态的代码减少每次执行的时间代码如下2.FreeRTOS系统2.1 多任务系统2.2 互斥操作2.3 同步操作1.裸机程序设计模式裸机程序的设计模式可以分为轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题假设有 A、B 两个都很耗时的函数无法降低它们相互之间的影响。第 4 种方法可以解决这个问题但是实践起来有难度假设一位职场妈妈需要同时解决 2 个问题给小孩喂饭、回复工作信息场景如图所示后面将会演示各类模式下如何写程序1.1 轮询模式示例代码如下在 main 函数中是一个 while 循环里面依次调用 2 个函数这两个函数相互之间有影响如果“喂一口饭”太花时间就会导致迟迟无法“回一个信息”如果“回一个信息”太花时间就会导致迟迟无法“喂下一口饭”使用轮询模式编写程序看起来很简单但是要求 while 循环里调用到的函数要执行得非常快在复杂场景里反而增加了编程难度1.2 前后台所谓“前后台”就是使用中断程序。假设收到同事发来的信息时电脑会发出“滴”的一声这时候妈妈才需要去回复信息示例程序如下main 函数里 while 循环里的代码是后台程序平时都是 while 循环在运行当同事发来信息电脑发出“滴”的一声触发了中断。妈妈暂停喂饭去执行“滴_中断”给同事回复信息在这个场景里给同事回复信息非常及时即使正在喂饭也会暂停下来去回复信息。“喂一口饭”无法影响到“回一个信息”。但是如果“回一个信息”太花时间就会导致 “喂一口饭”迟迟无法执行。继续改进假设小孩吞下饭菜后会发出“啊”的一声妈妈听到后才会喂下一口饭。喂饭、回复信息都是使用中断函数来处理。示例程序如下main 函数中的 while 循环是空的程序的运行靠中断来驱使。如果电脑声音“滴”、小孩声音“啊”不会同时、相近发出那么“回一个信息”、“喂一口饭”相互之间没有影响。在不能满足这个前提的情况下比如“滴”、“啊”同时响起先“回一个信息”时就会耽误“喂一口饭”这种场景下程序遭遇到了轮询模式的缺点函数相互之间有影响1.3 定时器驱动定时器驱动模式是前后台模式的一种可以按照不用的频率执行各种函数。比如需要每 2 分钟给小孩喂一口饭需要每 5 分钟给同事回复信息。那么就可以启动一个定时器让它每 1 分钟产生一次中断让中断函数在合适的时间调用对应函数。示例代码如下main 函数中的 while 循环是空的程序的运行靠定时器中断来驱使。 ◆ 定时器中断每 1 分钟发生一次在中断函数里让 cnt 变量累加代码第 14 行第 15 行进行求模运算如果对 2 取模为 0就“喂一口饭”。这相当于每发生 2 次中断就“喂一口饭”第 19 行进行求模运算如果对 5 取模为 0就“回一个信息”。这相当于每发生 5 次中断就“回一个信息”。这种模式适合调用周期性的函数并且每一个函数执行的时间不能超过一个定时器周期。如果“喂一口饭”很花时间比如长达 10 分钟那么就会耽误“回一个信息”反过来也是一样的如果“回一个信息”很花时间也会影响到“喂一口饭”这种场景下程序遭遇到了轮询模式的缺点函数相互之间有影响1.4 基于状态机当“喂一口饭”、“回一个信息”都需要花很长的时间无论使用前面的哪种设计模式都会退化到轮询模式的缺点函数相互之间有影响。可以使用状态机来解决这个缺点示例代码如下在 main 函数里还是使用轮询模式依次调用 2 个函数关键在于这 2 个函数的内部实现使用状态机每次只执行一个状态的代码减少每次执行的时间代码如下以“喂一口饭”为例函数内部拆分为 4 个状态舀饭、喂饭、舀菜、喂菜。每次执行“喂一口饭”函数时都只会执行其中的某一状态对应的代码。以前执行一次“喂一口饭”函数可能需要 4 秒钟现在可能只需要 1 秒钟就降低了对后面“回一个信息”的影响同样的“回一个信息”函数内部也被拆分为 3 个状态查看信息、打字、发送。每次执行这个函数时都只是执行其中一小部分代码降低了对“喂一口饭”的影响使用状态机模式可以解决裸机程序的难题假设有 A、B 两个都很耗时的函数怎样降低它们相互之间的影响。但是很多场景里函数 A、B 并不容易拆分为多个状态并且这些状态执行的时间并不好控制。所以这并不是最优的解决方法需要使用多任务系统2.FreeRTOS系统2.1 多任务系统对于裸机程序无论使用哪种模式进行精心的设计在最差的情况下都无法解决这个问题假设有 A、B 两个都很耗时的函数无法降低它们相互之间的影响。使用状态机模式时如果函数拆分得不好也会导致这个问题。本质原因是函数是轮流执行的。假设“喂一口饭”需要 t1~t5 这 5 段时间“回一个信息需要”ta~te 这 5 段时间轮流执行时先执行完 t1~t5再执行 ta~te如下图所示对于职场妈妈她怎么解决这个问题呢她是一个眼明手快的人可以一心多用她这样做左手拿勺子给小孩喂饭右手敲键盘回复同事两不耽误小孩“以为”妈妈在专心喂饭同事“以为”她在专心聊天但是脑子只有一个啊虽然说“一心多用”但是谁能同时思考两件事只是她反应快上一秒钟在考虑夹哪个菜给小孩下一秒钟考虑给同事回复什么信息本质是交叉执行t1~t5 和 ta~te 交叉执行如下图所示基于多任务系统编写程序时示例代码如下第 21、22 行创建 2 个任务第 25 行启动调度器基于多任务系统编写程序时反而更简单了1) 上面第 2~8 行是“喂饭任务”的代码2) 第 10~16 行是“回信息任务”的代码编写它们时甚至都不需要考虑它和其他函数的相互影响。就好像有 2 个单板一个只运行“喂饭任务”这个函数、另一个只运行“回信息任务”这个函数。多任务系统会依次给这些任务分配时间你执行一会我执行一会如此循环。只要切换的间隔足够短用户会“感觉这些任务在同时运行”。如下图所示2.2 互斥操作多任务系统中多个任务可能会“同时”访问某些资源需要增加保护措施以防止混乱。比如任务 A、B 都要使用串口能否使用一个全局变量让它们独占地、互斥地使用串口示例代码如下程序的意图是task_A 打印“0123456789”task_B 打印“abcdefghij”。在 task_A 或task_B 打印的过程中另一个任务不能打印以避免数字、字母混杂在一起比如避免打印这样的字符“012abc”第 6 行使用全局变量 g_canuse 实现互斥打印它等于 1 时表示“可以打印”。在进行实际打印之前先把 g_canuse 设置为 0目的是防止别的任务也来打印这个程序大部分时间是没问题的但是只要它运行的时间足够长就会出现数字、字母混杂的情况。下图把 uart_print 函数标记为①~④个步骤如果 task_A 执行完①进入 if 语句里面执行②之前被切换为 task_B在这一瞬间g_canuse 还是 1task_B 执行①时也会成功进入 if 语句假设它执行到③在 printf 打印完部分字符比如“abc”后又再次被切换为 task_Atask_A 继续从上次被暂停的地方继续执行即从②那里继续执行成功打印出“0123456789”。这时在串口上可以看到打印的结果为“abc0123456789”是不是“①判断”、“②清零”间隔太远了uart_print 函数改进成如下的代码呢即使改进为上述代码仍然可能产生两个任务同时使用串口的情况。因为“①减一”这个操作会分为 3 个步骤a.从内存读取变量的值放入寄存器里b.修改寄存器的值让它减一c.把寄存器的值写到内存上的变量上去如果task_A执行完步骤a、b还没来得及把新值写到内存的变量里就被切换为task_B在这一瞬间g_canuse 还是 1task_B 执行①②时也会成功进入 if 语句假设它执行到③在 printf 打印完部分字符比如“abc”后又再次被切换为 task_Atask_A 继续从上次被暂停的地方继续执行即从步骤 c 那里继续执行成功打印出“0123456789”。这时在串口上可以看到打印的结果为“abc0123456789”。 从上面的例子可以看到基于多任务系统编写程序时访问公用的资源的时候要考虑“互斥操作”。任何一种多任务系统都会提供相应的函数2.3 同步操作如果任务之间有依赖关系比如任务 A 执行了某个操作之后需要任务 B 进行后续的处理。如果代码如下编写的话任务 B 大部分时间做的都是无用功上述代码中在任务 A 没有设置 flag 为 1 之前任务 B 的代码都只是去判断 flag。而任务 A、B 的函数是依次轮流运行的假设系统运行了 100 秒其中任务 A 总共运行了 50秒任务 B 总共运行了 50 秒任务 A 在努力处理复杂的运算任务 B 仅仅是浪费 CPU 资源如果可以让任务 B 阻塞即让任务 B 不参与调度那么任务 A 就可以独占 CPU 资源加快处理复杂的事情。当任务 A 处理完事情后再唤醒任务 B。示例代码如下第 15 行任务 B 运行时等待信号量不成功时就会阻塞不在参与任务调度第 7 行任务 A 处理完复杂的事情后释放信号量会唤醒任务 B第 16 行任务 B 被唤醒后从这里继续运行。 在这个过程中任务 A 处理复杂事情的时候可以独占 CPU 资源加快处理速度

相关文章:

FreeRTOS开发和裸机开发的区别

目录 1.裸机程序设计模式 1.1 轮询模式 示例代码如下: 1.2 前后台 示例程序如下: 在这个场景里,给同事回复信息非常及时: 1.3 定时器驱动 示例代码如下: 1.4 基于状态机 可以使用状态机来解决这个缺点&#…...

C#程序语言学习20260312

抽象类:就像“动物”这个概念你见过纯纯的“动物”吗?没有。你见到的都是具体的“狗”、“猫”、“鸟”。 “动物”就是一个抽象的概念,它定义了一些所有动物都应该有的东西(比如“会动”、“会叫”),但具体…...

蓝桥杯算法精讲:贪心算法的简单应用与题解

目录前言一、贪心算法1.1 简单贪心1.1.1 货舱选址1.1.2 最大子段和1.1.3 纪念品分组1.1.4 排座椅1.1.5 矩阵消除游戏结语🎬 云泽Q:个人主页🔥 专栏传送入口: 《C语言》《数据结构》《C》《Linux》《蓝桥杯系列》⛺️遇见安然遇见你&#xff0…...

简单易用:DDColor黑白照片修复,ComfyUI可视化操作,无需专业修图技能

简单易用:DDColor黑白照片修复,ComfyUI可视化操作,无需专业修图技能 你是否曾翻出一张泛黄的黑白老照片,看着祖辈模糊的笑容或童年模糊的街景,希望它们能重焕光彩?过去,这需要专业的修图技能和…...

LiuJuan20260223Zimage构建内网知识库:安全环境下的智能问答应用

LiuJuan20260223Zimage构建内网知识库:安全环境下的智能问答应用 1. 引言:当智能问答遇上数据安全 想象一下,你在一家金融机构或政府部门工作,每天需要从堆积如山的内部政策文件、研究报告或历史档案里查找信息。传统的搜索工具…...

黄仁勋联手OpenAI前高管,1吉瓦超级算力明年开闸

1吉瓦,数百亿美金。 刚刚,前OpenAI高管、硅谷传奇女性创业者Mira Murati和她的初创公司,与四万亿芯片帝国掌舵人黄仁勋达成了一项「吉瓦级」的长期战略合作! 英伟达CEO黄仁勋(左)与Thinking Machines Lab创…...

方法区、永久代、元空间:一文理清 JVM 内存区域核心演进

JVM内存模型是Java进阶的核心知识点,而方法区(及其实现:永久代、元空间)更是面试和生产环境调优的高频考点。很多开发者容易混淆“方法区(规范)”与“永久代/元空间(实现)”的关系&a…...

C语言中的分支语句

食用指南:本篇文章介绍了c语言中的if、switch分支语句,偏基础向,可用于复习或者初学者自学。--欢迎各位交流--C语言的结构可分为:顺序结构、选择结构、循环结构。我们可以使用if、switch语句来实现分支结构(也就是所谓…...

『NAS』金三银四,在NAS部署AI简历神器-JadeAI

点赞 关注 收藏 学会了 💡整理了一个 NAS 专属玩法专栏,感兴趣的工友可以戳这里关注 👉 《NAS邪修》 用一段话简单介绍一下 JadeAI 本次教程以飞牛 NAS 为例部署 JadeAI ,其他品牌 NAS 的操作步骤基本一致,放心跟着…...

STM32CubeMx 配置三相互补PWM + 死区时间计算

在使用STM32作为控制器去开发电机FOC的时候,往往需要配置三相互补PWM的死区时间,如何快速确认死区时间的范围和配置呢? (1)死区的概念: 在STM32中死区时间是由 CKD[1:0] 和 DTG[7:0] 这两个寄存器共同决定,CKD其实就是…...

深入解析密钥协商机制:从RSA到SM2的实战应用

1. 密钥协商:为什么你的聊天记录别人看不懂? 你有没有想过,当你在网上购物、和朋友聊天、或者登录邮箱时,那些在网络上跑来跑去的数据包,为什么不怕被别人“偷看”呢?比如,你输入的银行卡密码&a…...

OpenBMC sdbusplus接口实战:从服务注册到多接口管理

1. 初识sdbusplus:你的BMC服务开发起点 如果你正在为OpenBMC开发一个新的管理功能,比如监控机箱温度、控制风扇转速,或者实现一个自定义的硬件健康检查服务,那么你迟早要和D-Bus打交道。在OpenBMC的世界里,sdbusplus就…...

【交互式分割】从零到一:基于Mask Guidance的迭代训练实战与性能优化

1. 为什么我们需要Mask Guidance?从交互式分割的痛点说起 想象一下,你正在用Photoshop抠图,面对一张毛发边缘复杂的小猫照片,你用魔棒工具点一下,结果要么选多了背景,要么漏掉了毛发尖。你不得不反复调整容…...

深入解析ACK、NACK与REX:网络通信中的重传机制与优化策略

1. 从“收到请回复”说起:网络世界的确认与重传 不知道你有没有玩过那种需要“收到请回复”的群聊。你发出一条重要通知,如果没人吭声,你心里就会打鼓:他们到底看没看到?这时候,你可能会所有人,…...

阿里云ECS实战:Ollama云端部署与跨网络本地调用全解析

1. 为什么要把Ollama放到云端?聊聊我的真实想法 你可能和我一样,最开始接触大模型都是在自己的电脑上跑。装个Ollama,拉个几B的小模型,玩玩对话,感觉挺酷。但很快,问题就来了:我的MacBook Pro风…...

Windows下利用Docker容器化技术实现多EasyConnect实例共存

1. 为什么我们需要在Windows上运行多个EasyConnect? 如果你和我一样,是个经常需要穿梭在不同项目、不同办公环境之间的打工人,那你肯定对EasyConnect这个软件又爱又恨。爱它,是因为它确实是我们连接公司内网、访问内部资源的“通行…...

从被动防御到主动免疫:IPDRR模型如何重塑企业网络安全韧性

1. 从“筑高墙”到“强免疫”:为什么你的企业安全需要一次思维升级 我见过太多企业,在安全建设上投入不菲,买最好的防火墙、最贵的入侵检测系统,安全策略文档堆起来能有一人高。但真出了事,比如一次勒索病毒攻击&#…...

HanLP 2.x 多任务模型实战:从安装到文本分析全流程

1. 为什么你需要HanLP 2.x的多任务模型? 如果你正在处理中文文本,比如想从一堆新闻里自动提取关键信息,或者给你的聊天机器人加上理解用户意图的能力,那你很可能需要一套好用的自然语言处理(NLP)工具。几年…...

LingJing(灵境)与外部虚拟机的网络穿透实战:从NAT困境到桥接畅通

1. 为什么你的反向Shell总是“失联”?从NAT困境说起 如果你和我一样,是个喜欢在本地搭建渗透测试环境的爱好者,那你肯定遇到过这个让人抓狂的场景:在LingJing(灵境)靶场里,靶机明明启动了&#…...

BEYOND REALITY Z-Image作品分享:自然光人像系列——晨光/正午/黄昏三种氛围呈现

BEYOND REALITY Z-Image作品分享:自然光人像系列——晨光/正午/黄昏三种氛围呈现 1. 引言:当光影遇见AI人像 你有没有想过,一张AI生成的人像照片,能有多真实? 不是那种一眼就能看出来的“AI感”,而是光影…...

告别“发光纸片人”:Substance 3D 与 Unity 2D URP 联动的次世代 2D 动态光照与法线手绘工作流

上周某日下午,一位担任核心技术美术的朋友,在微信上给我发了一段他们最新类银河恶魔城游戏的内部测试视频,并附带了一长串抓狂的语音。他们团队耗巨资请了顶级的二次元原画师,为游戏主角绘制了极其精美的立绘和 Spine 切片。可是&…...

人工智能混合编程实践:C++调用封装好的DLL进行PP-OCR字符识别

人工智能混合编程实践:C++调用封装好的DLL进行PP-OCR字符识别 前言 相关介绍 C++简介 ONNX简介 ONNX Runtime 简介 **核心特点** DLL 简介 **核心特点** **创建与使用** **应用场景** **优点与挑战** OCR字符识别简介 1. 核心工作原理 2. 技术演进 3. 主要应用场景 4. 当前面临…...

互联网大数据环境下 MySQL 迁移至国产底座的技术实践与路径观察

互联网大数据环境下 MySQL 迁移至国产底座的技术实践与路径观察 在当前互联网大数据应用持续深化的背景下,企业对关系型数据库的性能稳定性、安全合规性及运维可控性提出了更高要求。随着技术体系日趋成熟,金仓数据库(KingbaseES&#xff09…...

YOLOv8全网首发:CVPR2026 Transformer注意力 | BinaryAttention 1-bit注意力,推理提速100%,超越FlashAttention2

💡💡💡问题点:Transformer 已取得广泛而显著的成功,但其注意力模块的计算复杂性仍然是视觉任务的主要瓶颈。现有方法主要采用 8-bit 或 4-bit 量化来平衡效率与精度 💡💡💡措施:我们通过理论论证指出,注意力的二值化保留了基本的相似性关系,并提出了 BinaryAt…...

论文查重 / AI 率双杀攻略:Paperxie 四大降重方案实测,从 99.8% 到 14.9% 的通关密码

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippthttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 前言:毕业季新噩梦 ——AI 率超标,比查重更让人崩溃的学术红线 当毕业论文终于写完&#xff…...

Highcharts React v4.2.1 正式发布:更自然的React开发体验,更清晰的数据处理

Highcharts React v4.2.1 版本正式发布了!这次更新不仅带来了错误修复和新功能,更重要的是对组件文档进行了全面重写。这体现了我们持续的努力——让使用 Highcharts 的 React 开发者能够获得更加自然、顺畅的开发体验。如果你一直在等待尝试新的集成&am…...

OpenClaw 生成测试用例

在安装完 OpenClaw 后,很多同学只会用它聊天。今天十二就带大家通过安装 Skill,让 OpenClaw 真正变成一个能理解业务、自动写用例的测试专家。 1、查找:测试用例生成Skills 全网 Skill 太多,不知道哪个生成的用例最靠谱。这里使用十二之前安装好的 find-skills 查找测试用…...

计算机毕业设计springboot数字化心理健康服务系统的设计与实现 基于SpringBoot的“树洞“心理咨询服务平台的设计与实现 基于SpringBoot的在线心理支持与智慧辅导平台

计算机毕业设计springboot数字化心理健康服务系统的设计与实现a2huw9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。近年来,心理健康问题呈直线上升趋势&#xff0c…...

DO-254通读--10.0 硬件设计生命周期数据

10.0 硬件设计生命周期数据 本节描述了在硬件设计生命周期中可能产生的硬件设计生命周期数据项,用于提供设计保证和符合审定要求的证据。审定机构作为设计保证证据所需的生命周期数据的范围、数量和详细程度将因多种因素而异。这些因素包括适用的航空系统审定机构要…...

蓝牙学习系列(一):从零认识蓝牙技术体系

目录 一、什么是蓝牙(Bluetooth) 二、蓝牙的发展版本 三、Classic Bluetooth 与 BLE 3.1 Classic Bluetooth(经典蓝牙) 3.2 BLE(Bluetooth Low Energy) 四、蓝牙设备角色 4.1 Classic Bluetooth 4.…...