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

FreeRTOS 工程化要点:任务划分、优先级设计与 CPU 占用率监控

大家好我是杂烩君。今天我们来简单分享FreeRTOS任务怎么拆、优先级怎么配、CPU 占用怎么看。1. 任务划分原则1.1 单一职责一个任务只干一件事把串口接收 数据解析 指令执行 结果反馈全塞一个任务解析环节一出问题整条链路全挂而且任务执行时间拉长后会阻塞其他高优先级任务。正确做法按照职责拆成各独立任务通过队列串联某一环节异常不影响其他环节。1.2 低耦合与合理粒度任务间数据传递走队列、任务通知、事件组别直接读写全局变量。任务数量上一般中小项目控制在5~8 个比较合理——太少功能挤一起难维护太多上下文切换开销吃不消。划分流程可以按下面这个思路走1.3 轻量化单次执行控制在 10ms 以内看一下内核中空闲任务的主循环tasks.cfor(;configCONTROL_INFINITE_LOOP();){prvCheckTasksWaitingTermination();#if(configUSE_IDLE_HOOK1){vApplicationIdleHook();}#endif/* ... tickless idle, yield 逻辑 ... */}空闲任务只有在所有其他任务都阻塞时才能拿到 CPU。你的任务一跑就是几十毫秒不释放空闲任务跑不了低功耗和看门狗喂狗逻辑都会出问题。耗时操作必须拆子任务或分段执行。2. 优先级设计2.1 核心原则数字越大优先级越高这是非常多人搞反的点。FreeRTOS 中空闲任务优先级为 0是最低的/* FreeRTOS-Kernel/include/task.h */#definetskIDLE_PRIORITY((UBaseType_t)0U)优先级范围是0到configMAX_PRIORITIES - 1数字越大越先执行。分配时核心实时任务给大数字后台任务给小数字。非必要别让多个任务共用同一优先级否则触发时间片轮转增加切换开销。任务类型优先级说明故障报警10必须最快响应传感器采集8实时性要求高数据解析/指令执行6外设通信串口等4显示/按键3日志/自检1仅高于空闲任务3. CPU 占用率监控CPU 占用率是系统健康度的晴雨表建议控制在30%~70%。FreeRTOS 内核原生支持运行时统计configGENERATE_RUN_TIME_STATS每次上下文切换时自动累计每个任务的运行时间精度高、零应用层计算代码直接用就行。3.1 内核原理开启configGENERATE_RUN_TIME_STATS后内核在每次任务切换时执行以下逻辑tasks.c/* FreeRTOS-Kernel/tasks.c — 上下文切换时更新运行时统计 */#if(configGENERATE_RUN_TIME_STATS1){ulTotalRunTime[0]portGET_RUN_TIME_COUNTER_VALUE();if(ulTotalRunTime[0]ulTaskSwitchedInTime[0]){pxCurrentTCB-ulRunTimeCounter(ulTotalRunTime[0]-ulTaskSwitchedInTime[0]);}ulTaskSwitchedInTime[0]ulTotalRunTime[0];}#endif每个 TCB 里有个ulRunTimeCounter字段记录该任务累计占用 CPU 的时间。调用vTaskGetRunTimeStats()时内核遍历所有任务算出每个任务的时间占比格式化成可读字符串直接输出。你只需要做两件事配好 FreeRTOSConfig.h提供一个高精度计数器。3.2 验证代码下面是一个例子用DWT 周期计数器作为运行时统计的时间基准创建了两个不同负载的测试任务 一个监控任务串口输出统计结果。3.2.1 FreeRTOSConfig.h 需要增加的配置在你已有的FreeRTOSConfig.h中加入以下内容/* ---------- 运行时统计相关 ---------- */#defineconfigGENERATE_RUN_TIME_STATS1#defineconfigUSE_TRACE_FACILITY1#defineconfigUSE_STATS_FORMATTING_FUNCTIONS1externvoidvConfigureTimerForRunTimeStats(void);externuint32_tulGetRunTimeCounterValue(void);#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS()vConfigureTimerForRunTimeStats()#defineportGET_RUN_TIME_COUNTER_VALUE()ulGetRunTimeCounterValue()这三个宏缺一不可configGENERATE_RUN_TIME_STATS开启统计功能configUSE_TRACE_FACILITY开启uxTaskGetSystemState()configUSE_STATS_FORMATTING_FUNCTIONS开启vTaskGetRunTimeStats()格式化输出。3.2.2 核心测试代码/*------------------------------------------------------------ * 运行时统计计数器 — DWT CYCCNT (内核自带, 不占任何外设) * * DWT 单元有一个 32 位周期计数器, * 以内核主频计数 (L431 最高 80MHz → 分辨率 12.5ns) * 32 位在 80MHz 下约 53.7 秒溢出, 但内核每次上下文切换 * 都会读取并做差值累加, 任务切换间隔远小于该值, 不影响统计 *------------------------------------------------------------*/voidvConfigureTimerForRunTimeStats(void){CoreDebug-DEMCR|CoreDebug_DEMCR_TRCENA_Msk;DWT-CYCCNT0;DWT-CTRL|DWT_CTRL_CYCCNTENA_Msk;}uint32_tulGetRunTimeCounterValue(void){returnDWT-CYCCNT;}/*------------------------------------------------------------ * 测试任务 *------------------------------------------------------------*//* 重载任务: 忙等 ~5ms 休眠 20ms, 预期占用约 20% CPU */voidTask_Heavy(void*pv){volatileuint32_ti;for(;;){for(i0;i20000;i){}/* 忙等, 模拟计算负载 */vTaskDelay(pdMS_TO_TICKS(20));}}/* 轻载任务: 几乎不占 CPU, 500ms 唤醒一次做极少工作 */voidTask_Light(void*pv){volatileuint32_tcount0;for(;;){count;vTaskDelay(pdMS_TO_TICKS(500));}}/* 监控任务: 每 3 秒输出一次各任务的运行时间统计 */voidTask_Monitor(void*pv){staticcharbuf[400];for(;;){vTaskDelay(pdMS_TO_TICKS(3000));printf(\r\n-------- Run Time Stats --------\r\n);printf(Task Abs Time %%Time\r\n);vTaskGetRunTimeStats(buf);printf(%s,buf);printf(--------------------------------\r\n);}}intmain(void){// ...xTaskCreate(Task_Heavy,Heavy,256,NULL,4,NULL);xTaskCreate(Task_Light,Light,128,NULL,3,NULL);xTaskCreate(Task_Monitor,Monitor,512,NULL,1,NULL);vTaskStartScheduler();for(;;){}}3.2.3 串口输出每 3 秒会看到类似输出Heavy任务忙等约 5ms 休眠 20ms占用约 16%符合预期。IDLE占 83% 说明系统大部分时间空闲。如果你在自己的项目里加上这个监控任务一眼就能看出哪个任务吃 CPU 最多。3.3 异常速查现象常见原因优化方向80%死循环无延时、中断过频、资源竞争激烈拆分耗时任务、降低中断频率20%延时过长、执行频率低缩短延时、充分利用 CPU波动大突发耗时操作、中断源不稳定分段执行、稳定中断源4. 总结FreeRTOS 工程落地就三件事任务划分——单一职责、轻量化、低耦合5~8 个任务为宜别把所有逻辑塞一个任务里也别拆太碎。优先级设计——数字越大优先级越高tskIDLE_PRIORITY 0是最低核心实时任务给高值后台任务给低值共享资源用xSemaphoreCreateMutex()优先级继承内核自动搞定。CPU 占用率监控——开启configGENERATE_RUN_TIME_STATS用 DWT CYCCNT 做时间基准不占外设vTaskGetRunTimeStats()直接输出每个任务的占比30%~70% 是健康区间。

相关文章:

FreeRTOS 工程化要点:任务划分、优先级设计与 CPU 占用率监控

大家好,我是杂烩君。 今天我们来简单分享:FreeRTOS任务怎么拆、优先级怎么配、CPU 占用怎么看。1. 任务划分原则 1.1 单一职责:一个任务只干一件事 把"串口接收 数据解析 指令执行 结果反馈"全塞一个任务,解析环节一…...

网站设计:抓住这3点细节,用户体验感飙升!

网站制作要不要做得那么细呢?实际上,当我们发现很多网站制作得很优秀时,怎么看都不知道是如何做好的,但就是感觉不错,实际上这就体现在了制作网站细节上。很多时候设计网站往往容易忽视这三个细节:1、网页图…...

V821 DISP 显示驱动流程分析

文章目录1、前言2、环境介绍3、大致流程4、程序阅读5、总结1、前言 在全志 V821 下调试 RGB 屏幕时,因为一直创建不出 fb 节点,这里记录一下当时阅读显示驱动框架的过程。仅供参考。 2、环境介绍 sdk:V821 tina sdk v1.3 3、大致流程 初…...

实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连

🚀 实验室服务器远程访问终极方案:SSH 反向隧道 systemd 自动重连适用于: 没有公网 IP 的实验室服务器想用 VSCode / SSH / Jupyter 远程开发希望稳定、自动重连、开机自启🧠 一、问题背景 在很多实验室环境中: GPU 服…...

赋能智能体大脑:在快马平台中集成AI模型实现高级对话能力

在探索AI辅助开发的过程中,我发现智能体的核心能力很大程度上取决于其"大脑"——也就是背后支撑决策的AI模型。最近在InsCode(快马)平台实践了一个很有意思的项目:如何为智能体集成AI模型来实现高级对话功能。整个过程让我深刻体会到&#xff…...

OpenClaw 局域网访问配置文档

OpenClaw 局域网访问配置文档 概述 本文档详细说明了如何配置 OpenClaw 以允许局域网内的其他设备访问,包括所有相关配置参数的作用和说明。 当前配置状态 网关服务信息 服务端口: 18789 绑定模式: lan (局域网访问) 认证方式: password (密码认证) 访问密码: xxxxxx 详细…...

Redis 内存淘汰与过期策略

引言Redis 作为内存数据库,内存资源有限,必须妥善处理内存占用问题。本文梳理两种核心机制:淘汰策略决定内存达到上限时如何移除数据,涵盖 noeviction、LRU、LFU 等多种算法及其实现细节;过期策略(惰性删除…...

高纯水系统如何保障锂电池生产良率?

在锂电池制造过程中,生产用水纯度直接关联产品性能与安全。随着新能源汽车与储能产业快速发展,行业对电池一致性与稳定性的要求持续提升,超纯水已成为核心制程环节的关键辅材。一、锂电池生产用水标准 锂电池生产涉及正负材料制备、浆料调配、…...

[MediaForge] 音频技术深度解析(五):常见问题与快速解决

目录 问题排查方法论 音频采集常见问题 音频重采样常见问题 音频编码常见问题 音频封装常见问题 端到端完整流程问题 快速定位工具集 AI 辅助排查指南 1. 问题排查方法论 1.1 通用排查流程 ┌───────────────────────────────────────…...

突破性分子动力学自由能计算工具:gmx_MMPBSA技术深度解析与实战指南

突破性分子动力学自由能计算工具:gmx_MMPBSA技术深度解析与实战指南 【免费下载链接】gmx_MMPBSA gmx_MMPBSA is a new tool based on AMBERs MMPBSA.py aiming to perform end-state free energy calculations with GROMACS files. 项目地址: https://gitcode.co…...

3分钟掌握绝地求生压枪黑科技:罗技鼠标宏终极指南

3分钟掌握绝地求生压枪黑科技:罗技鼠标宏终极指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中AKM的后坐力而…...

2026海雅达HDT500手持终端PDA“12米远距扫描”应用案例:造纸厂原纸立库高层纸卷条码采集应用

标准工业原纸卷重达2吨、宽幅近2.8米,在12-15米高的原纸仓库中堆垛高达8-10米。高空扫码怎么破? 传统PDA扫码距离仅1米,难道必须冒生命危险爬上纸堆?海雅达HDT500的12米扫描头如何实现“降维打击”? 如何利用海雅达H…...

通过 C# 将 RTF 格式转换为 Word 文档

在 .NET 项目中处理文档格式转换时,RTF 转 Word 是一个常见的需求。RTF(Rich Text Format)作为一种跨平台的文档格式,常被用作中间载体,而最终交付时往往需要转换为更通用的 Word 格式(.doc 或 .docx&#…...

水质溶解氧在线监测仪:实时监测与数据记录解析

水质溶解氧在线监测仪是一款专注于水体溶解氧与水温监测的专业设备,可快速记录水体关键参数,同时支持扩展多种水质参数传感器,能根据不同使用需求灵活组合配置。设备内置存储功能,可留存历史监测数据与报警记录,还支持…...

家用混动SUV舒适度技术科普入门:从实测看核心技术要点

在家用混动SUV的日常使用中,接送孩子上下学、家庭短途出行是最高频的场景,而“舒适度”并非单纯的主观感受,而是一套涵盖空间设计、座椅工程、材质工艺、座舱适配及动力平顺性的综合技术体系。对于有儿童乘坐需求的家庭而言,舒适度…...

ORA-12518:Oracle 监听程序无法分发客户端连接原因及解决方法

本文主要讲解ORA-12518:Oracle监听程序无法分发客户端连接的原因分析及解决方法。问题描述数据中台的同步任务有时会报错如下:ORA-12518, TNS:listener could not hand off client connection。意即Oracle监听程序无法分发客户端连接,原因分析只是有时候…...

判断当前页面是否以「添加到主屏幕」应用形态启动 (快捷方式\APP、套壳包等启动)

这里写自定义目录标题判断当前页面是否以「添加到主屏幕」应用形态启动判断当前页面是否以「添加到主屏幕」应用形态启动 /*** 判断当前页面是否以「添加到主屏幕」应用形态启动* - iOS Safari: navigator.standalone* - 标准 PWA: display-mode 为 standalone/fullscreen/min…...

偏迹(Partial Trace)的定义和数学物理意义

我们将通过多个计算示例来掌握偏迹(Partial Trace)。1. 偏迹的定义1.1 动机在量子力学中,复合系统 的态用密度矩阵 ​ 描述。那么,当我们只关心子系统 时,需要忽略掉其中 的状态,这里通过对子系统 求平…...

定时任务XXL-Job

目录为什么是XXL-Job?SpringBoot 整合XXL-Job1)环境准备2)SpringBoot 项目依赖3)application.yml 配置4)XXL-Job 配置类5)定时任务业务类(核心代码)6)调度中心Web可视化界…...

《C 头文件》

《C 头文件》 引言 C 头文件是 C 语言编程中不可或缺的一部分。它们包含了 C 语言标准库中的各种函数、宏定义和类型定义,为程序员提供了丰富的编程工具。本文将详细介绍 C 头文件的作用、分类、常用头文件及其在编程中的应用。 一、C 头文件的作用 C 头文件的主要作用有以…...

ParquetViewer:Windows平台最友好的Parquet文件查看与查询工具

ParquetViewer:Windows平台最友好的Parquet文件查看与查询工具 【免费下载链接】ParquetViewer Simple Windows desktop application for viewing & querying Apache Parquet files 项目地址: https://gitcode.com/gh_mirrors/pa/ParquetViewer 还在为Wi…...

终极删除命令(强制解锁 + 删文件 + 删目录)

🔥 终极删除命令(强制解锁 删文件 删目录)前言 二、使用步骤 // “E:\Documents\HBuilderProjects\个人简历\tmpim” 是想要删除的文件夹 ① 解锁所有被占用的文件(解决 “正在使用”) cmd taskkill /f /im HBuilde…...

Health Agent开放平台:企业级健康医疗AI Agent基础设施

在人工智能加速渗透各行各业的今天,健康医疗领域正迎来由智能体驱动的深刻变革。面向专业场景的健康医疗AI Agent,正成为企业提升服务效能、优化运营流程、构建差异化竞争力的核心引擎。而集专业性、灵活性与可扩展性于一体的企业级智能体平台&#xff0…...

性能测试专家养成记:工具、思维、实战全解析

在软件质量保障体系中,性能测试正从一个可选的“加分项”演变为关乎用户体验与业务存续的“必答题”。对于广大软件测试从业者而言,成长为一名性能测试专家,不仅意味着技术深度的拓展,更代表着从“验证功能”到“保障体验”乃至“…...

CnOpenData 沪市IPO发行文件-B来源

IPO(Initial Public Offing),即首次公开募股,是指一家企业(发行人)第一次将它的股份向公众出售。资本市场是现代金融体系的核心,是企业最高效的融资渠道和最强大的资本运作平台,IPO作为公司登陆资本市场的唯一路径,将使…...

破局与重塑:大模型浪潮下机器学习工程师的生存指南

十字路口的困惑与机遇当大语言模型(LLM)与生成式AI(GenAI)以前所未有的速度席卷全球,身处技术浪潮中心的机器学习工程师们,正经历着一场深刻的职业震荡。曾经引以为傲的XGBoost、卷积神经网络(C…...

linux下的pwm子系统

概念:PWM的概念就不多说了&#xff0c;pwm子系统如下:设备树:rk3568设备树pwm控制器里面已经配置了时钟&#xff0c;所以只需要使能节点就好了/* 使能 PWM12 节点 配置使用指定的引脚 状态设置为正常工作 */&pwm12 {status "okay";pinctrl-0 <&pwm12m1_…...

政务行业高准确率、可控、符合规范的数据库审计与监测实践方案

一、概要&#xff1a;以高精准风险监测与全链路审计&#xff0c;构筑政务数据安全可控防线在国家数字化治理体系纵深推进的背景下&#xff0c;政务数据已成为驱动政府决策、公共服务与社会管理的关键生产要素。然而&#xff0c;随着政务云、数据共享交换平台的大规模建设&#…...

GRS认证实操干货:TC交易证书全流程解析(源头供应商必看)

一、前言&#xff1a;GRS证书与TC的核心关联&#xff08;新手必懂&#xff09;在再生行业GRS认证体系中&#xff0c;多数源头供应商存在一个核心认知误区&#xff1a;认为拿到GRS范围证书&#xff08;SC&#xff09;就完成了合规闭环&#xff0c;实则不然。GRS证书&#xff08;…...

安全运维体系建设思路

安全运维体系建设思路 注意&#xff1a;后续技术分享&#xff0c;第一时间更新&#xff0c;以及更多更及时的技术资讯和学习技术资料&#xff0c;将在公众号CTO Plus发布&#xff0c;欢迎关注公众号&#xff1a;CTO Plus 关于Articulate“做一个知识和技术的搬运工。做一个终身…...