Linux内核定时器

news2024/9/21 12:22:12

1.概念

        在linux内核内部开发者设计了内核定时器,它的工作原理和硬件定时器一样,使用它不需要关注底层的实现,只需要分配定时器对象,初始化对象,启用定时器即可,当定时时间到达之后执行定时器的处理函数。

2.Linux内核定时器的频率

linux内核定时器的频率在内核的顶层目录下中.config文件指定,

指定的选项:CONFIG_HZ = 100

相当于内核节拍数数值变化1,需要10ms。(ubuntu数值增加1的时间是1ms)

3.jiffies变量

从内核启动开始,jiffies的数值就从0开始不停的增加,它记录的是内核的节拍数,增加的频率是由CONFIG_HZ指定

4.内核定时器的API

#include<linux/timer.h>
//定时器对象结构体
struct timer_list {
    struct hlist_node   entry;//构成链表
    unsigned long       expires;//设置的时间阈值   jiffies+CONFIG_HZ (定时1s)
    void            (*function)(struct timer_list *);//定时器处理函数的函数指针
    u32         flags;//缺省,填0
    };
1. 分配一个定时器对象
struct timer_list mytimer;

2.定时器对象的初始化
//定义一个定时器处理函数
void timer_function(struct timer_list *timer)
{
    
}
//设置时间阈值
mytimer.expires=jiffies+HZ;
//调用定时器对象初始化函数
timer_setup(&mytimer,timer_function,0);

3.将定时器对象注册进内核并启用定时器
void add_timer(struct timer_list *timer)
//通过这个函数只能启用一次定时器,当时间到了执行定时器处理函数
//再次启用定时器不能通过这个函数,否则内核会出现崩溃的现象

4.再次启用定时器
int mod_timer(struct timer_list *timer, unsigned long expires)

5.注销定时器对象
int del_timer(struct timer_list *timer)

5.实例

#include <linux/init.h>
#include <linux/module.h>
#include<linux/of.h>
#include<linux/of_gpio.h>
#include<linux/gpio.h>
#include<linux/timer.h>
/*  myleds{
    // &gpioe表示引用gpioe控制器,10表示管脚是gpioe10  0表示默认状态
    led1= <&gpioe 10 0>;
   led2= <&gpiof 10 0>;
   led3= <&gpioe 8 0>;
 };
 };*/

 struct device_node *node;
 struct gpio_desc *desc;
 //给定时器对象分配空间
 struct timer_list mytimer;

 //定时器处理函数
 void timer_function(struct timer_list *timer)
{
    gpiod_set_value(desc,!gpiod_get_value(desc));//让灯对应的引脚状态值取反
    //再次启用定时器
    mod_timer(timer,jiffies+HZ);
}

static int __init mycdev_init(void)
{
 
    //通过名字获取设备树节点信息
    node=of_find_node_by_name(NULL,"myleds");
    if(node==NULL)
    {
        printk("通过路径解析设备树节点信息失败\n");
        return -ENODATA;
    }
      printk("通过路径解析设备树节点信息成功\n");
      //获取gpio编号
    desc=gpiod_get_from_of_node(node,"led1",0,GPIOD_OUT_LOW,NULL);
    if(IS_ERR(desc))
    {
      printk("申请gpio编号失败\n");
      return PTR_ERR(desc);
    }
    printk("申请gpio编号成功\n");
   //定时器对象的初始化
   mytimer.expires=jiffies+HZ;//定时1s
   timer_setup(&mytimer,timer_function,0);
   //将定时器对象添加到内核并且启用定时器
   add_timer(&mytimer);
     
     return 0;
}
static void __exit mycdev_exit(void)
{
  //将定时器对象注销
  del_timer(&mytimer);
   //灭灯
    gpiod_set_value(desc,0);
    //释放gpio编号
    gpiod_put(desc);

}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

Linux内核中断子系统

1.Linux内核中断架构图

 2.中断子系统相关API

1.解析设备树节点
通过路径、名字或者compatible都可以
2.从解析后的设备树节点中解析出软中断号
unsigned int irq_of_parse_and_map(struct device_node *dev,
                        int index)
功能:解析设备树节点得到软中断号
参数:
dev:设备树节点结构体指针
index:索引
返回值:成功返回中断号,失败返回0

3.注册要使用的中断
 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
        const char *name, void *dev)
