嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践

目录

前言

一、传统计时的痛点:无符号数的溢出判断难题

1.1 传统实现代码(以16位定时器为例)

1.2 小痛点

二、关键发现:有符号数补码特性解决溢出难题

2.1 补码与定时器计数的对应关系

2.2 无需溢出判断的核心原理

场景1:无溢出(计时时长短于溢出周期)

场景2:有溢出(计时跨计数器最大值)

三、实战落地:简化后的计时代码

3.1 完整代码实现

3.2 关键注意事项

四、特性验证与兼容性说明

4.1 跨场景结果验证

4.2 跨平台兼容性

五、总结:技巧的核心价值与适用场景


前言

在嵌入式开发中,利用硬件定时器计数器测量代码运行时间是高频需求——小到中断响应耗时统计,大到通信时序校准,都离不开精准的计时逻辑。传统实现中,因定时器计数器本质是无符号数,跨溢出周期计时时必须加入显式判断,代码冗余且易出错。而一个实用的底层技巧的能大幅简化逻辑:将计时起始/结束值定义为有符号数,借助补码特性直接省略溢出判断,实现更简洁、高效的计时代码。

一、传统计时的痛点:无符号数的溢出判断难题

嵌入式MCU的硬件定时器计数器(如STM32的TIM系列、51单片机的T0/T1)均为无符号整数类型,16位定时器计数范围为0~65535,32位定时器为0~2³²-1。当计数器从最大值溢出后,会归零重新开始计数,这就导致计时时若跨溢出周期,直接计算“end - start”会得到错误结果。

1.1 传统实现代码(以16位定时器为例)

// 传统方式:需显式判断溢出 uint16_t Measure_RunTime_Traditional(void) { uint16_t start = TIM_GetCounter(TIM2); // 读取无符号计数值 // 待计时核心代码段 for(uint32_t i=0; i<1000; i++); uint16_t end = TIM_GetCounter(TIM2); uint16_t duration; // 必须判断是否溢出,否则结果错误 if(end >= start) { duration = end - start; // 无溢出,直接相减 } else { duration = 0xFFFF - start + end + 1; // 溢出,补全周期差值 } return duration; }

1.2 小痛点

这段代码虽能实现功能,但存在两处明显小痛点:一是冗余性与通用性不足,16位与32位定时器的最大计数值不同(0xFFFF vs 0xFFFFFFFF),更换定时器时需手动修改溢出补全公式,维护成本略高;二是条件判断会牺牲部分运行时间,为了应对溢出这一特殊情形,每次计时都要执行分支判断,即便多数场景下无溢出也无法省略。这在高速运行场景中,比如中断响应时间计时,微小的判断耗时可能影响结果准确性,甚至超出场景对时序精度的容忍范围。

二、关键发现:有符号数补码特性解决溢出难题

突破点在于C语言的补码编码规则——这一底层特性让有符号数能“自动处理”定时器的溢出场景,无需额外判断。我们先理清核心逻辑,再用实例验证。

2.1 补码与定时器计数的对应关系

以16位数据为例,无符号数(uint16_t)范围是0~65535,而有符号数(int16_t)范围是-32768~32767,二者通过补码实现数值映射:

  • 无符号数65535(0xFFFF)→ 有符号数-1(补码表示);

  • 无符号数65534(0xFFFE)→ 有符号数-2;

  • ...以此类推,无符号数32768(0x8000)→ 有符号数-32768。

本质上,有符号数用“负数区间”覆盖了无符号数的后半段(32768~65535),而定时器溢出时的“从65535到0”,对应到有符号数就是“从-1到0”,完全符合补码的溢出逻辑。

2.2 无需溢出判断的核心原理

当我们将定时器的无符号计数值,显式转换为有符号数后,无论是否溢出,直接计算“end - start”都能得到正确的时间差,核心分为两种场景:

场景1:无溢出(计时时长短于溢出周期)

假设16位定时器计数精度为1us,start=100(无符号)→ 100(int16_t),end=200(无符号)→200(int16_t),差值=200-100=100us,结果正确。

场景2:有溢出(计时跨计数器最大值)

start=65500(无符号,接近最大值)→ 转换为int16_t后为-36(因65500=65536-36,补码中对应-36);end=50(无符号,溢出后归零计数)→50(int16_t)。此时差值=50 - (-36)=86us,与实际计时时长完全一致,补码自动抵消了溢出带来的偏差。

三、实战落地:简化后的计时代码

基于上述原理,我们可重构计时函数,完全删除溢出判断逻辑,代码更简洁、通用性更强。以下以STM32 16位定时器TIM2为例,给出完整实现。

3.1 完整代码实现

