定时器计数溢出引发的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();
}
相关推荐
chao18984411 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
猫猫的小茶馆14 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
feifeigo12314 小时前
STM32矩阵键盘驱动(库函数版)实现
stm32·矩阵·计算机外设
嵌入式小站15 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
拾知_H16 小时前
STM32/Delay延时函数编程思路
stm32·单片机·时钟·延时
2zcode17 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz18 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
冉卓电子19 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件
yongui4783419 小时前
MAX6675 K型热电偶温度采集程序(Keil环境)
单片机·嵌入式硬件
豆包公子19 小时前
AUTOSAR CP XCP 移植到裸机 MCU-实践篇
单片机·嵌入式硬件