ThreadX中,有两个函数可以获取和设置内部系统时钟服务,
tx_time_get 获取当前时间。
tx_time_set 设置当前时间。
tx_time_get
获取当前时间。
原型
ULONG tx_time_get(VOID)
描述
这项服务用来返回当前的内部系统时钟。每个定时节拍使内部系统时钟加1。系统时钟在初始化时被设置为0,同样可以被tx_time_set服务修改成指定的值。
(警告:每个定时节拍代表的物理时间间隔根据实际应用情况指定。)
参数
无。
返回值
系统时钟节拍数内部自由运行的系统时钟的值。
合法的使用者
初始化,线程,定时器和ISR
抢占能力
无。
例程
ULONG current_time;
/* 获取当前系统时间,以时钟节拍为单位 */
current_time = tx_time_get();
/* 此时变量current_time就是当前系统时间 */
tx_time_set
设置当前时间。
原型
VOID tx_time_set(ULONG new_time)
描述
这项服务用来设置内部系统时钟为指定值。随后的每个定时节拍产生时,内部系统时钟在此值的基础上增1。
(警告:每个定时节拍代表的物理时间间隔根据实际应用情况指定。)
输入参数:
new_time 放入系统时钟的新值,该值的有效范围为0-0xFFFFFFFF(闭合区间含此值)
返回值
无。
合法的使用者
初始化,线程,定时器和ISR
抢占能力
无。
例程
/* 设置内部系统时钟为0x1234。 */tx_time_set(0x1234);
/* 系统当前时间为0x1234, 该时间将保持到下一次定时中断 */
应用场景举例,
1. 计时,如在2000ms内获得m_version[],如果超出2000ms则退出循环。
ULONG tick0=tx_time_get();
while (m_version[0]==0)
{
RxDefault();
if (tx_time_get()-tick0>OS_MSECS_TO_TICKS(2000))
{
Sys.Log("Get BT version fail.");
break;
}
}
2. 另外,我们在代码中可以埋入一些log,将当前时间打印出来,来看看某段代码耗时长短。
还有,我们知道tx_time_get()/tx_time_set()的计时单位是ticket, 那么如何和milliseconds进行互换呢?答案在下面,
/* This is the official milliseconds per tick. The initialization code uses
this value to set up the hardware. Accept no substitutes.
*/
//! \brief TBD
//! \todo [PUBS] Add definition(s)...
#define OS_MSEC_PER_TICK (10)
//! \brief TBD
//! \todo [PUBS] Add definition(s)...
#define OS_USEC_PER_TICK (OS_MSEC_PER_TICK * 1000)
/* Most of our code likes to "think" in milliseconds, but ThreadX "thinks" in
ticks. Here's a handy macro for doing the conversion.
*/
//! \brief Converts OS ticks to milliseconds.
#define OS_MSECS_TO_TICKS(x) (((x)+OS_MSEC_PER_TICK-1)/OS_MSEC_PER_TICK)
//! \brief Converts OS ticks to microseconds.
#define OS_USECS_TO_TICKS(x) (x/OS_USEC_PER_TICK)