#include "stm32f10x.h" // 定时器初始化(1us计数精度,72MHz主频) void TIM2_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1; // 分频后1MHz,1us/计数 TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_Period = 0xFFFF; // 最大计数值(65535us) TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); // 启动定时器 } // 简化版计时函数(无需溢出判断) int16_t Measure_RunTime_Simplified(void) { int16_t start, end; // 无符号计数值显式转换为有符号数(核心步骤) start = (int16_t)TIM_GetCounter(TIM2); // ------------------- // 待计时的核心代码段 // 示例:模拟微秒级操作 for(uint32_t i=0; i<1000; i++); // ------------------- end = (int16_t)TIM_GetCounter(TIM2); return end - start; // 直接相减,补码自动处理溢出 } // 主函数调用示例 int main(void) { TIM2_Init(); int16_t run_time; while(1) { run_time = Measure_RunTime_Simplified(); // 输出结果(可通过串口打印,此处省略串口初始化) // printf("代码运行耗时:%d us\n", run_time); } }

3.2 关键注意事项

该技巧虽简洁,但存在一个核心限制,需严格遵守否则会导致结果错误:

计时时长不能超过定时器计数范围的一半。对于16位定时器,最大安全计时时长为32767us(int16_t最大值);对于32位定时器,最大安全时长为2³¹-1(约2147秒)。若超过该范围,差值会超出有符号数表示范围,触发有符号数溢出,结果失效。

补充说明:多数嵌入式计时场景(如中断响应、算法执行耗时)均在微秒级或毫秒级,完全处于32767us的安全范围,因此该技巧的实用性极强。若需测量更长时间,可通过定时器中断累计溢出次数,结合本技巧实现,兼顾简洁性与大范围计时。

四、特性验证与兼容性说明

4.1 跨场景结果验证

测试场景

无符号计数值(start/end)

有符号值(start/end)

计算结果

实际耗时

无溢出(短耗时)

100 / 200

100 / 200

100us

100us

有溢出(跨最大值)

65500 / 50

-36 / 50

86us

86us

临界安全值(32767us)

0 / 32767

0 / 32767

32767us

32767us

4.2 跨平台兼容性

该技巧基于C语言补码规则和定时器硬件特性,与MCU型号、编译器无关:

  • MCU兼容性:适用于所有带硬件定时器的嵌入式芯片(STM32、GD32、51单片机、ESP32等);

  • 编译器兼容性:Keil、GCC、IAR等主流嵌入式编译器均支持补码编码,无需额外配置。

五、总结:技巧的核心价值与适用场景

将定时器计时的start/end定义为有符号数,本质是“借用地层补码逻辑简化业务代码”,其核心价值的在于:

  1. 精简代码:删除溢出判断分支,减少代码量和潜在bug;

  2. 提升精度:避免条件判断带来的微小计时误差,适配高精度场景;

  3. 通用可移植:无需根据定时器位数修改逻辑,跨平台复用性强。

适用场景:微秒级/毫秒级代码耗时测量、中断响应时间统计、短时序校准等;不适用场景:超过定时器计数范围一半的长时计时(需结合溢出中断扩展)。

这一细节技巧,既体现了嵌入式开发“软硬件协同”的核心思维,也印证了“吃透底层原理,才能写出更优雅、高效代码”的道理。在实际项目中合理运用,能大幅提升计时逻辑的可靠性与开发效率。

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

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

相关文章

全渠道 AI 推荐,如何终结创作者的“效率焦虑”?

在当下的内容生态中&#xff0c;创作者正陷入一种前所未有的“西西弗斯式”困境。每天清晨睁眼&#xff0c;面对的不是灵感的迸发&#xff0c;而是小红书的封面比例、公众号的长文排版、知乎的问答逻辑以及朋友圈的营销海报。这种被多平台调性撕裂的创作现状&#xff0c;让“全…

WE Learn网课助手终极指南:3步开启智能学习新时代

WE Learn网课助手终极指南&#xff1a;3步开启智能学习新时代 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitcode.com/gh…

中国计算机学会(CCF)推荐学术会议-A(计算机网络):SIGCOMM 2026

SIGCOMM 2026ACM SIGCOMM is the flagship annual conference of the ACM Special Interest Group on Data Communication (SIGCOMM). ACM SIGCOMM 2026, the 40th edition of the conference series, will be held in Denver, Colorado, USA.重要信息CCF推荐&#xff1a;A&…

NS-USBLoader终极指南:Switch文件传输与RCM注入一键搞定

NS-USBLoader终极指南&#xff1a;Switch文件传输与RCM注入一键搞定 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/gh_mir…

汽车涂装工艺参数优化的关键点及企业实践案例

工艺参数对涂装质量的决定性作用汽车涂装工艺参数的优化是提升产品质量、降低生产成本的关键环节&#xff0c;然而很多制造企业在实际操作中却常常忽略这一点。从表面看&#xff0c;工艺参数只是简单的数值调整&#xff0c;但深入研究便会发现&#xff0c;参数的合理搭配直接关…

如何用Python脚本打造纪念币预约神器:从零到实战

如何用Python脚本打造纪念币预约神器&#xff1a;从零到实战 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为纪念币预约时的手忙脚乱而烦恼吗&#xff1f;这款基于Python的自动…

WE Learn智能学习助手完整使用指南:解放学习时间的终极方案

WE Learn智能学习助手完整使用指南&#xff1a;解放学习时间的终极方案 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitco…

Soundflower音频路由技术解析:Mac虚拟音频设备深度应用

