定时器计数溢出引发的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();
}
相关推荐
LCMICRO-133108477469 分钟前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc
逐步前行8 小时前
STM32_TIM_寄存器操作
stm32·单片机·嵌入式硬件
0南城逆流09 小时前
【STM32】知识点介绍七:PWM功能
stm32·单片机·嵌入式硬件
智者知已应修善业9 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
dashizhi20159 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
我是一棵无人问荆的小草9 小时前
单片机通电后延迟启动策略
单片机·嵌入式硬件
日更嵌入式的打工仔10 小时前
UART RX为什么要上拉
单片机
三佛科技-1873661339713 小时前
FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
stm32·单片机·嵌入式硬件
LCMICRO-1331084774614 小时前
长芯微LDC90810完全P2P替代ADC128D818,是一款八通道系统监控器,专为监控复杂系统状态而设计。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·模数转换芯片adc
嵌入式老菜鸟qq12524277314 小时前
关于S2-LP休眠
单片机·嵌入式硬件·mcu·射频工程