当前位置: 首页 > news >正文

76 模块编程之高精度定时器

前言

这个 主要是 最开始的时候了解驱动的时候, 看到的一系列的 case, 这里 来大致剖析一下 相关的道理

这些模块 是怎么和内核交互的, 内核的这些业务是怎么实现的 

这里主要是一个模块创建了一个 hrtimer, 然后 0.3秒后执行, 然后 在执行的过程中递归加入当前任务到下一次队列   

然后这里主要是设计了 模块来调用 timer 的相关系统函数, 以及 kthread 的相关知识  

 

 

测试用例

 

测试模块如下, 模块主要是来自于 某git仓库, 这里未记录信息, 感谢原作者 

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>#define MS_TO_NS(x) (x * 1E6L)static struct hrtimer hr_timer;
static int hr_timer_isr_count = 0;enum hrtimer_restart my_hrtimer_callback( struct hrtimer *timer )
{pr_info( "my_hrtimer_callback called (%ld).\n", jiffies );hr_timer_isr_count++;if(hr_timer_isr_count < 5){hrtimer_restart(&hr_timer);return HRTIMER_RESTART;}return HRTIMER_NORESTART;
}static int __init hr_timer_init(void)
{ktime_t ktime;unsigned long delay_in_ms = 200L;pr_info("HR Timer module installing\n");/**          * ktime = ktime_set(0, 200 * 1000 * 1000);*                   * 200 ms = 10 * 1000 * 1000 ns*                            */ktime = ktime_set( 0, MS_TO_NS(delay_in_ms) );hrtimer_init( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL );hr_timer.function = &my_hrtimer_callback;pr_info( "Starting timer to fire in %ldms (%ld)\n", \delay_in_ms, jiffies );hrtimer_start( &hr_timer, ktime, HRTIMER_MODE_REL );return 0;
}static void __exit hr_timer_exit(void)
{int ret;ret = hrtimer_cancel( &hr_timer );if (ret)pr_info("The timer was still in use...\n");hr_timer_isr_count = 0;pr_info("HR Timer module uninstalling\n");return;
}module_init(hr_timer_init);
module_exit(hr_timer_exit);MODULE_AUTHOR("e665106");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple hr-timer Module");
MODULE_ALIAS("a simplest module"); 

 

 

hrtimer_init 和 hrtimer_start

hrtimer_init 中主要是更新了 timer->base, timer->node

然后在 模块的外层 设置了 timer->function

 

hrtimer_start 主要是讲给定的 timer 放入 base

 

 

hrtimer_restart 

这是 module_init 中的第一次 hrtimer_start 的情况如下 

expires 为 1598515692970, 待执行函数为 my_hrtimer_callback

 

然后 这里是 my_hrtimer_callback 中调用 hrtimer_restart 到 hrtimer_start_range_ns 的情况如下 

可以看到的是 expires, function 均是一样, 是第一次调用的过期时间 

因此 这里 hrtimer_restart 的处理是 将原始 hrtimer 从队列中删除, 然后重新加进来 

 

hrtimer_restart 的实现如下 

可以看到的是 以绝对时间执行, 过期时间为 timer 本身的 过期时间, delta 有一些 稍许的计算调整

 

 

hr_timer 是在哪里执行的?

根据 timer 来确定, 这里执行的 timer 是我们上面的 my_hrtimer_callback  

 

 

 

 

 

http://www.lryc.cn/news/614064.html

相关文章:

  • 数据仓库知识
  • PBootcms网站模板伪静态配置教程
  • C++信息学奥赛一本通-第一部分-基础一-第2章-第5节
  • linux信号量和日志
  • 户外广告牌识别准确率↑32%:陌讯多模态融合算法实战解析
  • 【JMeter】调试取样器的使用
  • 易美教育荣膺“腾讯年度影响力国际教育品牌”双奖加冕,见证中国国际教育力量的崛起
  • 《论文阅读》传统CoT方法和提出的CoT Prompting的区分
  • 有鹿机器人:如何用±2cm精度重塑行业标准?
  • 综合项目记录:自动化备份全网服务器数据平台
  • excel 导出
  • Linux Shell:Nano 编辑器备忘
  • 影刀 —— 练习 —— 读取Excel的AB两列组成字典
  • flink闲谈
  • 锂电池保护板测试仪:守护电池安全的核心工具|深圳鑫达能
  • 基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解
  • 碰一碰NFC开发写好评php语言源码
  • Track Any Anomalous Object: A Granular Video Anomaly Detection Pipeline
  • DigitalProductId解密算法php版
  • 基于 Modbus TCP 的飞升 FSH-CF计量泵多段速控制优化研究
  • 如何将视频转为GIF格式,3大视频转为GIF工具
  • 使用Python将中文语音翻译成英语音频
  • 【软考架构】计算机网络中的IP地址表示和子网划分
  • 数据结构(六):树与二叉树
  • LLM驱动的数据分析组合(HoraeDB+Polars+Snorkel AI)
  • LabVIEW数字抽取滤波
  • seo-使用nuxt定义页面标题和meta等信息
  • 如何动态执行 JS 脚本
  • 机器学习概念2
  • [linux] Linux:一条指令更新DDNS