Soundflower音频路由技术解析&#xff1a;Mac虚拟音频设备深度应用 【免费下载链接】Soundflower MacOS system extension that allows applications to pass audio to other applications. 项目地址: https://gitcode.com/gh_mirrors/sou/Soundflower Soundflower作为m…

介绍如何在电脑上查看 iPhone 和 iPad 的完整设备信息

在很多场景下&#xff0c;我们真正关心的问题并不是某个 App 怎么运行&#xff0c;而是它运行在什么设备上。 同一份安装包&#xff0c;在不同 iPhone、不同 iPad 上表现不一致&#xff1b; 同一系统版本&#xff0c;电池健康、磁盘状态却差异明显&#xff1b; 甚至连摄像头、主…

戴西iDWS数智化研发平台 V2026发布,“支撑系统”进化为“智能决策中枢”

随着工业研发向多学科协同与规模化并行演进&#xff0c;企业普遍面临工具分散、算力与许可资源难以统一调度&#xff0c;以及国产化与智能化同步推进的现实挑战。同时&#xff0c;人工智能正在重塑研发范式&#xff0c;企业对数字化转型的期待&#xff0c;正从“支撑工具”转向…

亲测好用8个一键生成论文工具,研究生轻松搞定论文写作!

亲测好用8个一键生成论文工具&#xff0c;研究生轻松搞定论文写作&#xff01; AI 工具如何让论文写作不再“难” 在研究生阶段&#xff0c;论文写作是一项不可避免的任务&#xff0c;而随着 AIGC 技术的普及&#xff0c;越来越多的学生开始借助 AI 工具来提升效率。这些工具不…

客户案例 | 利通科技x甄知科技,搭建便捷、高效、智能的IT服务体系

广东利通科技投资有限公司&#xff08;下称“利通科技”&#xff09;于2013年组建成立&#xff0c;是国内领先的智慧交通、数字化及信息化服务提供商。利通科技致力于将5G、人工智能、工业互联网、物联网、大数据、区块链等创新技术与高速公路建设营运产业融合运用&#xff0c;…

讲透知识图谱Neo4j在构建Agent时到底怎么用(二)

前言在构建面向真实业务场景的智能 Agent 时&#xff0c;我们很快会发现&#xff1a;仅靠大语言模型&#xff08;LLM&#xff09;和向量检索&#xff08;RAG&#xff09;远远不够。LLM 擅长生成流畅自然的语言&#xff0c;却缺乏对业务规则的精确把握&#xff1b;RAG 能从海量文…

海外HTTP代理适合哪些业务?与Socks/隧道的区别

在跨境数据需求高速增长的今天&#xff0c;海外HTTP代理成为不少企业部署全球化爬虫、区域内容测试、国际应用接入的重要工具。相比常见的Socks代理与隧道代理&#xff0c;HTTP代理在使用灵活性与部署成本方面具备一定优势。那么它究竟适合哪些场景&#xff1f;又该如何与其他代…

NS-USBLoader全能指南:Switch文件管理与RCM注入一键搞定

NS-USBLoader全能指南&#xff1a;Switch文件管理与RCM注入一键搞定 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/gh_mir…

吐血推荐!MBA必用9款AI论文工具测评TOP9

吐血推荐&#xff01;MBA必用9款AI论文工具测评TOP9 2026年MBA论文写作工具测评&#xff1a;精准筛选&#xff0c;高效助力 在MBA学习与研究过程中&#xff0c;论文写作是每位学生必须面对的重要环节。随着AI技术的不断进步&#xff0c;越来越多的AI论文工具被引入学术场景&…

iOS应用上架App Store完整流程与技巧详解

App Store上架指的是iOS应用从提交申请到上线的整个过程&#xff0c;它的目的是让应用展示在App Store上获取流量、用户。 一、iOS上架的整体流程 1、申请开发者账号 苹果的开发者账号主要分为三种类型&#xff1a;个人账号、公司账号、企业账号&#xff0c;三者的费用以及权限…

Diffusers库安装

diffusers 是由 Hugging Face团队开发并维护的开源 Python 库&#xff0c;专门用于加载、使用和定制扩散模型&#xff08;Diffusion Models&#xff09;&#xff0c;聚焦于生成式 AI 领域&#xff08;如图像生成、文生图、图生图等&#xff09;。 它的核心定位是&#xff1a;降…

Gerbv专业教程:从入门到精通的PCB制造文件查看指南

Gerbv专业教程&#xff1a;从入门到精通的PCB制造文件查看指南 【免费下载链接】gerbv Maintained fork of gerbv, carrying mostly bugfixes 项目地址: https://gitcode.com/gh_mirrors/ge/gerbv Gerber文件是连接PCB设计与实际制造的关键桥梁&#xff0c;而gerbv作为一…

戴西发布 DLM许可证加密防护软件V4.2让工业软件授权迈入并发调度与精细治理时代

随着工业软件逐步向网络化部署、跨区域协作与灵活授权模式演进&#xff0c;许可证管理软件正在从“防拷贝组件”演变为软件产品商业化与交付体系中的关键一环。戴西&#xff08;上海&#xff09;软件有限公司正式发布DLM许可证加密防护软件 V4.2 版本&#xff08;后称DLM&#…