定时器计数溢出引发的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();
}
相关推荐
SUNNYSPY0012 小时前
AO3402-ASEMI开关电源专用AO3402
单片机
iCxhust2 小时前
MTK8088单板机制作(一)时钟电路
汇编·单片机·嵌入式硬件·微机原理·8088单板机
崇山峻岭之间2 小时前
单片机直流有刷电机速度环PID控制实验
单片机·嵌入式硬件
xiangw@GZ3 小时前
智能锁浮空系统指纹头金属环ESD防护技术分析
单片机·嵌入式硬件
项目題供诗3 小时前
STM32-DMA直接存储器存储(二十)
stm32·单片机·嵌入式硬件
耳朵东先生4 小时前
STM32 开发利器:SEGGER RTT 日志打印与 Shell 实践解析
单片机·嵌入式硬件
振南的单片机世界4 小时前
RS485组网三要素:负载、距离、终端电阻
arm开发·stm32·单片机·嵌入式硬件
小慧10244 小时前
Esp开发工具命令
单片机
redaijufeng4 小时前
stm32实现串口打印输出_stm32串口打印
stm32·单片机·嵌入式硬件
黑白园4 小时前
STM32CubeIDE配置FreeRTOS及Demo验证
stm32·单片机·嵌入式硬件