功能:注册中断
参数:
irq:软中断号
handler:中断处理函数函数指针  //typedef irqreturn_t (*irq_handler_t)(int, void *);
    irqreturn_t irq_handler(int irqno,void *dev)
    {
        //中断处理函数 
        //   返回值:
        //IRQ_NONE:表示不是这个设备中断或者没有被处理
        //IRQ_HANDLED:表示中断成功被处理
    }
flags:中断触发方式
        IRQF_TRIGGER_RISING  :上升沿触发
        RQF_TRIGGER_FALLING   :下降沿触发
        IRQF_TRIGGER_HIGH      :高电平触发
        IRQF_TRIGGER_LOW      :低电平触发
        IRQF_SHARED            :共享中断
 name:注册中断时填写的名字
 dev:传递给中断处理函数的参数
 
 返回值:成功返回0,失败返回错误码
 
 4.注销中断
 void *free_irq(unsigned int irq, void *dev_id)
 参数:
 irq:软中断号
 dev_id:向中断处理函数传递的参数
 返回值:返回设备名

3.中断子系统设备树

3.1按键中断的硬件连接图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年第十二届APMCM亚太地区数学建模竞赛1月加赛E题翻译以及思路

中文2022年亚洲及太平洋地区建模数学竞赛问题E有多少颗核弹可以摧毁地球&#xff1f;1945年8月6日&#xff0c;第二次世界大战已接近尾声。为了尽快结束战争&#xff0c;美国在日本广岛投下了名为 "小男孩" 的第二颗原子弹。这样一颗原子弹炸死了广岛的200000人&…

硬盘容量计算

硬盘容量&#xff08;Hard drive capacity&#xff09;以兆字节&#xff08;MB&#xff09;或千兆字节&#xff08;GB&#xff09;为单位&#xff0c;主流硬盘容量为500G&#xff5e;2TB&#xff0c;影响硬盘容量的因素有单碟容量和碟片数量。许多人发现&#xff0c;计算机中显…

Java--面向对象经典练习题

文章内容 一、文字版格斗游戏 二、对象数组1 三、对象数组2 四、对象数组3 五、对象数组4 题目代码如下&#xff1a; 文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;再选定人物的时候(new对象的时候)&#xf…

(Java高级教程)第三章Java网络编程-第一节1:网络编程必备网络知识1之网络初识和网络协议

文章目录一&#xff1a;计算机网络基本概念二&#xff1a;计算机网络发展三&#xff1a;网络协议&#xff08;1&#xff09;生活中的协议&#xff08;2&#xff09;网络协议&#xff08;3&#xff09;协议是谁制定的注意&#xff1a;本节会总结一些必要的网络知识&#xff0c;便…

第03讲:HTTP操作之ElasticSearch映射操作

3.1.3、映射操作 有了索引库&#xff0c;等于有了数据库中的 database。 接下来就需要建索引库(index)中的映射了&#xff0c;类似于数据库(database)中的表结构(table)。 创建数据库表需要设置字段名称&#xff0c;类型&#xff0c;长度&#xff0c;约束等;索引库也一…

P11 PyTorch Momentum

参考&#xff1a; 关于梯度下降与Momentum通俗易懂的解释_ssswill的博客-CSDN博客_梯度 momentum 前言&#xff1a; P9讲梯度的时候&#xff0c;讲到过这种算法的梯度更新方法 这边重点讲解一下原理 Momentum算法又叫做冲量算法&#xff0c;其迭代更新公式如下&#xff1a; 实…

【Vue中使用Echarts】响应式布局flexible.js+rem适配方案

文章目录一、vue集成flexible方案第一种&#xff1a;在编译的时候自动转换(px2rem-loader)第二种&#xff1a;直接在写css样式的时候转换(cssrem)二、安装&配置lib-flexible.js三、安装插件cssrem一、vue集成flexible方案 先介绍几个基本的概念 px像素&#xff08;Pixel&…

LeetCode分类刷题---数组篇

刷题班数组1.二分查找704.二分查找35.搜索插入位置34.在排序数组中查找元素的第一个和最后一个位置。69.X的平方和367.有效的完全平方数2.移除元素27.移除元素283.移动零844.比较含退格的字符串977.有序数组的平方3.长度最小的子数组209.长度最小的子数组904.水果成蓝76.最小覆…

2023-01-05 长亭科技 Go 后端开发实习生二面

由于面试官前几天 &#x1f40f; 了&#xff0c;在 HR 面后补了技术二面&#xff0c;不过问得倒也不难&#xff0c;但还是记录下。 1、请做 3 ~ 5 分钟的自我介绍。 2、你说研究生的方向是漏洞挖掘和模糊测试&#xff0c;可以介绍一下吗&#xff1f; 3、简单介绍下缓冲区溢出漏…

