【linux-imx6ull-定时器与中断】

目录

  • 1. 前言
  • 2. Linux软件定时器
    • 2.1 内核频率选择
    • 2.2 重要的API函数
    • 2.3 Linux软件定时器的使用配置流程
  • 4. Linux中断
    • 4.1 简单中断使用
      • 4.1.1 简要说明
      • 4.1.2 重要的API函数
      • 4.1.3 中断的简要配置流程
    • 4.2. 中断的上半部和下半部
      • 4.2.1 tasklet实现下半部
      • 4.2.2 work实现下半部

1. 前言

   关于定时器和中断是我们老生常谈的外设,也是每一款单片机基本必备的基础外设,由于之前都是在裸机层面对单片机的定时器和中断进行,我之前也对IMX6ULL的裸机中断系统进行了简要的介绍,连接如下:linux-IMX6ULL中断配置流程,同样我也对IMX6ULL中的定时器进行了简要的分析和介绍,连接如下:linux-IMX6ULL-定时器-GPT-串口配置流程-思路,但是这次进行定时器的操作是在系统层面进行配置,和之前的思路不太一样,我们之前使用的PIT等硬件定时器,但是我在内核中使用的是软件定时器,这种定时器的基准是由硬件产生并通过底层层层上报给内核,我们可以通过内核图形化配置选择这个最终的定时器频率是多少,而且注意的是内核提供的定时器是没有自动重装的模式,我们每次打开一个定时器后,这个定时器结束后就没了,如果要周期性的触发类似中断的效果,就要不断的在定时器服务函数结束的末尾重新启动定时器,并给写入定时周期;

2. Linux软件定时器

2.1 内核频率选择

   我们可以在内核的图形化配置中选择定时器的基准频率,如下:

  我们也称为节拍率,这里我们选择100hz,当然这种选择是根据每个人的实际情况和硬件的性能进行选择的,如果选择1000hz,那么对于硬件来说进入定时器服务函数的频率就会更加频繁,处理负担也是近10倍的增加;
  Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0,jiffies 定义在文件 include/linux/jiffies.h 中,并且对于64位的jiffies而言我们不用考虑绕回的问题,但是对于32位的 jiffies我们就要考虑绕回的问题;

2.2 重要的API函数

  • 时间转换类
  1. int jiffies_to_msecs(const unsigned long j)
  2. int jiffies_to_usecs(const unsigned long j)
  3. u64 jiffies_to_nsecs(const unsigned long j)
  4. long msecs_to_jiffies(const unsigned int m)
  5. long usecs_to_jiffies(const unsigned int u)
  6. unsigned long nsecs_to_jiffies(u64 n)
  • 定时器初始化类
  1. void init_timer(struct timer_list *timer)
  2. void add_timer(struct timer_list *timer)
  3. int del_timer(struct timer_list * timer)
  4. int del_timer_sync(struct timer_list *timer)
  5. int mod_timer(struct timer_list *timer, unsigned long expires):重新激活定时器
  • 内核短延时类
  1. void ndelay(unsigned long nsecs)
  2. void udelay(unsigned long usecs)
  3. void mdelay(unsigned long mseces)

2.3 Linux软件定时器的使用配置流程

  定时器也相当于一个外设,我们是在驱动层面对定时器进行配置,因此我们的基础框架还是字符设备的那一套,总的来说就是在字符设备的基础上添加上我们的定时器配置,例如我们要控制LED定时的开启和关闭,那么对于我们而言我们只需在LED字符设备的基础上添加我们的定时器配置,一般定时器的配置流程如下:



  我们在文件操作函数中可以使用long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);对定时器的相关操作进行写入,当然用write应该也是可以实现这个功能的,不过这里有注意事项,用unlocked_ioctl这个函数进行写入定时器的功能时要进行宏定义:如下图所示:



4. Linux中断

4.1 简单中断使用

4.1.1 简要说明

  在裸机中对于中断是频繁使用的,在裸机中对中断的配置流程也是相对比较繁琐,例如要比如配置寄存器,使能 IRQ,注册中断服务函数 等等,详情可以参考我前言中的IMX6ULL的中断系统的介绍,这里我们已经用上了Linux操作系统,对于中断的使用就变得比较简单,Linux内核已经提供了比较完善的中断框架,我们只需要申请中断然后再注册中段服务函数即可,不需要一系列复杂的寄存器配置;这里就不进行一些理论的详细说明,我们已经再裸机中对中断的配置进行了底层的操控,对于Linux系统而言,就是通过一系列复杂的方式把底层这些内容给整合成了一个个框架,我们这里学习的就是linux中断配置框架;作为初学者过于深入的了解可能会适得其反;

