基于TI-RTOS的CC2650DK开发(16)---Timer(定时器)

judy的头像

之前一直把Timer翻译为计时器,感觉定时器更贴切些。之后全部翻译为定时器。

5.3 定时器模块

ti.sysbios.hal.Timer模块是一个面向定时器外设的标准接口。此模块将于8.3节进行详细描述,因为它是硬件抽象层(HAL)的一部分。

你可以使用此模块创建定时器(就是标记使用的定时器)并配置为定时器到期时调用一个tickFxn。仅在定时器外设无需任何自定义配置时使用此模块。

计时器可被配置为单周期或多周期模式。period可被指定为定时器次数或微秒。

5.4 Seconds模块

ti.sysbios.hal.Seconds模块提供了一种设置或获取自格林尼治时间1970年1月1日00:00:00以来走过的秒数。Seconds模块如果可用的话,将通过一个指定设备Seconds委托来维护时间。如果指定设备Seconds模块不可用,ti.sysbios.hal.SecondsClock模块将作为Seconds委托使用。SecondsClock内部使用时钟模块周期性地增加秒数。

Seconds模块的APIs是:

Void Seconds_set(UInt32 seconds);
UInt32 Seconds_get(Void);

应用程序应该调用Seconds_set()来初始化Seconds数量。如果需要,Seconds_set()可被再次调用以更新或重设Seconds数量。应用在调用Seconds_get()之前必须至少调用一次Seconds_set()。否则返回结果毫无意义。Seconds_set()函数是非可重入的。

Seconds模块包括一个time()函数,它调用Seconds_get()。它重写了C标准库time()函数。你可使用此time()函数联合C标准头文件(time.h)中的其它函数来以一种可读格式显示当前时间和日期。

例子

此例初始化Seconds模块,设置日期,获取当前日期并以人类可读模式显示当前日期和时间:

基于TI-RTOS的CC2650DK开发(16)---Timer(定时器)

注意:对于某些编译器的运行时库,包括TI的,time()函数返回自1990年1月1日走过的秒数。这种情况下,为与运行时支持库的其它APIs保持一致,Seconds模块的time()函数会给Seconds_get()的返回值添加一个位移值。

5.5 Timestamp(时间戳)模块

xdc.runtime.Timestamp模块,正如其名字所言,提供时间戳服务。Timestamp模块可用于基准测试代码和添加时间戳日志。调用Timestamp模块函数有利于指定平台的TimestampProvider实施。

Timestamp模块的包路径是xdc.runtime.Timestamp,所以SYS/BIOS应用将包含以下#include声明:
基于TI-RTOS的CC2650DK开发(16)---Timer(定时器)
配置文件(*.cfg)将使用以下声明:

var BIOS = xdc.useModule('xdc.runtime.Timestamp');

以下Timestamp模块APIs是SYS/BIOS应用中经常使用的:
• Timestamp_get32() — 返回一个32bit时间戳。
• Timestamp_get64() — 如果目标支持64bit解决方案,返回一个64bit时间戳。
• Timestamp_getFreq() — 获取timestamp定时器的频率(Hz)。你可以使用此函数将timestamp值转换为实时单位。
如果你需要一个平台依赖版本的Timestamp,可以使用TimestampStd模块,它使用的是ANSI C clock()函数。

指定平台的TimestampProvider模块位于ti.sysbios.family包,例如,ti.sysbios.family.msp430.TimestampProvider和ti.sysbios.family.arm.m3.TimestampProvider。大多TimestampProvider模块都有配置参数可用于控制硬件时钟源和如果时间戳计数器溢出后的行为。

下例计算CPU周期所关联的时间戳增量因子:

Types_FreqHz freq1; /* Timestamp frequency */
Types_FreqHz freq2; /* BIOS frequency */
Float factor; /* Clock ratio cpu/timestamp */
Timestamp_getFreq(&freq1);
BIOS_getCpuFreq(&freq2);
factor = (Float)freq2.lo / freq1.lo;
System_printf("%lu\t%lu\t%lu\t Timestamp Freq, BIOS Freq, Factor\n",
freq1.lo, freq2.lo, (UInt32) factor);

来源: abatei的专栏