`
helloyesyes
  • 浏览: 1335164 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Linux驱动修炼之道-按键

阅读更多

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/04/02/6299363.aspx

按键程序使用了驱动的很多知识。有中断,阻塞,等待队列,linux设备驱动模型等。
使用中断处理的步骤是:

  1. 向内核注册中断
  2. 实现中断处理函数。

安装中断的函数是:

释放的函数:

这里主要是申请中断信号线,这是一个非常宝贵的资源。request_irq中的参数dev_id用于共享中断信号线的时候,因为需要中断处理的设备肯定比中断信号线多的,所以一旦某一个触发了中断,内核需要在这条中断线上寻找发生中断的设备,由于大家使用的中断号是一样的,所以通过dev_id来识别,dev_id是唯一的。使用完要注意释放着宝贵的资源。从下边的程序可以看到注册中断是在open的时候,为什么不在注册模块的函数中呢,因为如果是在注册函数中除非卸载模块,这样这个驱动会一直占用中断号,而自己可能不用,这样就白白浪费了宝贵的资源。
中断处理的函数原型是:

第一个参数是irq,第二个是dev_id,第三个是struct pt_reg *regs,很少用,它保存了处理器进入中断代码之前的处理器上下文快照。注意返回值,如果处理程序发现其设备的确需要处理,则应返回IRQ_HANDLED;否则,返回值应该是IRQ_NONE。

在读取的时候使用的是阻塞机制,也就是说如果用户程序获得不到数据,就阻塞。此时那个进程进入休眠状态,被CPU的调度器从运行队列搬到等待队列。Linux内核中阻塞是通过等待队列来实现的。在Linux中,一个等待队列通过一个“等待队列头(wait queue head)”来管理。等待队列头是一个类型为wait_queue_head_t的结构体,定义在<linux/wait.h>中。

可通过如下方法静态定义并初始化一个等待队列:

或者用动态的方法:

Linux内核中的休眠方式是使用wait_event宏,如下:

queue是等待队列头,condition是等待条件。如果condition为0,则进行阻塞;否则,不阻塞。wait_event_interruptible宏与wait_event宏的区别是wait_event_interruptible是可以被信号中断的。当进程休眠时,它将期待某个条件在未来成为真;当一个进程被唤醒时,它必须再次检测它所等待的条件的确为真。
用来唤醒等待队列的函数:

wake_up会唤醒等待在给定queue上的所有进程。wake_up_interruptible只会唤醒那些执行可中断休眠的进程。

用户测试程序:

Makefile:

效果:

观察效果图,有的时候是按1次,有的是2,3,7等,看看用户程序,那里一直在读,如果按键不按下,则没有任何输出,因为读取进程被阻塞了,如果安下在读后按的次数会被清零。那应该都显示1啊,因为驱动程序中每按一次,在中断程序中唤醒等待进程,然后读取函数中进行了清零,应该每次都为1。可是,进程被唤醒后从等待队列搬到运行队列,在运行队列需要排队的,也就是说,可能不会立即获得时间片,这样下次中断又进行了加1,所以。。。哈哈

分享到:
评论

相关推荐

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...

    linux驱动修炼之道-- 李万鹏

    《Linux驱动修炼之道》是李万鹏先生撰写的一本深入探讨Linux驱动程序开发的专业书籍,旨在帮助读者理解和掌握Linux系统下的驱动程序设计与实现。这本书的内容涵盖了从基础概念到高级技术,适合对嵌入式系统、Linux...

    Linux驱动修炼之道-platform

    标题和描述均提到了“Linux驱动修炼之道-platform”,这表明文章的主题聚焦于Linux平台驱动的开发,特别是关于如何理解和操作Linux内核中的platform子系统。平台(Platform)模型是Linux内核用于处理嵌入式系统中...

    Linux内核修炼之道-pdf版

    通过《Linux内核修炼之道》,读者不仅能够了解Linux的历史,还能掌握内核分析和驱动开发的技术,从而在Linux世界中游刃有余。这本书不仅是初学者的指南,也是资深开发者的参考资料,对于任何希望深入Linux内核的人来...

    GEC2440A linux 驱动程序项目按键-蜂鸣器-led

    GEC2440A linux 驱动程序项目按键-蜂鸣器-led GEC2440A linux 驱动程序项目按键-蜂鸣器-led GEC2440A linux 驱动程序项目按键-蜂鸣器-led GEC2440A linux 驱动程序项目按键-蜂鸣器-led

    《Linux设备驱动开发详解-基于最新的Linux4.0内核》源码

    《Linux设备驱动开发详解-基于最新的Linux4.0内核》是一本深入探讨Linux设备驱动程序开发的专业书籍,其源码提供了丰富的实践示例,帮助读者理解如何在Linux操作系统下编写和调试驱动程序。该书涵盖了从基础概念到...

    Linux驱动修炼之道

    《Linux驱动修炼之道》这本书是Linux驱动开发领域的经典之作,旨在帮助读者深入理解Linux内核驱动程序的原理和实现,从而提升在Linux系统中的驱动开发技能。以下将围绕标题、描述以及标签,详细阐述Linux驱动的相关...

    NVIDIA-Linux-x86-64-470.103.01.run GPU显卡驱动

    标题中的"NVIDIA-Linux-x86-64-470.103.01.run"是一款NVIDIA为Linux操作系统编译的GPU显卡驱动程序,专为64位x86架构设计。这款驱动主要用于提升GPU在Linux环境下的性能,确保图形处理单元(GPU)能够与操作系统顺畅...

    《Linux设备驱动开发详解-基于最新的Linux4.0内核》源码.zip

    《Linux设备驱动开发详解-基于最新的Linux4.0内核》是一本深入讲解Linux设备驱动程序开发的专业书籍,源码.zip文件包含了与书中的讲解密切相关的代码示例。Linux驱动开发是连接硬件与操作系统内核的重要桥梁,对于...

    NVIDIA-Linux-x86_64-440.82.run.zip

    《NVIDIA-Linux-x86_64-440.82.run.zip:Linux平台上的NVIDIA显卡驱动详解》 在计算机硬件领域,NVIDIA GPU(图形处理器)因其高性能和广泛支持而备受赞誉。对于Linux用户而言,正确安装和配置NVIDIA显卡驱动至关...

    Comfast CF-WU810N Linux驱动及安装说明.rar

    这款无线网卡在Linux上的驱动程序可能与Windows或Mac OS等其他系统不同,因为Linux是一个开源操作系统,其对硬件的支持需要特定的驱动来实现。 本压缩包"Comfast CF-WU810N Linux驱动及安装说明.rar"包含了适用于...

    NVIDIA-Linux-x86_64-470.63-vgpu-kvm.rar

    在安装过程中,首先需要下载并解压"NVIDIA-Linux-x86_64-470.63-vgpu-kvm.rar",其中包含的"NVIDIA-Linux-x86_64-470.63-vgpu-kvm.run"是一个自解压可执行文件,用于在Linux系统上安装vGPU驱动。在执行该文件前,...

    Linux设备驱动开发详解-基于最新的Linux4.0内核》配套代码.zip

    《Linux设备驱动开发详解-基于最新的Linux4.0内核》是一本深入讲解Linux设备驱动程序开发的专业书籍,配套代码存放在"learn-ldd-master-main"这个压缩包中,旨在帮助开发者理解并掌握在嵌入式Linux系统上编写驱动...

    LINUX内核修炼之道

    LINUX内核修炼之道完整版; 本书重点介绍Linux内核工作原理以及学习方法。将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次...

    linux驱动程序第一个驱动-按键点亮LED

    根据提供的信息,我们可以深入探讨如何在Linux环境下编写一个简单的驱动程序来实现通过按键操作来控制LED的亮灭。本篇文章将详细介绍如何构建这样一个驱动程序,包括必要的头文件、数据结构定义以及具体的函数实现。...

    ME909S-821 Linux驱动及说明

    【ME909S-821 Linux驱动及说明】主要涵盖了华为ME909S-821在Linux环境下的驱动程序,适用于不同版本的Linux操作系统,包括2.6版本以上的系统以及低于2.6版本的系统。该驱动程序是为了解决华为ME909S-821模块在Linux...

    raid 530-8i 驱动 linux 6.7

    raid 530-8i 驱动 linux 6.7

    《Linux内核修炼之道》精华版之方法论

    ### 《Linux内核修炼之道》精华版之方法论核心知识点解析 #### 一、前言及背景 《Linux内核修炼之道》是一本旨在帮助读者深入理解Linux内核技术的专业书籍。本书不仅包含了作者任桥伟对于Linux发展的回顾与展望,...

    COMFAST CF-WU810N驱动 rtl8188eu-master.zip

    在Linux操作系统中,设备驱动是连接硬件与系统的桥梁,对于无线网卡来说,合适的驱动程序是确保其正常工作的重要组成部分。本驱动包“rtl8188eu-master.zip”专门为COMFAST CF-WU810N设计,解决了Linux环境下对该...

Global site tag (gtag.js) - Google Analytics