news 2026/4/30 1:48:05

Zephyr 的 Counter alarm

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr 的 Counter alarm

Zephyr 的 Counter 驱动支持“相对闹钟”和“绝对闹钟”两种触发语义。区别在于struct counter_alarm_cfg里的flagsticks的含义。

关键结构体:

struct counter_alarm_cfg { counter_alarm_callback_t callback; //回调 uint32_t ticks; //不同模式下含义不同(见下) void *user_data; //给callback做回调参数 uint32_t flags; //标志闹钟模式 };

常用标志位(flags

  • alarm_cfg.flags = COUNTER_ALARM_CFG_ABSOLUTE
    绝对闹钟ticks表示计数器周期空间内的绝对计数值(例如下一次的目标计数点)。需要你自己处理取模(wrap)。
  • 缺省(alarm_cfg.flags = 0
    相对闹钟ticks表示相对当前的延迟,即“从现在开始延迟多少 ticks 后触发”。

设定闹钟函数

intcounter_set_channel_alarm(conststructdevice*dev,uint8_tchannel_id,conststructcounter_alarm_cfg*alarm_cfg);

不同模式下ticks的含义

相对闹钟

相对闹钟alarm_cfg.flags = 0

  • ticks表示从现在起ticks后触发(相对当前计数值),通常允许的最大延迟受计数器的拓展/回卷周期(top)以及驱动“保护期(guard period)”限制。

  • 使用情况:需求是“每隔固定时长触发”(周期性任务),最简单且不需要考虑取模。注意不要累加延迟。

  • 参考代码实现,通过信号量释放while循环阻塞,1s触发一次:

#include<zephyr/drivers/counter.h>staticstructcounter_alarm_cfgalarm_cfg;staticuint32_tperiod_ticks;staticstructk_semsem;staticvoidalarm_cb(conststructdevice*dev,uint8_tchan_id,uint32_tticks,void*user_data){structcounter_alarm_cfg*config=user_data;// 周期性:固定相对延迟为 period_ticks(不要累加)// config.ticks = period_ticks; 这个不用动interr=counter_set_channel_alarm(dev,chan_id,&config);if(err){printk("re-arm failed: %d\n",err);}k_sem_give(&sem);}voidmain(void){conststructdevice*dev=DEVICE_DT_GET(TIMER);// 你的计时器设备if(!device_is_ready(dev)){printk("counter not ready\n");return;}k_sem_init(&sem,0,1);// 计算 1 秒对应的 ticksperiod_ticks=counter_us_to_ticks(dev,1000000U);//(可选)设置保护期,避免过近设置失败//counter_set_guard_period(dev, counter_us_to_ticks(dev, 200U), COUNTER_GUARD_PERIOD_LATE);// 启动计数器counter_start(dev);// 首次设置:相对 1 秒后触发alarm_cfg.flags=0;// 相对模式alarm_cfg.ticks=period_ticks;// 相对延迟alarm_cfg.callback=alarm_cb;alarm_cfg.user_data=&alarm_cfg;// 让回调能访问配置interr=counter_set_channel_alarm(dev,0,&alarm_cfg);if(err){printk("set alarm failed: %d\n",err);}while(1){k_sem_take(&sem,K_FOREVER);// 可在此做一些cycle性质的工作}}

绝对闹钟

绝对闹钟alarm_cfg.flags = COUNTER_ALARM_CFG_ABSOLUTE

  • ticks表示计数器周期空间内的绝对目标值(比如“当计数值到 N 时触发”)。

  • 使用情况:

    需要保证你设置的下一个闹钟值落在[0, top)区间内。所以需要注意自己取模。如果不做取模,传入的绝对值超出范围,驱动一般会返回-EINVAL

    如果计数器是向下计数,你可以用原始硬件计数空间或把它转换成统一的“向上空间”,但要一致

  • 参考代码实现

#include<zephyr/drivers/counter.h>#include<zephyr/kernel.h>#include<zephyr/sys/printk.h>staticstructcounter_alarm_cfgalarm_cfg;staticuint32_tperiod_ticks;staticuint32_ttop;staticstructk_semsem;staticvoidalarm_cb(conststructdevice*dev,uint8_tchan_id,uint32_tfired_ticks,void*user_data){ARG_UNUSED(user_data);// fired_ticks 是这次触发的绝对计数值(在周期空间内)// 下一个绝对触发点 = 本次触发点 + 周期(取模 top)uint64_tnext=(uint64_t)fired_ticks+(uint64_t)period_ticks;uint32_tnext_ticks=(uint32_t)(next%top);printk("Alarm fired (absolute). now=%u next=%u\n",fired_ticks,next_ticks);alarm_cfg.ticks=next_ticks;alarm_cfg.flags=COUNTER_ALARM_CFG_ABSOLUTE;interr=counter_set_channel_alarm(dev,chan_id,&alarm_cfg);if(err){printk("re-arm failed: %d\n",err);}k_sem_give(&sem);}voidmain(void){conststructdevice*dev=DEVICE_DT_GET(TIMER);if(!device_is_ready(dev)){printk("counter not ready\n");return;}k_sem_init(&sem,0,1);period_ticks=counter_us_to_ticks(dev,1000000U);top=counter_get_top_value(dev);counter_start(dev);// 读取当前绝对计数值作为起点uint32_tnow;interr=counter_get_value(dev,&now);if(err){printk("get value failed: %d\n",err);return;}// 第一次触发点 = 当前值 + 周期(取模)uint32_tfirst=(now+period_ticks)%top;alarm_cfg.flags=COUNTER_ALARM_CFG_ABSOLUTE;alarm_cfg.ticks=first;// 绝对目标值alarm_cfg.callback=alarm_cb;alarm_cfg.user_data=&alarm_cfg;err=counter_set_channel_alarm(dev,0,&alarm_cfg);if(err){printk("set alarm failed: %d\n",err);}while(1){k_sem_take(&sem,K_FOREVER);// 与回调同步}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 20:07:08

tev图像查看器终极指南:让高动态范围图像处理变得简单高效

tev图像查看器终极指南&#xff1a;让高动态范围图像处理变得简单高效 【免费下载链接】tev High dynamic range (HDR) image viewer for graphics people 项目地址: https://gitcode.com/gh_mirrors/te/tev 在图形设计、游戏开发和视觉特效领域&#xff0c;处理高动态范…

作者头像 李华
网站建设 2026/4/27 1:08:03

木结构建筑元素识别与分类:基于Faster R-CNN的高精度检测方法

1. 木结构建筑元素识别与分类&#xff1a;基于Faster R-CNN的高精度检测方法 木结构建筑作为一种传统且环保的建筑形式&#xff0c;在当代建筑中仍然占有重要地位。随着计算机视觉技术的发展&#xff0c;利用深度学习技术对木结构建筑元素进行自动识别与分类&#xff0c;已成为…

作者头像 李华
网站建设 2026/4/24 3:43:40

重新定义笔记管理:为什么FSNotes成为效率工作者的首选

重新定义笔记管理&#xff1a;为什么FSNotes成为效率工作者的首选 【免费下载链接】fsnotes Notes manager for macOS/iOS 项目地址: https://gitcode.com/gh_mirrors/fs/fsnotes 在信息爆炸的时代&#xff0c;你是否也在为笔记管理的混乱而烦恼&#xff1f;FSNotes作为…

作者头像 李华
网站建设 2026/4/20 23:14:46

IBM 110亿美元收购Confluent完善混合云AI基础设施

IBM正押注110亿美元&#xff0c;认为实时数据基础设施将像数据库对企业应用一样&#xff0c;成为AI部署的关键要素。该公司刚宣布收购Confluent&#xff0c;将获得Apache Kafka商业平台的控制权。Kafka提供流式技术&#xff0c;为AI模型提供连续数据流&#xff0c;协调自主智能…

作者头像 李华
网站建设 2026/4/29 0:48:12

高性能数据存储实战指南:LevelDB在分布式系统中的深度应用

高性能数据存储实战指南&#xff1a;LevelDB在分布式系统中的深度应用 【免费下载链接】leveldb LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values. 项目地址: https://gitcode.com/GitH…

作者头像 李华
网站建设 2026/4/21 12:59:46

Boot镜像修复神器:Magisk Patcher深度使用指南

Boot镜像修复神器&#xff1a;Magisk Patcher深度使用指南 【免费下载链接】Boot.img修补工具-MagiskPatcher 本仓库提供了一个名为“Boot.img 修补工具 - Magisk Patcher”的资源文件。该工具主要用于修补有锁的BOOT镜像文件&#xff0c;帮助用户在需要的情况下对Boot.img进行…

作者头像 李华