手机微网站怎么制作侧边导航条wordpress
2026/1/8 7:03:37 网站建设 项目流程
手机微网站怎么制作,侧边导航条wordpress,小制作小灯笼,柳州十一冶建设集团网站Zephyr 的 Counter 驱动支持“相对闹钟”和“绝对闹钟”两种触发语义。区别在于 struct counter_alarm_cfg 里的 flags 和 ticks 的含义。 关键结构体#xff1a; struct counter_alarm_cfg {counter_alarm_callback_t callback; //回调uint32_t ticks; //不同模式下含义不同…Zephyr 的 Counter 驱动支持“相对闹钟”和“绝对闹钟”两种触发语义。区别在于struct counter_alarm_cfg里的flags和ticks的含义。关键结构体struct counter_alarm_cfg { counter_alarm_callback_t callback; //回调 uint32_t ticks; //不同模式下含义不同见下 void *user_data; //给callback做回调参数 uint32_t flags; //标志闹钟模式 };常用标志位flagsalarm_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 0ticks表示从现在起ticks后触发相对当前计数值通常允许的最大延迟受计数器的拓展/回卷周期top以及驱动“保护期guard period”限制。使用情况需求是“每隔固定时长触发”周期性任务最简单且不需要考虑取模。注意不要累加延迟。参考代码实现通过信号量释放while循环阻塞1s触发一次#includezephyr/drivers/counter.hstaticstructcounter_alarm_cfgalarm_cfg;staticuint32_tperiod_ticks;staticstructk_semsem;staticvoidalarm_cb(conststructdevice*dev,uint8_tchan_id,uint32_tticks,void*user_data){structcounter_alarm_cfg*configuser_data;// 周期性固定相对延迟为 period_ticks不要累加// config.ticks period_ticks; 这个不用动interrcounter_set_channel_alarm(dev,chan_id,config);if(err){printk(re-arm failed: %d\n,err);}k_sem_give(sem);}voidmain(void){conststructdevice*devDEVICE_DT_GET(TIMER);// 你的计时器设备if(!device_is_ready(dev)){printk(counter not ready\n);return;}k_sem_init(sem,0,1);// 计算 1 秒对应的 ticksperiod_tickscounter_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.flags0;// 相对模式alarm_cfg.ticksperiod_ticks;// 相对延迟alarm_cfg.callbackalarm_cb;alarm_cfg.user_dataalarm_cfg;// 让回调能访问配置interrcounter_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_ABSOLUTEticks表示计数器周期空间内的绝对目标值比如“当计数值到 N 时触发”。使用情况需要保证你设置的下一个闹钟值落在[0, top)区间内。所以需要注意自己取模。如果不做取模传入的绝对值超出范围驱动一般会返回-EINVAL。如果计数器是向下计数你可以用原始硬件计数空间或把它转换成统一的“向上空间”但要一致。参考代码实现#includezephyr/drivers/counter.h#includezephyr/kernel.h#includezephyr/sys/printk.hstaticstructcounter_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 是这次触发的绝对计数值在周期空间内// 下一个绝对触发点 本次触发点 周期取模 topuint64_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.ticksnext_ticks;alarm_cfg.flagsCOUNTER_ALARM_CFG_ABSOLUTE;interrcounter_set_channel_alarm(dev,chan_id,alarm_cfg);if(err){printk(re-arm failed: %d\n,err);}k_sem_give(sem);}voidmain(void){conststructdevice*devDEVICE_DT_GET(TIMER);if(!device_is_ready(dev)){printk(counter not ready\n);return;}k_sem_init(sem,0,1);period_tickscounter_us_to_ticks(dev,1000000U);topcounter_get_top_value(dev);counter_start(dev);// 读取当前绝对计数值作为起点uint32_tnow;interrcounter_get_value(dev,now);if(err){printk(get value failed: %d\n,err);return;}// 第一次触发点 当前值 周期取模uint32_tfirst(nowperiod_ticks)%top;alarm_cfg.flagsCOUNTER_ALARM_CFG_ABSOLUTE;alarm_cfg.ticksfirst;// 绝对目标值alarm_cfg.callbackalarm_cb;alarm_cfg.user_dataalarm_cfg;errcounter_set_channel_alarm(dev,0,alarm_cfg);if(err){printk(set alarm failed: %d\n,err);}while(1){k_sem_take(sem,K_FOREVER);// 与回调同步}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询