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

news2024/12/26 23:09:41

目录

  • 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)

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

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

相关文章

终结国企虚假贸易:监管闭环下的关系排查与风控增强

2024年5月28日,国务院正式公布《国有企业管理人员处分条例》(以下简称《条例》),将于2024年9月1日起施行。作为国家经济的重要支柱,国有企业的管理人员在企业运营中扮演着至关重要的角色,《条例》的颁布&am…

调用腾讯智能云实现车辆信息识别

目录 1. 作者介绍2. 算法介绍2.1 腾讯云介绍2.2 API介绍 3. 调用腾讯智能云实现车辆信息识别3.1 准备工作3.2 完整代码3.3 结果分析 1. 作者介绍 汤明乐,男,西安工程大学电子信息学院,2023级研究生 研究方向:机器视觉与人工智能 …

蓝牙BLE上位机工具开发理论线索梳理_3.WINRT Devices设备相关

1.WINRT关于Devices设备相关的命名空间 关于WINRT科以参考下面这篇博文学习理解。以下列出Devices设备相关的API命名空间。 理解WinRT - 厚积薄发 - C博客 Windows.Devices此命名空间提供对低级别设备提供程序的访问,包括 ADC、GPIO、I2 C、PWM 和 SPI。Windows.D…

提醒:网站使用微软雅黑字体的三种方式,两种侵权,一种不侵权。

大家都知道微软雅黑是windows系统的默认字体,但是不知道微软雅黑的版权归属方正字体,而且方正字体仅仅授权了微软在windows系统中使用该字体,脱离了windows使用,那是极易中招的,网页字体使用是前端开发的工作之一&…

【Python】教你彻底了解Python中的数据科学与机器学习

​​​​ 文章目录 一、数据科学的基本概念1. 数据收集2. 数据清洗3. 数据分析4. 数据可视化5. 机器学习 二、常用的数据科学库1. Pandas1.1 创建Series和DataFrame1.2 数据操作 2. NumPy2.1 创建数组2.2 数组操作 3. Scikit-learn3.1 数据预处理3.2 特征工程 三、数据预处理与…

随手记:商品信息过多,展开收起功能

UI原型图&#xff1a; 页面思路&#xff1a; 在商品信息最小item外面有一个包裹所有item的标签&#xff0c;控制这个标签的高度来实现展开收起功能 <!-- 药品信息 --><view class"drugs" v-if"inquiryInfoSubmitBtn"><view class"…

天降流量于雀巢?元老品牌如何创新营销策略焕新生

大家最近有看到“南京阿姨手冲咖啡”的视频吗&#xff1f;三条雀巢速溶咖啡入杯&#xff0c;当面加水手冲&#xff0c;十元一份售出&#xff0c;如此朴实的售卖方式迅速在网络上走红。而面对这一波天降的热度&#xff0c;雀巢咖啡迅速做出了回应&#xff0c;品牌组特地去到了阿…

PySpark特征工程(I)--数据预处理

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

交流负载箱的使用场景和应用范围是什么?

交流负载箱模拟实际用电设备运行状态的电力测试设备&#xff0c;主要用于对各种电气设备、电源系统、发电机组等进行性能测试、质量检验和安全评估。交流负载箱的使用场景和应用范围非常广泛&#xff0c;涵盖了电力、通信、能源、交通等多个领域。 1. 电力行业&#xff1a;在电…

什么是电脑监控软件?六款知名又实用的电脑监控软件

电脑监控软件是一种专为监控和记录计算机活动而设计的应用程序&#xff0c;它能够帮助用户&#xff08;如家长、雇主或系统管理员&#xff09;了解并管理目标计算机的使用情况。这些软件通常具有多样化的功能&#xff0c;包括但不限于屏幕捕捉、网络行为监控、应用程序使用记录…

北斗导航:让科技引领未来出行

北斗导航是中国自主研发的卫星导航系统&#xff0c;由一系列北斗卫星和地面控制平台组成。它的研发始于上世纪80年代&#xff0c;经过几十年的发展&#xff0c;如今已成为全球领先的卫星导航系统之一。北斗导航凭借其优秀的性能&#xff0c;为我们的出行提供了准确、可靠的定位…

Spring Boot + EasyExcel + SqlServer 进行批量处理数据

前言 在日常开发和工作中&#xff0c;我们可能要根据用户上传的文件做一系列的处理&#xff0c;本篇文章就以Excel表格文件为例&#xff0c;模拟用户上传Excel文件&#xff0c;讲述后端如何高效的进行数据的处理。 一.引入 EasyExcel 依赖 <!-- https://mvnrepository.com/…

数据预处理——调整方差、标准化、归一化(Matlab、python)

对数据的预处理&#xff1a; (a)、调整数据的方差&#xff1b; (b)、标准化&#xff1a;将数据标准化为具有零均值和单位方差&#xff1b;&#xff08;均值方差归一化(Standardization)&#xff09; (c)、最值归一化&#xff0c;也称为离差标准化&#xff0c;是对原始数据的…

Elasticsearch 第二期:倒排索引,分析,映射

前言 正像前面所说&#xff0c;ES真正强大之处在于可以从无规律的数据中找出有意义的信息——从“大数据”到“大信息”。这也是Elasticsearch一开始就将自己定位为搜索引擎&#xff0c;而不是数据存储的一个原因。因此用这一篇文字记录ES搜索的过程。 关于ES搜索计划分两篇或…

刷题笔记2:用位运算找“只出现一次的一个数”

1. & 和 | 的基本操作 137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 先对位运算的操作进行复习&#xff1a; 1、>> 右移操作符 移位规则&#xff1a;⾸先右移运算分两种&#xff1a; 1. 逻辑右移&#xff1a;左边⽤0填充&#xff0c;右边丢…

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…

Instagram涨粉六大秘籍:从零开始建立粉丝基础

Instagram已经从一个简单的社交分享平台演变成一个强大的营销工具&#xff0c;品牌和内容创作者利用它来吸引潜在客户并推广个人品牌。 随着全球超过13.5亿用户每日在Instagram寻找新的视觉灵感和最新潮流&#xff0c;如何在这个竞争激烈的环境中脱颖而出&#xff0c;有效增粉…

msvcp110.dll有什么解决方案,msvcp110.dll几种方法详细步骤教程

本文旨在探讨如何应对电脑出现 vcruntime140_1.dll 无法继续执行代码错误提示的问题。同时&#xff0c;将阐释该文件的作用&#xff0c;列举常见的错误问题&#xff0c;并提供一些在修复 vcruntime140_1.dll 时的注意事项&#xff0c;以避免在解决过程中引发其他问题。接下来&a…

界面控件DevExpress WinForms垂直属性网格组件 - 拥有更灵活的UI选择(一)

DevExpress WinForms垂直&属性网格组件旨在提供UI灵活性&#xff0c;它允许用户显示数据集中的单个行或在其90度倒置网格容器中显示多行数据集。另外&#xff0c;用户可以把它用作一个属性网格&#xff0c;就像在Visual Studio IDE中那样。 P.S&#xff1a;DevExpress Win…

meilisearch的索引(index)的最佳实践

官网的第一手资料学新技术&#xff1a;meilisearch官方文档 安装的官网地址&#xff1a;meilisearch安装的官网 部署在生产环境的指导&#xff1a;meilisearch部署在生产环境的指导 Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重…