ThreadX 内部系统时钟服务

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)



你可能感兴趣的:(ThreadX)