低功耗 Ticker
实现低功耗 ticker 使 Mbed OS 能够执行仅需要毫秒精度的功率高效的定时操作。您可以使用此 API 来安排事件,记录已用时间并驱动无滴答操作系统调度程序。
假设
定义的行为
- 据报道频率介于 8KHz 和 64KHz 之间。
- 有一个至少 12 位宽的计数器。
- 继续在深度睡眠模式下操作。
- ticker_init 函数可以安全地重复调用。
- ticker_init 函数允许 ticker 继续计数并禁用 ticker 中断。
- Ticker 频率非零,计数器至少为 8 位。
- Ticker 翻转(1 << 位)并从 0 开始继续计数。
- Ticker 按指定的频率加上或减去 10% 计数。
- Ticker 每个 tick 增加 1。
- 仅当 Ticker 时间增加到或超过 ticker_set_interrupt 设置的值时,才会触发 Ticker 中断。
- 在调用处理程序之前重复调用 ticker_set_interrupt 是安全的。
- 函数 ticker_fire_interrupt 导致 ticker_irq_handler 立即从中断上下文调用。
- Ticker 操作 ticker_read,ticker_clear_interrupt,ticker_set_interrupt 和 ticker_fire_interrupt 完成时间不到 20us。
未定义的行为
- 在 Ticker 初始化之前调用除 ticker_init 之外的任何函数。
- 如果时间换行并且与 ticker_set_interrupt 再次设置的值匹配,则是否第二次调用 ticker_irq_handler。
- 使用大于支持的位数的值调用 ticker_set_interrupt。
- 调用 lp_ticker_free 后调用 lp_ticker_init 以外的任何函数。
注意
实现此 API 时,请注意以下常见故障区域:
- 反复重新安排时,Ticker 不会漂移
- Ticker 在翻身时会继续计数
- 当比较值设置为 0 并发生溢出时,Ticker 中断将触发
处理同步延迟
一些低功耗代码需要多个低功耗时钟周期来进行 ticker_set_interrupt 设置生效的比较值。此问题进一步复杂化,通常无法设置新的比较值,直到第一个生效。因此,当您无延迟地对 ticker_set_interrupt 进行背对背调用时,第二次调用会阻止并违反上述要求,即 ticker_set_interrupt 在 20us 内完成。
为满足此时序要求,具有此同步延迟的目标必须将 LPTICKER_DELAY_TICKS 设置为调用 ticker_set_interrupt 生效所需的低功耗时钟周期数。当目标设置此值时,定时器代码会阻止 lp_ticker_set_interrupt 在该时钟周期内被调用两次。它通过使用微秒时间来安排在将来某个日期发生写入。
依赖
硬件低功耗 Ticker 功能。
实现低功耗 Ticker API
您可以在以下头文件中找到低功耗 Ticker API 的 API 和规范:
要在 Mbed OS 中启用低功率 Ticker 支持,请在 targets.json 文件的目标部分的 device_has 选项中添加 LPTICKER 标签。
测试
Mbed OS HAL 为低功率 Ticker 提供了一组一致性测试。您可以使用这些测试来验证实现的正确性。要运行低功耗 Ticker HAL 测试,请使用以下命令:
mbed test -t <toolchain> -m <target> -n tests-mbed_hal-common_ticker*,tests-mbed_hal-lp_ticker*
您可以阅读有关测试用例的更多信息: