news 2026/7/31 13:10:38

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/7/30 15:55:47

Wan2.2-T2V-A14B能否生成带有品牌LOGO的定制视频

Wan2.2-T2V-A14B能否生成带有品牌LOGO的定制视频 在数字营销的战场上&#xff0c;每一秒都价值千金。你有没有遇到过这样的场景&#xff1a;市场部急着要一条新品发布的宣传视频&#xff0c;设计师还在熬夜改第八版分镜&#xff0c;而发布会倒计时已经进入48小时&#xff1f;&a…

作者头像 李华
网站建设 2026/7/29 20:28:19

Wan2.2-T2V-A14B如何确保画面美学与艺术风格一致性?

Wan2.2-T2V-A14B如何确保画面美学与艺术风格一致性&#xff1f; 你有没有遇到过这样的情况&#xff1a;输入一段诗意的描述&#xff0c;比如“穿汉服的少女在落樱中起舞&#xff0c;光影柔和&#xff0c;色调统一为粉白与朱红”&#xff0c;结果生成的视频前两秒是水墨风&#…

作者头像 李华
网站建设 2026/7/30 10:42:39

构建高效计算机专业课记忆系统:模块化方法论指南

构建高效计算机专业课记忆系统&#xff1a;模块化方法论指南 【免费下载链接】CS-Xmind-Note 计算机专业课&#xff08;408&#xff09;思维导图和笔记&#xff1a;计算机组成原理&#xff08;第五版 王爱英&#xff09;&#xff0c;数据结构&#xff08;王道&#xff09;&…

作者头像 李华
网站建设 2026/7/31 10:16:50

探索 A*与 DWA 融合:小白也能懂的路径规划算法之旅

AStar搜索算法&#xff0c;A*和DWA算法融合&#xff0c;适合小白学习哦 程序效果如图所示最近在研究路径规划算法&#xff0c;发现 A*和 DWA 算法都各有千秋&#xff0c;要是把它们融合起来&#xff0c;那效果简直绝了。今天就来跟各位小白分享下这俩算法以及它们融合后的神奇之…

作者头像 李华
网站建设 2026/7/30 23:17:51

计算机毕设java校园志愿服务管理系统 基于Java的校园志愿活动信息化管理系统设计与实现 Java技术驱动的校园志愿服务管理平台开发

计算机毕设java校园志愿服务管理系统a9y349&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展&#xff0c;校园志愿服务管理的方式也在不断革新。传统的纸…

作者头像 李华
网站建设 2026/7/31 9:52:19

企业级可观测平台哪家好:全球6家智能可观测厂商实力排名

Gartner预测&#xff0c;到2027年&#xff0c;超过50%的企业将使用可观测性技术来优化业务决策&#xff0c;这一比例远高于2022年的不足20%。现代分布式架构、微服务、容器化和多云环境使得传统的监控手段已无法满足企业对系统状态全面洞察的需求。 面对市场上众多的可观测解决…

作者头像 李华