ZHCUAQ1G June 2015 – August 2025
编译器 RTS 库在 time.h 中支持两个低级别时间相关标准 C 函数:
clock_t clock(void);clock() 函数会返回自程序开始执行以来经过的时钟周期数;它与挂钟时间完全无关。
time_t time(time_t *timer);time() 函数会返回挂钟时间。
编译器安装程序的 /lib/src 目录中提供了时间相关和时钟相关的 RTS 库源文件。
这些函数的默认实现要求程序在 CCS 或支持 CIO 系统调用协议的类似工具下运行。如果 CIO 不可用,而您需要使用这些函数中的其中一个,则您必须提供针对相应函数的自有定义。
clock() 函数会返回自程序开始执行以来经过的时钟周期数。这类信息可能存在于某些器件上的寄存器中,但位置会因平台而异。编译器的 RTS 库提供了采用 CIO 系统调用协议来与 CCS 进行通信的实现方案,这将确定如何为此器件计算正确的值。
如果 CCS 不可用,您必须提供一种有关 clock() 函数的实现方案来从器件中的相应位置收集时钟周期信息。
time() 函数会返回从 epoch 到现在的真实时间(以秒为单位)。
很多嵌入式系统中没有内部现实时钟,因此程序需要通过外部来源发现时间。编译器的 RTS 库提供了一种实现方案,利用 CIO 系统调用协议来与 CCS 进行通信,从而提供真实时间。
如果 CCS 不可用,您必须提供一种有关 time() 函数的实现方案来从一些其他来源查找时间。如果程序在操作系统中运行,该操作系统应该提供一种有关 time() 的实现方案。
time() 函数会返回从 epoch 到现在的秒数。在 POSIX 系统中,epoch 定义为自 1970 年 1 月 1 日 UTC 午夜零点到现在的秒数。不过,C 标准不需要任何特定的 epoch,并且 time() 的默认 TI 版本使用不同的 epoch:1900 年 1 月 1 日 UTC-6 (CST) 午夜零点。例外,默认的 TI time_t 类型为 32 位类型,而 POSIX 系统通常使用 64 位 time_t 类型。
RTS 库提供了一种有关 time() 函数的非默认实现方案,在该实现中,epoch 为 1970 年 1 月 1 日 UTC 午夜零点,time_t 类型为 64 位,也就是 __type64_t 的 typedef。
如果您的代码采用原始时间值,则您可以通过以下方式之一来处理 epoch 问题:
| __time32_t | __time64_t | |
|---|---|---|
| Epoch (start) | 1900 年 1 月 1 日 CST-0600 | 1970 年 1 月 1 日 UTC-0000 |
| 结束日期 | 2036 年 2 月 7 日 06:28:14 | 292277026596 年 |
| 符号 | 无符号,因此不能表示 epoch 之前的日期。 | 带符号,因此可以表示 epoch 之前的日期。 |
TI RTS 库不提供时区查询表。本地时区由类型为结构体 tz 的全局变量 _tz 指定,该变量在 RTS 库源代码的 tmzone.c 中定义。此结构体由 mktime()和 strftime() 函数使用。要更改本地时区,请为此结构体中的以下字段分配新值:
_tz.daylight 字段设置为 mktime() 函数的精确值,以分配给结构体 tm 成员 tm_isdst。_tz.timezone 字段设置为有符号整数,表示 UTC 以西秒数。例如,中部标准时间 (UTC+6) 在 UTC 以西 21600 秒。为 UTC 以东的时区使用负值。_tz.tzname 字段设置为本地时区的缩写名称。此字符串由 strftime() 函数逐字用于 %Z 转换。例如,如果本地时区是中部标准时间,请为此字段使用“CST”。_tz.dstname 字段当前未被 RTS 库使用。