ThreadX模块及模块管理器中tx_time_get()始终返回0的问题求助
解决ThreadX tx_time_get()始终返回0的问题
先看代码本身的问题
你当前的代码连续两次调用tx_time_get(),如果系统节拍执行很快,两次调用大概率在同一个时间节拍周期内,所以cycle_time必然为0。但核心问题是tx_time_get()无论在哪都返回0,说明系统计时根本没工作,按以下步骤排查:
排查步骤
检查ThreadX系统时钟初始化
- 确认在
tx_application_define函数中是否调用了tx_timer_activate(),这个函数是启动ThreadX定时器系统的关键,没调用的话计时不会开始。 - 验证硬件定时器是否正确配置为ThreadX的时钟源:定时器的中断要能正常触发,中断优先级设置不能被系统其他中断屏蔽,定时器的计数周期要和
TX_TIMER_TICKS_PER_SECOND的定义匹配。 - 检查
TX_TIMER_TICKS_PER_SECOND宏是否被正确定义,不能设为0,一般根据硬件定时器频率设置(比如1ms一个节拍的话设为1000)。
- 确认在
确认调用时机是否合法
- 不能在
tx_kernel_enter()之前调用tx_time_get(),tx_kernel_enter()是启动ThreadX内核的入口,内核没启动时计时系统还没初始化,返回0是正常的。 - 如果在中断服务程序中调用,确保中断是在ThreadX内核启动后触发的,且
tx_time_get()允许在中断上下文调用(ThreadX官方文档明确这个API支持中断上下文)。
- 不能在
检查代码配置错误
- 排查是否有宏定义意外替换了
tx_time_get(),比如某些自定义宏把它改成了返回0的空实现。 - 确认
ULONG类型和ThreadX定义的TX_TIMER_TICK类型一致,避免因类型不匹配导致的返回值异常。
- 排查是否有宏定义意外替换了
验证测试代码
修改代码加入延迟,验证计时是否正常工作:
ULONG start_time, current_time, cycle_time; start_time = tx_time_get(); tx_thread_sleep(1); // 等待1个系统节拍 current_time = tx_time_get(); cycle_time = current_time - start_time;
如果cycle_time返回1(或接近设置的节拍数),说明计时系统正常,原问题只是两次调用间隔太短。
内容的提问来源于stack exchange,提问作者Hamdim
相关产品推荐
相关产品推荐

