首页 > 新闻中心> 广州校区 >正文

粤嵌概述嵌入式设备驱动,教你怎么“玩”转嵌入式开发

更新时间: 2018-11-08 14:16:10来源: 嵌入式

    一、设备驱动的作用
    对设备驱动最通俗的解释就是“驱使硬件设备行动”。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据。此可见,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。在系统中没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口,自己为函数命名。而在有操作系统的情况下,设备驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构设计设备驱动,这样,设备驱动才能良好地整合到操作系统的内核中。
    二、无操作系统的设备驱动
    并不是任何一个计算机系统都一定要运行操作系统,在许多情况下操作系统是不必要的。对于功能比较单一、控制并不复杂的系统并不需要多任务调度、 文件系统、 内存管理等复杂功能,用单任务架构完全可以很好地支持它们的工作。 一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构。如图:
嵌入式
    在这样的系统中,虽然不存在操作系统,但是设备驱动是必须存在的。一般情况下,对每一种设备驱动都会定义为一个软件模块,包含.h文件和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现。其他模块需要使用这个设备的时候,只需要包含设备驱动的头文件 serial.h ,然后调用其中的外部接口函数即可。
    由此可见,在没有操作系统的情况下, 设备驱动的接口被直接提交给了应用软件工程师, 应用软件没有跨越任层次就直接访问了设备驱动的接口。 设备驱动包含的接口函数也与硬件的功能直接吻合, 没有任何附加功能。如图:
嵌入式
    三、有操作系统的设备驱动
    操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的API,不再给应用软件工程师直接提供接口。
    首先,一个复杂的软件系统需要处理多个并发的任务,没有操作系统,想完成多任务并发是很困难的。其次,操作系统给我们提供内存管理机制。一个典型的例子是,对于多数含MMU的处理器而言,Windows、Linux等操作系统可以让每个进程都独立地访问4GB的内存空间。操作系统通过给设备驱动制造麻烦来达到给上层应用提供便利的目的。如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可使用统一的系统调用接口来访问各种设备。对于Linux 等操作系统而言, 应用程序通过 write()、read()等函数读写文件就可以访问各种字符设备和块设备,而不用管设备的具体类型和工作方式,
    四、linux设备驱动
    4.1设备的分类及特点
    计算机系统的硬件主要由CPU、存储器和外设组成。目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS等处理器都集成了UART、I2C控制器、USB控制器、SDRAM控制器等,有的处理器还集成了片内 RAM 和 Fl ash 。驱动针对的对象是存储器和外设(包括 CPU 内部集成的存储器和外设) ,而不是针对 CPU 核。Linux 将存储器和外设分为 3 个基础大类:
    字符设备;
    块设备;
    网络设备
    字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和块设备并没有明显的界限,如Flash设备符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问。字符设备和块设备的驱动设计呈现出很大的差异,但是对于用户而言,他们都使用文件系统的操作接口open()、close()、read()、write()等函数进行访问。在 Linux 系统中,网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。 内核与网络设备的通信和内核与字符设备、 块设备的通信方式完全不同。
    4.2Linux设备驱动与整个软硬件系统的关系除网络设备外,字符设备与块设备都被映射到Linux文件系统的文件和目录,通过文件系统的系统调用接口open()、write()、read()、close()等函数即可访问字符设备和块设备。所有的字符设备和块设备都被统一地呈现给用户。块设备比字符设备复杂,在它上面会首先建立一个磁盘/Flash 文件系统, 如 F AT、 Ext3、 Y AFFS、JFFS 等。F AT、Ext3、Y AFFS、JFFS 规范了文件和目录在存储介质上的组织。
    应用程序可以使用 Linux 的系统调用接口编程,也可以使用 C 库函数,出于代码可移植性的考虑,后者更值得推荐。C 库函数本身也通过系统调用接口而实现,如 C库函数中的 fopen()、 fwrite()、 fread()、 fclose()分别会调用操作系统 API 的 open()、 write()、read()、close()函数。
嵌入式
    4.3编写 Linux 设备驱动的技术基础
    编写 Linux 设备驱动要求工程师具有良好的硬件基础,懂得 SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB 等设备的接口,轮询、中断、DMA 的原理,PCI 总线的工作方式以及 CPU 的内存管理单元(MMU)等。
    编写 Linux 设备驱动要求工程师具有良好的 C 语言基础, 能灵活地运用 C 语言的结构体、指针、函数指针及内存动态申请和释放等。
    编写 Linux 设备驱动要求工程师具有一定的 Linux 内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要了解设备驱动与内核的接口,尤其是对于块设备、网络设备、Flash 设备、串口设备等复杂设备。
    编写 Linux 设备驱动要求工程师具有良好的多任务并发控制和同步的基础,因为在设备驱动中会大量使用自旋锁、互斥、信号量、等待队列等并发与同步机制。

免费预约试听课

推荐阅读