4.1.2 重要的API函数

  获取中断号

  1. static inline int gpio_to_irq(申请的GPIO号):GPIO中断专用
  2. static inline unsigned int irq_of_parse_and_map(设备节点地址,int index):通用

  中断服务函数

  1. static irqreturn_t 中断函数名(int irq, void *dev_id)

  中断申请和释放

  1. request_irq(中断号, 中断函数名,中断触发方式,中断名字,向中断服务函数传入的结构体地址);
  2. free_irq(中断号,向中断服务函数传入的结构体地址);

4.1.3 中断的简要配置流程

  这里的中断简要配置思路就是:获取中断号->申请中断->编写中断服务函数,可以看到还是非常简单的,这里的字符驱动框架是正点原子的key按键驱动框架,加上中断的内容配置如下图:

   

4.2. 中断的上半部和下半部

  对于Linux系统而言,我们要求中断是快进快出,对于一些对时间要求比较严格和处理耗时短暂的程序我们可以放在中断函数中直接进行处理,这个过程称为中断的上半部,因此对于一些耗时的处理内容,我们如果把其直接放在中断函数中去处理,就与前面的中断快进快出的理念相违背,因此我们把这部分内容放到中断外面,中断里面只是起到通知的作用,这样我们就实现了中断的快进快出以及耗时处理内容也放在了中断外面进行处理,这个过程我们称为中断的下半部
  但是对于下半部我们想法很好,但是咋样实现这个通知的过程呢?如果想详细了解可以产靠内核源码,内核大神们以及把这一切都封装成立API,一般有三种方式,软中断、tasklet、工作队列等;

4.2.1 tasklet实现下半部

  主要就是在前面简单中断的基础上进行如下流程:

   
  每个步骤比较重要的API:

  1. 初始化tasklet:tasklet_init(&dev->irqkey[i].tasklet,调度的函数名,(unsigned long)dev);
  2. 中断服务函数中调度通知tasklet:tasklet_schedule(&dev->irqkey[0].tasklet);
  3. 调度的函数:static void 调度的函数名(unsigned long data)

4.2.2 work实现下半部

  使用work来实现下半部和tasklet是类似的,就是换个函数名,操作步骤都是一样的如下:

   

  1. 初始化work:INIT_WORK(&dev->irqkey[i].work,调度的函数名);
  2. 中断服务函数中调度通知work:schedule_work(&dev->irqkey[0].work);
  3. 调度的函数:static void 调度的函数名(unsigned long data)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【第9章】“基础工作流”怎么用?(图生图/局部重绘/VAE/更多基础工作流)ComfyUI基础入门教程

🎁引言 学到这里,大家是不是会比较纠结,好像还在持续学习新的东西,未来还有多少基础的东西要学习,才能正常使用ComfyUI呢? 这其实需要转变一个心态。 AI绘画还处于一个快速迭代的过程,隔三岔五的就会有很多新技术、新模型出现,ComfyUI目前同样处于一个快速更新的阶…

汇聚荣科技有限公司在拼多多评价上好不好?

汇聚荣科技有限公司在拼多多平台的评价如何,这是很多消费者在选择购买该公司产品时会关心的问题。通过深入分析,我们可以从多个维度来探讨这一问题。 一、产品质量 对于任何公司而言,产品的质量是其生存和发展的根本。根据用户反馈和相关评价…

CATIA P3 V5-6R 中文版软件下载安装 达索CATIA三维设计软件获取

CATIA的建模和装配能力堪称业界翘楚。其强大的建模工具能够轻松应对各种复杂的几何形状和结构,帮助设计师们快速构建出精准的产品模型。同时,装配模块则能够实现零部件的快速装配,大大提高了设计效率。 在分析和仿真方面,CATIA同样…

荣耀正式发布Magic V Flip,打造全形态折叠屏矩阵

6月13日,荣耀Magic V Flip科技时尚大秀在上海举行。作为荣耀旗下首款小折叠手机,荣耀Magic V Flip的问世标志着荣耀完成折叠屏全体系的最终部署,成为少数集齐现有各类折叠屏手机形态的品牌之一。 荣耀从消费者需求出发,以AI和折叠…

设计模式——建造者模式(生成器模式)

建造者模式(生成器模式) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图 用了建造者模式,那么用户就只需要指定需要构建的类型就可以得到它们,而具体构造的细节和过程不需要知道 概括地说,Bu…

智能宠物用品在美国需求旺盛,卖家需了解这些产品趋势

