Zephyr OS 入门与实战

第7章:时间管理 - 系统时钟与定时器

7.1 系统时钟与睡眠

k_cycle_get_32() - 获取系统时钟周期

Zephyr提供了k_cycle_get_32()函数来获取系统时钟的当前周期计数。

uint32_t current_cycles = k_cycle_get_32();

特性:

  • 返回自系统启动以来的时钟周期数
  • 32位无符号整数,会周期性回绕
  • 时钟频率可通过sys_clock_hw_cycles_per_sec()获取

注意: 周期计数与硬件相关,不同平台可能有不同的时钟频率。

k_msleep() - 毫秒级睡眠

Zephyr提供了k_msleep()函数让当前线程进入睡眠状态。

// 让当前线程睡眠500毫秒
k_msleep(500);

特性:

  • 参数为毫秒数(ms)
  • 睡眠期间会释放CPU给其他线程
  • 实际睡眠时间可能有微小偏差

警告: 不要在中断上下文中使用睡眠函数,会导致系统崩溃。

7.2 高精度定时器

k_timer - 定时器结构体

Zephyr的高精度定时器使用k_timer结构体表示:

struct k_timer {
    // 定时器到期处理函数
    void (*expiry_fn)(struct k_timer *timer);
    
    // 定时器停止处理函数
    void (*stop_fn)(struct k_timer *timer);
    
    // 定时器周期(0表示单次定时器)
    k_timeout_t period;
    
    // 定时器状态标志
    uint32_t status;
    
    // 用户数据
    void *user_data;
    
    // 内部使用的链表节点
    _wait_q_t wait_q;
};

定时器API使用示例

完整的高精度定时器使用流程:

// 定义定时器
struct k_timer my_timer;

// 定时器回调函数
void timer_expiry_handler(struct k_timer *timer) {
    printk("Timer expired!\n");
}

void timer_stop_handler(struct k_timer *timer) {
    printk("Timer stopped!\n");
}

void init_timer(void) {
    // 初始化定时器
    k_timer_init(&my_timer, timer_expiry_handler, timer_stop_handler);
    
    // 启动定时器,1秒后触发,之后每500ms触发一次
    k_timer_start(&my_timer, K_SECONDS(1), K_MSEC(500));
    
    // 停止定时器
    // k_timer_stop(&my_timer);
}

定时器API函数

k_timer_init()

初始化定时器结构体

void k_timer_init(struct k_timer *timer,
                 k_timer_expiry_t expiry_fn,
                 k_timer_stop_t stop_fn);

k_timer_start()

启动定时器

void k_timer_start(struct k_timer *timer,
                  k_timeout_t duration,
                  k_timeout_t period);

k_timer_stop()

停止定时器

void k_timer_stop(struct k_timer *timer);

k_timer_status_sync()

同步获取定时器状态

uint32_t k_timer_status_sync(struct k_timer *timer);
客服小姐姐(优先添加)

客服小姐姐(优先添加)

客服微信

讲师微信(备用)