pico-time
用于精确时间戳、睡眠和基于时间回调的 API。
详细描述
此处定义的函数对底层硬件定时器功能提供了更强大、更友好的封装。为使这些函数(以及依赖它们的任何其他 SDK 功能,如超时)正常工作,不应修改硬件定时器,即它预期每微秒单调递增一次。幸运的是,无需修改硬件定时器,因为任何你能想到的此处未涵盖的功能,都可以通过对未修改的硬件定时器值加减常量来轻松建模。
另请参阅
模块
timestamp
与时间点(包括当前时间)相关的时间戳函数。
sleep
用于以较低功耗状态延迟执行的睡眠函数。
alarm
用于调度未来执行的定时器函数。
repeating_timer
用于简单调度重复执行的重复定时器函数。
timestamp
与时间点(包括当前时间)相关的时间戳函数。
详细描述
这些函数用于处理以 absolute_time_t 类型表示的时间戳(即时间点)。提供此不透明类型是为了帮助防止时间戳与相对时间值意外混用。
类型定义
typedef uint64_t absolute_time_t: 以微秒为单位的不透明 64 位时间戳。
函数
static uint64_t to_us_since_boot (absolute_time_t t): 将 absolute_time_t 转换为自启动以来的微秒数。static void update_us_since_boot (absolute_time_t *t, uint64_t us_since_boot)
更新 absolute_time_t 值以表示自启动以来的给定微秒数。static absolute_time_t from_us_since_boot(uint64_t us_since_boot)`: 将自启动以来的微秒数转换为 absolute_time_t。static absolute_time_t get_absolute_time(void)`: 返回当前时间的表示。static uint32_t to_ms_since_boot (absolute_time_t t): 将时间戳转换为自启动以来的毫秒数。static absolute_time_t delayed_by_us(const absolute_time_t t, uint64_t us)`: 返回在另一个时间戳基础上加上若干微秒后得到的时间戳值。static absolute_time_t delayed_by_ms(const absolute_time_t t, uint32_t ms)`: 返回在另一个时间戳基础上加上若干毫秒后得到的时间戳值。static absolute_time_t make_timeout_time_us(uint64_t us)`: 获取距当前时间若干微秒后时间戳的便捷方法。static absolute_time_t make_timeout_time_ms(uint32_t ms)`: 获取距当前时间若干毫秒后时间戳的便捷方法。static int64_t absolute_time_diff_us (absolute_time_t from, absolute_time_t to): 返回两个时间戳之间的微秒差值。static absolute_time_t absolute_time_min(absolute_time_t a, absolute_time_t b)`: 返回两个时间戳中较早的一个。static bool is_at_the_end_of_time (absolute_time_t t): 判断给定时间戳是否为"时间终点"。static bool is_nil_time (absolute_time_t t): 判断给定时间戳是否为空。
变量
- `const absolute_time_t at_the_end_of_time``: 表示时间终点的时间戳;实际上并非最大可能的时间戳,而是设置为 0x7fffffff_ffffffff 微秒,以避免时间运算中的符号溢出。这大约是 300,000 年,应该足够用了。
- `const absolute_time_t nil_time``: 表示空时间戳的时间戳。
类型定义文档
absolute_time_t
typedef uint64_t absolute_time_t
以微秒为单位的不透明 64 位时间戳。
使用此类型而非原始 uint64_t,是为了防止在需要绝对时间的地方意外传入相对时间或单位错误的时间。
注意:从 SDK 2.0.0 起,此类型默认为 uint64_t(即无保护);可通过将 PICO_OPAQUE_ABSOLUTE_TIME_T 设为 1 来启用保护。
另请参阅
to_us_since_boot()
update_us_since_boot()
函数文档
absolute_time_diff_us
static int64_t absolute_time_diff_us (absolute_time_t from, absolute_time_t to) [inline], [static]
返回两个时间戳之间的微秒差值。
在与大时间戳(如 `at_the_end_of_time)求差时要小心,因为有符号整数可能溢出。
参数
from: 第一个时间戳to: 第二个时间戳
返回
两个时间戳之间的微秒数(若 to 在 from 之后则为正值,溢出情况除外)。
absolute_time_min
static absolute_time_t absolute_time_min (absolute_time_t a, absolute_time_t b) [inline], [static]`
返回两个时间戳中较早的一个。
参数
a: 第一个时间戳b: 第二个时间戳
返回
两个时间戳中较早的一个。
delayed_by_ms
static absolute_time_t delayed_by_ms (const absolute_time_t t, uint32_t ms) [inline], [static]
返回在另一个时间戳基础上加上若干毫秒后得到的时间戳值。
参数
t: 基础时间戳ms: 要加的毫秒数
返回
表示结果时间的时间戳。
delayed_by_us
static absolute_time_t delayed_by_us (const absolute_time_t t, uint64_t us) [inline], [static]
返回在另一个时间戳基础上加上若干微秒后得到的时间戳值。
参数
t: 基础时间戳us: 要加的微秒数
返回
表示结果时间的时间戳。
from_us_since_boot
static absolute_time_t from_us_since_boot (uint64_t us_since_boot) [inline], [static]
将自启动以来的微秒数转换为 absolute_time_t。
fn from_us_since_boot
参数
us_since_boot: 自启动以来的微秒数
返回
等价于 us_since_boot 的绝对时间。
get_absolute_time
static absolute_time_t get_absolute_time (void) [inline], [static]
返回当前时间的表示。
返回调用时采样的当前时间的不透明高精度表示。
返回
硬件定时器的绝对时间(当前时间)。
另请参阅
sleep_until()
time_us_64()
is_at_the_end_of_time
static bool is_at_the_end_of_time (absolute_time_t t) [inline], [static]
判断给定时间戳是否为"时间终点"。
参数
t: 时间戳
返回
若时间戳为 at_the_end_of_time 返回 true。
另请参阅
is_nil_time
static bool is_nil_time (absolute_time_t t) [inline], [static]
判断给定时间戳是否为空。
参数
t: 时间戳
返回
若时间戳为空返回 true。
另请参阅
make_timeout_time_ms
static absolute_time_t make_timeout_time_ms (uint32_t ms) [inline], [static]
获取距当前时间若干毫秒后时间戳的便捷方法。
参数
ms: 要加到当前时间戳的毫秒数
返回
未来的时间戳。
make_timeout_time_us
static absolute_time_t make_timeout_time_us (uint64_t us) [inline], [static]
获取距当前时间若干微秒后时间戳的便捷方法。
参数
us: 要加到当前时间戳的微秒数
返回
未来的时间戳。
to_ms_since_boot
static uint32_t to_ms_since_boot (absolute_time_t t) [inline], [static]
将时间戳转换为自启动以来的毫秒数。
fn to_ms_since_boot
参数
t: 要转换的 absolute_time_t 值
返回
t 所表示的自启动以来的毫秒数。
另请参阅
to_us_since_boot()
to_us_since_boot
static uint64_t to_us_since_boot (absolute_time_t t) [inline], [static]
将 absolute_time_t 转换为自启动以来的微秒数。
fn to_us_since_boot
参数
t: 要转换的绝对时间
返回
等价于 t 的自启动以来的微秒数。
update_us_since_boot
static void update_us_since_boot (absolute_time_t * t, uint64_t us_since_boot) [inline], [static]
更新 absolute_time_t 值以表示自启动以来的给定微秒数。
fn update_us_since_boot
参数
t: 要更新的绝对时间值us_since_boot: 要表示的自启动以来的微秒数。注意,此值应可表示为有符号 64 位整数。
变量文档
at_the_end_of_time
const absolute_time_t at_the_end_of_time
表示时间终点的时间戳;实际上并非最大可能的时间戳,而是设置为 0x7fffffff_ffffffff 微秒,以避免时间运算中的符号溢出。这大约是 300,000 年,应该足够用了。 nil_time
const absolute_time_t nil_time
表示空时间戳的时间戳。
sleep
用于以较低功耗状态延迟执行的睡眠函数。
详细描述
这些函数允许调用核心进入睡眠状态。这是一种较低功耗的睡眠:在每次处理器事件(WFE)时唤醒并重新检查时间。
这些函数不应从 IRQ 处理程序中调用。
较低功耗的睡眠需要使用[默认定时器池],该池可能被 PICO_TIME_DEFAULT_ALARM_POOL_DISABLED 宏禁用,或者当前已满,在这种情况下这些函数将退化为忙等待。
从功耗角度来说,sleep_ 函数比 busy_wait 函数更优选,但 busy_wait 等价函数可能在目标时间到达后略早返回。
另请参阅
busy_wait_until()
busy_wait_us()
busy_wait_us_32()
函数
void sleep_until (absolute_time_t target): 等待直到给定时间戳之后再返回。void sleep_us (uint64_t us): 等待给定的微秒数后返回。void sleep_ms (uint32_t ms): 等待给定的毫秒数后返回。bool best_effort_wfe_or_timeout (absolute_time_t timeout_timestamp): 用于在超时上阻塞的辅助方法。
函数文档
best_effort_wfe_or_timeout
bool best_effort_wfe_or_timeout (absolute_time_t timeout_timestamp)
用于在超时上阻塞的辅助方法。
此方法将在响应事件(如 `__wfe)时返回,或在目标时间到达时返回,也可能在此之前的任何时刻返回。
此方法可用于实现较低功耗的轮询循环,等待由事件([__sev()])发出信号的某个条件。
之所以称为 best_effort,是因为在某些情况下(尤其是默认定时器池被禁用或已满时),最佳努力就是直接返回而不执行 __wfe,从而将调用代码变为忙等待。
示例用法:
// .c
bool my_function_with_timeout_us(uint64_t timeout_us) {
absolute_time_t timeout_time = make_timeout_time_us(timeout_us);
do {
// each time round the loop, we check to see if the condition
// we are waiting on has happened
if (my_check_done()) {
// do something
return true;
}
// will try to sleep until timeout or the next processor event
} while (!best_effort_wfe_or_timeout(timeout_time));
return false; // timed out
}
此方法应始终在与检查另一个"事件"变量相关联的循环中使用,因为处理器事件是共享资源,可能由于大量原因而发生。
参数
timeout_timestamp: 超时时间
返回
若目标时间到达返回 true,否则返回 false。
sleep_ms
void sleep_ms (uint32_t ms)
等待给定的毫秒数后返回。
此方法尽可能尝试执行较低功耗的睡眠(使用 WFE)。
参数
ms: 睡眠的毫秒数
sleep_until
void sleep_until (absolute_time_t target)
等待直到给定时间戳之后再返回。
此方法尝试执行较低功耗(WFE)睡眠。
参数
target: 返回后的时间
另请参阅
sleep_us()
busy_wait_until()
sleep_us
void sleep_us (uint64_t us)
等待给定的微秒数后返回。
此方法尝试执行较低功耗(WFE)睡眠。
参数
us: 睡眠的微秒数
另请参阅
busy_wait_us()
alarm
用于调度未来执行的定时器函数。