目录
概述
1 k_timer主要函数
1.1 k_timer_start函数
1.2 k_timer_init 函数
1.3 k_timer_stop 函数
2 典型使用方法
2.1 周期性数据采集
2.2 看门狗超时
2.3 精确时间控制
3 高级用法
3.1 定时器组合(多速率系统)
3.2 带用户数据的定时器
3.3 定时器链(顺序执行)
4 k_timer主要函数的用法
4.1 k_timer_init 函数
4.2 k_timer_start函数
4.3 k_timer_stop 函数
5 与工作队列的对比
本文主要介绍Zephyr RTOS 中的 k_timer定时器的函数,
k_timer_start是 Zephyr RTOS 中用于启动内核定时器的核心函数,提供了精确的时间事件调度能力。k_timer_stop
是 Zephyr RTOS 中用于停止运行中定时器的核心函数。k_timer_init
是 Zephyr RTOS 中用于初始化内核定时器的核心函数,它为定时器设置基本参数和回调处理函数,是使用定时器功能前的必要步骤。
1)函数原型
void k_timer_start(struct k_timer *timer, k_timeout_t duration, k_timeout_t period);
2) 参数说明
参数 | 类型 | 说明 |
---|---|---|
timer |
struct k_timer * |
指向定时器结构的指针 |
duration |
k_timeout_t |
首次到期时间 |
period |
k_timeout_t |
后续周期性间隔(0 表示单次定时器) |
3) 关键特性
高精度计时:基于系统时钟中断,精度可达微秒级
两种通知机制:
到期回调函数(在中断上下文执行)
状态标志(可在线程中查询)
灵活的工作模式:
单次模式(period = 0)
周期模式(period > 0)
低功耗支持:可唤醒休眠系统
线程安全:所有操作都是原子的
1) 函数原型
void k_timer_init(struct k_timer *timer,
k_timer_expiry_t expiry_fn,
k_timer_stop_t stop_fn);
2)参数说明
参数 | 类型 | 说明 |
---|---|---|
timer |
struct k_timer * |
指向要初始化的定时器结构体的指针 |
expiry_fn |
k_timer_expiry_t |
定时器到期回调函数(可为 NULL) |
stop_fn |
k_timer_stop_t |
定时器停止回调函数(可为 NULL) |
3) 回调函数类型定义
// 定时器到期回调
typedef void (*k_timer_expiry_t)(struct k_timer *timer);
// 定时器停止回调
typedef void (*k_timer_stop_t)(struct k_timer *timer);
k_timer_stop
函数k_timer_stop
是 Zephyr RTOS 中用于停止运行中定时器的核心函数,它提供了对定时器生命周期的精确控制能力,是资源管理和节能的关键操作。
1)函数原型
void k_timer_stop(struct k_timer *timer);
2) 参数说明
参数 | 类型 | 说明 |
---|---|---|
timer |
struct k_timer * |
指向要停止的定时器结构体的指针 |
struct k_timer sensor_timer;
void sensor_timer_handler(struct k_timer *timer) {
// 在中断中快速读取传感器
int value = adc_read();
k_fifo_put(&sensor_data_fifo, &value);
}
void main(void) {
k_timer_init(&sensor_timer, sensor_timer_handler, NULL);
k_timer_start(&sensor_timer, K_MSEC(10), K_MSEC(10));
while (1) {
// 主线程处理数据
int *data = k_fifo_get(&sensor_data_fifo, K_FOREVER);
process_sensor_data(*data);
}
}
struct k_timer watchdog_timer;
void watchdog_handler(struct k_timer *timer) {
printk("System watchdog timeout! Resetting...\n");
sys_reboot();
}
void feed_watchdog(void) {
k_timer_start(&watchdog_timer, K_SECONDS(5), K_NO_WAIT);
}
void main(void) {
k_timer_init(&watchdog_timer, watchdog_handler, NULL);
feed_watchdog();
while (1) {
perform_critical_operation();
feed_watchdog(); // 定期喂狗
k_sleep(K_SECONDS(1));
}
}
// 控制LED精确闪烁
void led_blink_handler(struct k_timer *timer) {
static bool state;
gpio_pin_set(led_dev, LED_PIN, state);
state = !state;
}
void start_led_blink(void) {
static struct k_timer blink_timer;
k_timer_init(&blink_timer, led_blink_handler, NULL);
k_timer_start(&blink_timer, K_MSEC(100), K_MSEC(100)); // 10Hz闪烁
}
struct k_timer fast_timer, slow_timer;
void fast_handler(struct k_timer *t) { /* 高频任务 */ }
void slow_handler(struct k_timer *t) { /* 低频任务 */ }
void setup_multi_rate_system(void) {
k_timer_init(&fast_timer, fast_handler, NULL);
k_timer_init(&slow_timer, slow_handler, NULL);
k_timer_start(&fast_timer, K_MSEC(10), K_MSEC(10)); // 100Hz
k_timer_start(&slow_timer, K_MSEC(100), K_MSEC(100)); // 10Hz
}
struct custom_timer {
struct k_timer timer;
void *user_data;
};
void custom_handler(struct k_timer *timer) {
struct custom_timer *ct = CONTAINER_OF(timer, struct custom_timer, timer);
handle_event(ct->user_data);
}
void start_custom_timer(void *data) {
static struct custom_timer ct;
ct.user_data = data;
k_timer_init(&ct.timer, custom_handler, NULL);
k_timer_start(&ct.timer, K_MSEC(500), K_NO_WAIT);
}
struct k_timer step1_timer, step2_timer;
void step2_handler(struct k_timer *t) {
// 第二步操作
}
void step1_handler(struct k_timer *t) {
// 第一步操作
k_timer_start(&step2_timer, K_MSEC(50), K_NO_WAIT); // 启动下一步
}
void start_sequence(void) {
k_timer_init(&step1_timer, step1_handler, NULL);
k_timer_init(&step2_timer, step2_handler, NULL);
k_timer_start(&step1_timer, K_MSEC(100), K_NO_WAIT); // 启动序列
}
k_timer_init
函数1) 定义定时器变量
// 静态定义
static struct k_timer my_timer;
// 或者动态分配(需确保生命周期)
struct k_timer *timer_ptr = k_malloc(sizeof(struct k_timer));
2)初始化定时器
// 带到期回调的初始化
k_timer_init(&my_timer, timer_expiry_handler, NULL);
// 带停止回调的初始化
k_timer_init(&my_timer, NULL, timer_stop_handler);
// 带完整回调的初始化
k_timer_init(&my_timer, timer_expiry_handler, timer_stop_handler);
3) 定义回调函数(可选)
// 到期回调函数
void timer_expiry_handler(struct k_timer *timer_id)
{
printk("Timer expired at %u ms\n", k_uptime_get_32());
// 可以通过CONTAINER_OF获取用户数据
struct custom_data *data = CONTAINER_OF(timer_id, struct custom_data, timer);
process_data(data);
}
// 停止回调函数
void timer_stop_handler(struct k_timer *timer_id)
{
printk("Timer was stopped\n");
// 清理资源或通知其他任务
}
k_timer_start函数
1) 定义定时器
struct k_timer my_timer;
2) 启动定时器
// 单次定时器(100ms后触发)
k_timer_start(&my_timer, K_MSEC(100), K_NO_WAIT);
// 周期性定时器(首次50ms后触发,之后每100ms触发)
k_timer_start(&my_timer, K_MSEC(50), K_MSEC(100));
3) 定时器处理
// 回调函数方式
void timer_expiry_handler(struct k_timer *timer_id)
{
printk("Timer expired at %u ms\n", k_uptime_get_32());
}
// 状态查询方式
if (k_timer_status_get(&my_timer) > 0) {
// 处理定时事件
k_timer_status_sync(&my_timer); // 重置状态
}
4) 停止定时器
k_timer_stop(&my_timer);
k_timer_stop
函数k_timer_stop
是 Zephyr RTOS 中用于停止运行中定时器的核心函数,它提供了对定时器生命周期的精确控制能力,是资源管理和节能的关键操作。
1) 基本使用
// 定义定时器
struct k_timer my_timer;
void main(void) {
// 初始化定时器
k_timer_init(&my_timer, timer_handler, stop_handler);
// 启动定时器
k_timer_start(&my_timer, K_MSEC(1000), K_MSEC(500));
// ... 执行其他任务 ...
// 停止定时器
k_timer_stop(&my_timer);
}
2) 超时取消机制
struct k_timer timeout_timer;
void start_operation(void) {
k_timer_start(&timeout_timer, K_SECONDS(5), K_NO_WAIT);
// 开始操作...
}
void operation_completed(void) {
// 操作完成,取消超时
k_timer_stop(&timeout_timer);
}
void timeout_handler(struct k_timer *timer) {
// 超时处理
printk("Operation timed out!\n");
cancel_operation();
}
3) 节能管理
void enter_low_power_mode(void) {
// 停止所有活动定时器
k_timer_stop(&sensor_timer);
k_timer_stop(&comms_timer);
k_timer_stop(&ui_update_timer);
// 进入低功耗模式
k_sleep(K_FOREVER);
}
void wake_up(void) {
// 唤醒后重新启动定时器
k_timer_start(&sensor_timer, K_MSEC(100), K_MSEC(1000));
// ...其他定时器
}
4) 状态重置
void reset_system_state(void) {
// 停止所有定时相关操作
k_timer_stop(&measurement_timer);
k_timer_stop(&transmission_timer);
// 重置状态变量
current_state = IDLE_STATE;
// 可以重新配置并启动定时器
k_timer_start(&measurement_timer, K_MSEC(500), K_MSEC(500));
}
特性 | k_timer |
k_work_delayable |
---|---|---|
执行上下文 | 中断上下文(回调) | 线程上下文 |
时间精度 | 高(硬件中断) | 中等(依赖工作队列) |
资源开销 | 较低 | 较高(需要线程栈) |
阻塞操作 | 不允许(中断上下文) | 允许 |
动态调整 | 需要重启定时器 | 可动态调整 |
最佳场景 | 时间敏感操作 | 需要线程上下文的任务 |