定时器计数溢出引发的bug

之前记录了移植multitimer ,在实际项目中,直接移植,发现运行了1个多月后出现了问题,定时器错误,无法运行。经过排查,发现有个地方没有注意到

64位的接口

c 复制代码
uint64_t PlatformTicksGetFunc(void)
{
//  return (uint64_t)HAL_GetTick();
	return   get_system_time_64();
}


struct MultiTimerHandle {
    MultiTimer* next;
    uint64_t deadline;
    MultiTimerCallback_t callback;
    void* userData;
};

multitimer 是64位的接口,我在stm32直接用32位时基,导致32位溢出时,也就是49.7天左右,出现了bug。

解决

改为64位即可

c 复制代码
// 扩展的SysTick获取函数
timer_time_t get_system_time_64(void) {
    static uint32_t overflow_count = 0;
    static uint32_t last_tick = 0;
    uint32_t current_tick = HAL_GetTick();
    
    // 检测溢出
    if (current_tick < last_tick) {
        overflow_count++;
    }
    last_tick = current_tick;
    
    return ((timer_time_t)overflow_count << 32) | current_tick;
}

uint64_t PlatformTicksGetFunc(void)
{
//  return (uint64_t)HAL_GetTick();
	return   get_system_time_64();
}
相关推荐
π同学34 分钟前
基于RT-Thread的STM32开发第十一讲——编码器模式
stm32·rt_thread·双相编码器
码农小韩2 小时前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
匠在江湖3 小时前
裸机单片机任务调度器实现:基于规范分层(COM/APP/SRV/DRV)架构,(附 任务调度器 / 微秒延时函数 / 串口重定向 源码)
单片机·嵌入式硬件·架构
点灯小铭3 小时前
基于单片机的智能洗碗机控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计
清风6666665 小时前
基于单片机的电加热炉智能温度与液位PID控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
一路往蓝-Anbo5 小时前
第五篇:硬件接口的生死劫 —— GPIO 唤醒与测量陷阱
c语言·驱动开发·stm32·单片机·嵌入式硬件
逑之6 小时前
C语言笔记16:文件操作
c语言·笔记·单片机
2401_863326117 小时前
基于单片机智能光控路灯设计
单片机·嵌入式硬件
清风6666667 小时前
基于单片机的球类比赛专用计分与暂停管理系统设计
单片机·嵌入式硬件·毕业设计·课程设计
Y1rong7 小时前
STM32之时钟
stm32·单片机·嵌入式硬件