定时器计数溢出引发的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();
}
相关推荐
不能跑的代码不是好代码10 小时前
STM32窗口看门狗(WWDG)知识点及标准库使用指南
stm32·单片机·嵌入式硬件
bingquan333310 小时前
在 Ghidra 中分析STM32裸机固件
stm32·单片机·嵌入式硬件
羽获飞10 小时前
从零开始学嵌入式之STM32——11.STM32---USART串行通讯
stm32·单片机·嵌入式硬件
宵时待雨12 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
逐步前行12 小时前
STM32_新建工程(寄存器版)
stm32·单片机·嵌入式硬件
bai54593613 小时前
STM32 CubeIDE 通过PWM占空比控制舵机角度
stm32·单片机·嵌入式硬件
松涛和鸣14 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
上海合宙LuatOS15 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
Hhh __灏15 小时前
stm32的SRAM内存不足如何分析和优化?堆栈空间如何优化?
单片机
点灯小铭16 小时前
基于51单片机的双档交流电压表设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业