RT-Thread CPU 使用率统计实战:解决 FINSH 组件导致读数恒为 0 的 3 个关键步骤
RT-Thread CPU使用率统计实战解决FINSH组件导致读数恒为0的深度排查指南1. 问题现象与初步分析最近在调试RT-Thread的CPU使用率统计功能时遇到了一个典型问题调用cpu_usage_get()函数始终返回0值。经过初步排查发现系统没有进入空闲线程rt_thread_idle_entry()而根本原因竟是FINSH控制台组件在空闲时持续等待字符输入。典型症状表现系统运行正常但CPU使用率显示0%使用list_thread命令查看时发现idle线程几乎不运行串口终端交互响应正常但影响统计准确性关键提示当FINSH组件以阻塞方式等待输入时会独占CPU资源导致idle线程无法获得执行权而CPU使用率统计正是依赖idle线程的运行时间计算得出的。2. 根本原因剖析2.1 CPU使用率统计原理RT-Thread通过空闲线程钩子函数实现CPU使用率统计其核心算法如下static void cpu_usage_idle_hook() { // 1. 首先计算CPU全速运行时的基准值total_count if (total_count 0) { rt_enter_critical(); tick rt_tick_get(); while(rt_tick_get() - tick CPU_USAGE_CALC_TICK) { total_count; loop 0; while (loop CPU_USAGE_LOOP) loop; } rt_exit_critical(); } // 2. 在相同时间片内统计实际运行计数count count 0; tick rt_tick_get(); while (rt_tick_get() - tick CPU_USAGE_CALC_TICK) { count; loop 0; while (loop CPU_USAGE_LOOP) loop; } // 3. 计算使用率 (基准值 - 实际值)/基准值 if (count total_count) { count total_count - count; cpu_usage_major (count * 100) / total_count; cpu_usage_minor ((count * 100) % total_count) * 100 / total_count; } }2.2 FINSH组件的影响机制当启用FINSH组件时默认的rt_hw_console_getchar()实现会以阻塞方式等待串口输入// 典型串口获取字符实现问题版本 char rt_hw_console_getchar(void) { while(!serial_rx_ready()); // 死等字符输入 return serial_getc(); }这种实现会导致以下问题链系统空闲时进入rt_thread_idle_entry()FINSH组件在idle线程中调用rt_hw_console_getchar()函数内部死循环等待输入idle线程无法完成完整执行流程cpu_usage_idle_hook()得不到执行统计计数器无法更新3. 解决方案对比与实现3.1 方案一延时法快速修复实现步骤修改rt_hw_console_getchar()实现char rt_hw_console_getchar(void) { while(!serial_rx_ready()) { rt_thread_delay(1); // 增加1个tick的延时 } return serial_getc(); }优劣分析优点缺点改动量最小增加系统调度开销快速解决问题响应速度降低兼容性好非根本解决方案适用场景需要快速验证功能的原型阶段对实时性要求不高的应用资源受限无法进行大改动的场景3.2 方案二配置法推荐方案实现步骤在rtconfig.h中开启以下配置#define RT_USING_IDLE_HOOK #define RT_USING_HOOK #define FINSH_USING_MSH_ONLY修改FINSH初始化逻辑int finsh_thread_init(void) { /* 仅在使用MSH模式时创建线程 */ #ifdef FINSH_USING_MSH_ONLY rt_thread_t tid; tid rt_thread_create(tshell, finsh_thread_entry, RT_NULL, 4096, 20, 10); #endif return 0; }关键改进点使用MSH_ONLY模式避免默认shell占用idle线程单独创建shell线程保持交互功能确保idle线程能正常执行3.3 方案三代码重构法高级方案对于需要精确统计的场景建议重构统计逻辑// 新建cpu_usage_adv.c void cpu_usage_adv_init(void) { rt_timer_init(calc_timer, cpu_usage, cpu_usage_callback, RT_NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC); rt_timer_start(calc_timer); } static void cpu_usage_callback(void *param) { static rt_tick_t last_idle 0; rt_tick_t current rt_thread_idle_gethandler_time(); usage 100 - (current - last_idle) * 100 / RT_TICK_PER_SECOND; last_idle current; }优势特征使用定时器独立于idle线程工作通过系统API直接获取idle线程运行时间计算结果更加精确稳定支持多核CPU扩展4. 验证与调试技巧4.1 诊断流程确认idle线程状态list_thread观察idle线程的max used和status字段检查钩子函数绑定rt_thread_idle_sethook(cpu_usage_idle_hook);验证配置宏#ifndef RT_USING_IDLE_HOOK #error CPU usage requires RT_USING_IDLE_HOOK #endif4.2 典型调试输出正常情况应看到如下输出CPU利用率23.5% 线程 状态 优先级 栈最大使用 CPU使用率 ------ ------ -------- ---------- -------- idle ready 31 32% 76.8% shell suspend 20 45% 12.3%异常情况表现CPU利用率0.0% 线程 状态 优先级 栈最大使用 CPU使用率 ------ ------ -------- ---------- -------- idle suspend 31 1% 0.0%5. 进阶优化建议5.1 多核CPU统计扩展对于多核系统需要为每个核心单独统计struct cpu_usage { rt_uint8_t core_id; rt_uint8_t usage_major; rt_uint8_t usage_minor; rt_timer_t timer; }; void multi_core_usage_init(void) { for(int i0; iCORE_NUM; i) { cpus[i].core_id i; rt_timer_init(cpus[i].timer, cpu_stat, cpu_stat_cb, cpus[i], 100, RT_TIMER_FLAG_PERIODIC); } }5.2 动态校准机制添加自动校准逻辑应对CPU频率变化static void auto_calibrate(void) { if(calib_cnt CALIB_CYCLE) { total_count 0; // 触发重新校准 calib_cnt 0; } }5.3 线程级CPU统计扩展实现各线程CPU使用率统计struct thread_cpu_usage { rt_thread_t thread; rt_uint32_t run_time; rt_uint32_t total_time; }; void thread_usage_get(struct thread_cpu_usage *usage) { rt_scheduler_lock(); // 遍历线程列表统计运行时间 rt_scheduler_unlock(); }通过本文介绍的三种解决方案开发者可以根据实际项目需求选择最适合的方式。在资源允许的情况下推荐采用方案三的重构方法它不仅解决了FINSH组件导致的问题还为系统提供了更强大的性能监控能力。

相关新闻

应用异常退出原因获取与日志设计:让崩溃后能复盘

应用异常退出原因获取与日志设计:让崩溃后能复盘

应用异常退出原因获取与日志设计:让崩溃后能复盘 线上异常最怕只有一句“应用退出了”。没有页面、入口、任务、最近操作和 traceId,开发只能猜。异常退出日志要围绕复盘设计。 这类问题通常不是某个 API 写错,而是工程边界没有提前定好。本文…

2026/7/12 6:31:26 阅读更多 →
pytest fixture 参数化(params)深度解析:结合request实现4种数据驱动测试

pytest fixture 参数化(params)深度解析:结合request实现4种数据驱动测试

pytest fixture 参数化(params)深度解析:结合request实现4种数据驱动测试在自动化测试领域,数据驱动测试(Data-Driven Testing)是提升测试效率和覆盖面的关键技术。作为Python生态中最流行的测试框架之一,pytest通过其…

2026/7/12 6:31:26 阅读更多 →
Citra 3DS模拟器实战指南:在PC上完美运行任天堂经典游戏

Citra 3DS模拟器实战指南:在PC上完美运行任天堂经典游戏

Citra 3DS模拟器实战指南:在PC上完美运行任天堂经典游戏 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/gh_mirrors/cit/citra 想要在个人电脑上重温《精灵宝可梦》、《塞尔达传说》等任天堂3DS独占游戏吗?Citra…

2026/7/12 6:29:26 阅读更多 →

最新新闻

终极指南:用Rust构建的网易云音乐插件管理器

终极指南:用Rust构建的网易云音乐插件管理器

终极指南:用Rust构建的网易云音乐插件管理器 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM-Installer是一款基于Rust语言开发的网易云音乐插件管理工具&#xf…

2026/7/12 7:19:58 阅读更多 →
Windows 11 26H1系统优化全攻略:解决卡顿提升性能

Windows 11 26H1系统优化全攻略:解决卡顿提升性能

最近在帮朋友重装系统时,发现很多用户对Windows 11的流畅度存在顾虑,特别是从Win10升级后感觉系统变卡顿。经过多次测试和优化,我整理了一套完整的Win11 26H1版本优化方案,不仅解决了系统卡顿问题,还让整体运行效率超越…

2026/7/12 7:17:57 阅读更多 →
GB/T 39786-2021 密评技术要求解析:4大层面70分技术项合规路径

GB/T 39786-2021 密评技术要求解析:4大层面70分技术项合规路径

GB/T 39786-2021 密评技术全景解析:从合规框架到实战落地的70分通关指南在数字化转型浪潮下,商用密码技术已成为保障网络空间安全的核心基石。作为国内密码应用领域的权威标准,GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》构建…

2026/7/12 7:17:57 阅读更多 →
Codex 用到一半弹验证码,很多人都是这一步才开始头疼

Codex 用到一半弹验证码,很多人都是这一步才开始头疼

最近不少人用 Codex 或其他 AI 工具时,会遇到一个小问题:突然要求手机号验证。 一开始大家可能觉得没什么,找个临时号收一下就行。 但真正长期使用以后,会发现临时方案并不适合所有场景。 常见情况有几种: - 第一…

2026/7/12 7:13:56 阅读更多 →
LangChain RAG效果翻倍实录(RAG评估指标F1骤升42.6%的底层逻辑)

LangChain RAG效果翻倍实录(RAG评估指标F1骤升42.6%的底层逻辑)

更多请点击: https://intelliparadigm.com 第一章:RAG效果跃迁的观测现象与核心归因 近期多个工业级RAG系统在引入细粒度文档切片、查询重写与混合检索策略后,出现显著的效果跃迁现象:在HotpotQA和Natural Questions基准上&#…

2026/7/12 7:11:56 阅读更多 →
客易云关注“人工智能+”行动深化,智能经济新形态写入政府工作报告

客易云关注“人工智能+”行动深化,智能经济新形态写入政府工作报告

2026年《政府工作报告》首次提出“打造智能经济新形态”,围绕深化拓展“人工智能”、推广智能终端与智能体、布局算力新基建、完善数据要素制度、健全人工智能治理等关键环节作出系统安排。报告明确提出,数字经济核心产业增加值占国内生产总值的比重提高…

2026/7/12 7:11:56 阅读更多 →

日新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

月新闻