之前记录了移植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();
}