2022年中国特色智能工厂领航制造业升级分析报告

易观&#xff1a;当前&#xff0c;新一轮的科技革命和产业变革正在重塑世界格局&#xff0c;科技创新也成为影响国家竞争力的决定性因素。在全球制造业格局重塑的过程中&#xff0c;智能工厂作为全球智能制造产业实践的示范标杆与标准载体&#xff0c;是引领全球制造业企业与工…

机器学习中的数学原理——逻辑回归

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——逻辑回归》&#xff01;什么是逻辑回归算法逻辑回归 (Logistic…

【信管6.3】成本挣值计算

成本挣值计算铺垫了那么久&#xff0c;不知道大家期待不期待。总算到了挣值计算这一课&#xff0c;这个名字很奇怪呀&#xff0c;什么叫做挣值&#xff1f;成本不就是我们的投资吗&#xff1f;这个挣值到底是要干嘛&#xff1f;带着这些疑问&#xff0c;我们就来看看挣值计算到…

2022全年度奶粉十大热门品牌销量榜单

随着居民收入水平的提升、消费观念的转变及健康饮食意识的逐渐增强&#xff0c;消费者对食品品质的要求也越来越高&#xff0c;奶粉市场也同样如此。当前&#xff0c;国内婴幼儿奶粉市场规模呈稳步增长态势&#xff0c;同时&#xff0c;“三孩政策”的发布实施&#xff0c;也利…

C++模板 - 提高编程

引言 本阶段主要针对C泛型编程和STL技术做详细的讲解&#xff0c;探讨C更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具&#xff0c;大大提高复用性 例如生活中的模板&#xff1a; 一寸照片模板&#xff1a; 模板的特点&#xff1a; 模板不可以直接使用&#…

制造业项目管理软件如何帮助企业做好项目费用管理?

在项目导向型制造型企业中&#xff0c;项目的成本管理与费用控制是企业进行项目评价与利润管控、指导市场选择和项目筛选的重要手段。而传统的手工管理模式下&#xff0c;制造企业管理层很难快速了解到哪些项目出现了延误、哪些项目发生了费用超支、哪些项目产生了变更等问题与…

C#,图像二值化(14)——全局阈值的最佳迭代算法及源代码

1、图像二值化 图像二值化是将彩色图像转换为黑白图像。大多数计算机视觉应用程序将图片转换为二进制表示。图像越是未经处理&#xff0c;计算机就越容易解释其基本特征。 二值化过程 在计算机存储器中&#xff0c;所有文件通常以灰度级的形式存储&#xff0c;灰度级具有从0…

欢迎来到,个人数据安全“世界杯”

2022年国际足联世界杯&#xff0c;巴西止步8强&#xff0c;克罗地亚挺到半决赛&#xff0c;阿根廷与法国双强对决最终阿根廷点球大战胜出……精彩纷呈的世界杯已经落幕&#xff0c;而我们因足球而起的激情和热爱不会消退。世界杯是属于每个人的&#xff0c;每个球迷在世界杯中都…

03-redis篇 架构设计之一: 主从复制

目录 第一篇: 主从复制 二. 实践操作 1. 准备工作 -> ps: 安装redis的文章: docker版 的redis安装 2. 制作docker镜像 -> 2.1 制作redis6379 -> 2.2 制作redis6380 -> 2.3 制作redis6381 3. 查看主镜像redis6379的ip地址 -> 3.1 IPAddress位置在这: …

【数据库数据恢复】mdb_catalog.wt文件丢失的MongoDB数据恢复案例

MongoDB数据库数据恢复环境&#xff1a; MongoDB数据库部署在一台虚拟机上&#xff0c;虚拟机操作系统为Windows Server2012。 MongoDB数据库故障&分析&#xff1a; 由于业务发展需求&#xff0c;需要对MongoDB数据库内的文件进行迁移&#xff0c;在MongoDB服务开启的状态…

内部排序:希尔排序

希尔排序&#xff0c;又称为“缩小增量排序”&#xff0c;是直接插入排序的优化。 对于直接插入排序&#xff0c;当待排记录序列处于正序时&#xff0c;时间复杂度可达O(n)&#xff0c;若待排记录序列越接近有序&#xff0c;直接插入排序越高效。希尔排序的思想正是基于这个点…