时钟

Mark Walen大约 3 分钟

时钟实例是可以安排在一定数量的系统滴答后运行的函数。时钟实例是一次性的或周期性的。这些实例在创建后立即启动,配置为在延迟后启动,并且可以随时停止。所有时钟实例在 Swiopen in new window 上下文中过期时执行。以下示例显示最小分辨率是 TI-RTOS 配置文件 (.cfg) 中设置的 TI-RTOS 时钟节拍周期。

提示

默认的 TI-RTOS 内核节拍周期为 1 毫秒。对于 CC2640R2 设备,这在 TI-RTOS 配置文件 (.cfg) 中重新配置:

Clock.tickPeriod = 10;

派生自实时时钟 RTC 的每个系统节拍都会启动一个时钟对象,该对象将运行节拍计数与每个时钟的周期进行比较,以确定相关函数是否应该运行。对于更高分辨率的定时器,TI 建议使用 16 位硬件定时器通道或传感器控制器。请参阅 TI-RTOS 内核 (SYS/BIOS) 用户指南open in new window的包 ti.sysbios.knl 部分中的时钟模块。有关这些功能的更多信息。

提示

传感器控制器在 CC2640R2Lopen in new window 上不可用。

您可以直接在您的应用程序中使用内核的时钟 API,此外,Util 模块还包含一组抽象的 TI-RTOS 时钟函数,如下所示:

功能示例

以下示例取自 BLE5-Stack 中的 simple_peripheral 项目。

步骤 1 ,通过 Util_constructClock()open in new window 构造时钟对象。在示例进入连接状态后,它将通过 Util_startClock()open in new window 启动时钟对象。


// Clock instances for internal periodic events.
static Clock_Struct periodicClock;

// Create one-shot clocks for internal periodic events.
Util_constructClock(&periodicClock, SimplePeripheral_clockHandler,
    SP_PERIODIC_EVT_PERIOD, 0, false, SP_PERIODIC_EVT);

步骤 2,当 Clock 对象的定时器超时后,它将在 Swi 上下文中执行 SimplePeripheral_clockHandler()。由于无法阻止此调用并阻止所有任务,因此通过调用 Event_post(SP_PERIODIC_EVT) 在 simple_peripheral 中进行后处理来保持简短。


static void SimplePeripheral_clockHandler(UArg arg)
{
    /* arg is passed in from Clock_construct() */
    Event_post(events, arg);
}

注意

时钟函数不得调用阻塞内核 API 或 TI-RTOS 驱动程序 API!执行长例程将影响分配给无线协议栈的高优先级任务中的实时约束!

步骤 3,由于 Event_post(SP_PERIODIC_EVT),simple_peripheral 任务被解锁,它继续调用 SimplePeripheral_performPeriodicTask() 函数。之后,要重新启动此函数的周期性执行,它将重新启动 periodicClock 时钟对象。


if (events & SP_PERIODIC_EVT)
{
  // Perform periodic application task
  SimplePeripheral_performPeriodicTask();

  Util_startClock(&periodicClock);
}