智能宠物用品在美国市场的需求确实旺盛,并且这一趋势在未来有望持续增长。这一趋势不仅反映了宠物主人们对于宠物关怀的日益加深,也展示了科技在日常生活中的广泛应用。 卖家在了解产品趋势时,需要关注以下四个方面: 一、智能宠物…

鲁教版八年级数学下册-笔记

文章目录 第六章 特殊平行四边形1 菱形的性质与判定2 矩形的性质与判定3 正方形的性质与判定 第七章 二次根式1 二次根式2 二次根式的性质3 二次根式的加减二次根式的乘除 第八章 一元二次方程1 一元二次方程2 用配方法解一元二次方程3 用公式法解一元二次方程4 用因式分解法解…

JDK8新特性【接口新特征、lambda语法、Supplier、Consumer、Function、Predicate】

目录 一、关于接口的新特性1.1 jdk1.8之前的接口重要特性1.2 JDK8以后代码演示 1.3 总结通过代码演示发现作用 二、Lambda表达式[重点]2.1 将匿名内部类写法改写为lambda写法2.2 语法特点能够写成lambda形式的的前提语法特征代码演示深入理解lambda 2.3 总结 三、函数式接口3.1…

FastAPI操作关系型数据库

FastAPI可以和任何数据库和任意样式的库配合使用,这里看一下使用SQLAlchemy的示例。下面的示例很容易的调整为PostgreSQL,MySQL,SQLite,Oracle等。当前示例中我们使用SQLite ORM对象关系映射 FastAPI可以与任何数据库在任何样式…

Vulnhub-DC-8

靶机IP:192.168.20.143 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 用nmap和wappalyzer收集下信息 发现是Drupal 7网站 dirsearch扫下目录 ┌──(root㉿kali)-[/home/kali/Desktop] └─# dirsearch -u http://192.168.20…

【Spring EL<二>✈️✈️ 】SL 表达式结合 AOP 注解实现鉴权

目录 🍻前言 🍸一、鉴权(Authorization) 🍺二、功能实现 2.1 环境准备 2.2 代码实现 2.3 测试接口 🍹三、测试功能 3.1 传递 admin 请求 ​ 3.2 传递普通 user 请求 🍻四、章末 &a…

eFuse电子保险丝,需要了解的技术干货来啦

热保险丝作为一种基本的电路保护器件,已经成功使用了150多年。热保险丝有效可靠、易用,具有各种不同的数值和版本,能够满足不同的设计目标。然而,对于寻求以极快的速度切断电流的设计人员来说,热保险丝不可避免的缺点就…

t265 jetpack 6 px4 ros2

Ubuntu22.04 realsenseSDK2和ROS2Wrapper安装方法,包含T265版本踩坑问题_ros2 realsense-CSDN博客 210 git clone https://github.com/IntelRealSense/librealsense.git 212 git branch 215 git tag 218 git checkout v2.51.1 219 git branch 265 git clone https://…

法考报名照片审核不通过?原因看过来

法考报名照片审核不通过?原因看过来👀

API工具--Apifox和Postman对比(区别)

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

Python 俄罗斯方块小游戏【含Python源码 MX_007期】

系统简介: 俄罗斯方块是一款经典的俄罗斯益智游戏,由苏联工程师阿列克谢帕基特诺夫(Alexey Pajitnov)于1984年创建。在游戏中,玩家需要操纵不同形状的方块,以水平移动和旋转的方式,使它们在屏幕…

Python学习从0开始——Kaggle时间序列002

Python学习从0开始——Kaggle时间序列002 一、作为特征的时间序列1.串行依赖周期 2.滞后序列和滞后图滞后图选择滞后 3.示例 二、混合模型1.介绍2.组件和残差3.残差混合预测4.设计混合模型5.使用 三、使用机器学习进行预测1.定义预测任务2.为预测准备数据3.多步骤预测策略3.1 M…

Pytorch安装

一、window 下载CUDA Driver nvidia-driver(NVIDIA驱动程序)是操作系统与NVIDIA GPU硬件之间的软件接口。它负责管理GPU硬件的操作、资源分配、性能优化等任务。CUDA依赖于NVIDIA的驱动程序,因为它需要与GPU硬件进行通信以执行并行计算任务。在使用CUDA进行开发时,确保安装了…

Qt多线程之moveToThread()函数

文章目录 一、moveToThread()执行后,当前代码线程没有改变。二、对象执行moveToThread()后,哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

基于改进下垂控制的微电网控制研究(matlab)

主要内容 该模型为simulink仿真模型,主要实现的内容如下: 模型比较全面,包括蓄电池、超级电容和光伏发电模块,同时包括阻性负载和冲击负载,能够较好的了解这些模块对于母线电压特性的研究。采用改进的下垂控制策略…