本篇文章将介绍Linux设备驱动开发的基本知识linux系统驱动开发,带你快速剥开Linux驱动这团迷雾。文章分为如下3个小节进行讲解:
1、设备驱动的概念和作用;
2、在无操作系统和有操作系统的情况下设备驱动的设计开发;
3、Linux设备驱动的重点、难点和学习方式。
文章最后会给出一个简单的LED驱动在无操作系统和Linux操作系统下的实现示例。
好,Let'sgo
1、设备驱动的概念和作用
你们都晓得在Linux开发中是一个分层的思想,也就是说应用层、操作系统层、驱动层和硬件层分别独立,之后为上一层提供API插口。对设备驱动浅显一点的解释就是:驱使硬件设备行动。驱动与底层硬件直接打交道,根据硬件设备的具体工作方法,读写其寄存器,完成设备寻址、中断处理和DMA通讯等。设备驱动实际上充当了硬件和应用软件之间的纽带中标linux,在系统没有操作系统的情况下工程师可以按照硬件设备的特性自行定义插口,如对并口定义SerialSend()、SerialReceive(),对熔断器定义RelayOn()、RelayOff()等。而在有操作系统的情况下,驱动的构架则由操作系统定义,由于驱动构架也属于操作系统内核的一部份linux系统驱动开发,驱动工程师必须根据相应的构架设计驱动,这样的话驱动能够融入操作系统内核中,并正常运行。
2、在无操作系统和有操作系统的情况下设备驱动的设计开发
2.1、无操作系统的情况下
事实上,在许多情况下我们的程序也运行在无操作系统的环境中(裸机程序),由于对于这些功能比较单一、控制并不复杂的系统不须要多任务调度和文件系统等复杂的功能,用单任务构架完全可以挺好的实现我们的需求,也就是在一个无限循环(单片机编程中的while(1)死循环)中参杂着对设备中断的测量或则对设备的寻址。这一部份的知识相信有过单片机编程经验的同事一定十分熟悉了,下边是这些单任务软件的构架:
主函数
在这样的系统中,尽管不存在操作系统,并且设备驱动必须存在。通常情况下每一种设备驱动就会定义成一个软件模块sogou pinyin linux,包含.c文件和.h文件。
2.2、有操作系统的情况下
当包含操作系统时,我们还须要将驱动融入内核,为了实现这些融合,必须在所有设备的驱动中设计提供给操作系统内核的插口,这类插口由操作系统规定(这是一个复杂的过程,在后续更新的文章中会由浅及深的说明)。所以,存在操作系统的时侯,驱动便成为了联接硬件和Linux内核的桥梁。当设备成功注册到系统中,也就是让系统晓得了我们须要使用的设备的存在以后,Linux会将设备映射到文件系统的文件和目录中,之后通过系统调用的插口open()、write()、read()、close()等即可访问我们的设备。
3、Linux设备驱动的重点、难点和学习方式
Linux设备驱动的学习是一项艰深和长久的过程,其中包含了如下重点和难点:
1、编写Linux设备驱动要求工程师有一定的硬件基础;
2、编写Linux设备驱动要求工程师有特别好的C语言基础,能灵活的运用C语言的结构体、指针以及显存动态申请和释放等;
3、编写Linux设备驱动要求工程师有一定的Linux内核基础,并不要求对内核的各个部份有深入的研究,但起码我们要明白驱动程序与内核的插口;
4、编写Linux设备驱动要求工程师有多任务并发控制和同步的基础,由于在驱动中会大量的使用载流子锁、互斥、信号量和等待队列等并发与同步机制。
听到这儿,相信你早已对Linux设备驱动有了基本的认识,首先我们要明白,Linux驱动程序是门槛最高难度最大的一部份,其实薪水也是相对最高的,所以只要我们把握了方式坚持学习下去,一定可以剥开这团迷雾见到阳光。笔者会定期更新关于嵌入式Linux和C语言在开发和学习中的经验和方法。欢迎关注!
文章的最后,给出LED驱动在无操作系统和Linux操作系统下的实现示例,以供你们作以比较。LED通常直接由CPU的GPIO口控制,GPIO通常由两组寄存器控制,即一组控制寄存器和一组数据寄存器。控制寄存器可设置GPIO口的工作方法为输入或输出。当引脚被设置为输出时,向数据寄存器的对应位写入1和0分别在引脚上形成高电平和低电平;当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上的电平高低。
在无操作系统时的LED驱动如下:
上述程序中的LedInit()、LedOn()、LedOff()都直接作为驱动提供给应用程序使用。
在Linux下,我们使用字符设备驱动的框架来编撰对应于上图中的LED驱动程序,为了遵守Linux编程的命名习惯,重新将其命名为led_init()、led_on()、led_off(),注意:你如今并不须要才能看懂右图中的那些代码,我在后续的文章更新中会继续讲解说明。
Linux操作系统下的LED驱动程序:
在这儿,我们只须要有一个感性的认识即可,那就是上图中陌生的结构和元素都是Linux内核为设备定义的,在前面的学习中,我们只须要会使用即可(都是套路)。