《Linux 设备驱动开发详解(第2版)》——1.2 无操作系统时的设备驱动

1.2 无操作系统时的设备驱动

Linux 设备驱动开发详解(第2版)
并不是任何一个计算机系统都一定要运行操作系统,在许多情况下,操作系统都不必存在。对于功能比较单一、控制并不复杂的系统,譬如ASIC内部、公交车的刷卡机、电冰箱、微波炉、简单的手机和小灵通等,并不需要多任务调度、文件系统、内存管理等复杂功能,用单任务架构完全可以良好地支持它们的工作。一个无限循环中夹杂对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构,如代码清单1.1。

代码清单1.1 单任务软件典型架构

1 int main(int argc, char* argv[])
2 {
3  while (1)
4  {
5   if (serialInt == 1)
6   /*有串口中断*/
7   {
8    ProcessSerialInt(); /*处理串口中断*/
9    serialInt = 0; /*中断标志变量清0*/
10   }
11   if (keyInt == 1)
12   /*有按键中断*/
13   {
14    ProcessKeyInt(); /*处理按键中断*/
15    keyInt = 0; /*中断标志变量清0*/
16   }
17   status = CheckXXX();
18   switch (status)
19   {
20    ...
21   }
22   ...
23  }
24 }

在这样的系统中,虽然不存在操作系统,但是设备驱动则无论如何都必须存在。一般情况下,每一种设备驱动都会定义为一个软件模块,包含.h文件和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行驱动的具体实现。譬如,可以如代码清单1.2那样定义一个串口的驱动。

代码清单1.2 无操作系统情况下串口的驱动

1 /**********************
2  *serial.h文件
3  **********************/
4 extern void SerialInit(void);
5 extern void SerialSend(const char buf*,int count);
6 extern void SerialRecv(char buf*,int count);
7 
8 /**********************
9  *serial.c文件
10 **********************/
11 /*初始化串口*/
12 void SerialInit(void)
13 {
14  ...
15 }
16 /*串口发送*/
17 void SerialSend(const char buf*,int count)
18 {
19  ...
20 }
21 /*串口接收*/
22 void SerialRecv(char buf*,int count)
23 {
24  ...
25 }
26 /*串口中断处理函数*/
27 void SerialIsr(void)
28 {
29  ...
30  serialInt = 1;
31 }

其他模块想要使用这个设备的时候,只需要包含设备驱动的头文件serial.h,然后调用其中的外部接口函数。如我们要从串口上发送“Hello World”字符串,使用语句SerialSend(“Hello World”,11)即可。

由此可见,在没有操作系统的情况下,设备驱动的接口被直接提交给了应用软件工程师,应用软件没有跨越任何层次就直接访问了设备驱动的接口。驱动包含的接口函数也与硬件的功能直接吻合,没有任何附加功能。图1.1所示为无操作系统情况下硬件、驱动与应用软件的关系。

有的工程师把单任务系统设计成了如图1.2所示的结构,即设备驱动和具体的应用软件模块之间平等,驱动中包含了业务层面上的处理,这显然是不合理的,不符合软件设计中高内聚、低耦合的要求。

另一种不合理的设计是直接在应用中操作硬件的寄存器,而不单独设计驱动模块,如图1.3所示。这种设计意味着系统中不存在或未能充分利用可被重用的驱动代码。

时间: 2024-11-17 17:21:30

《Linux 设备驱动开发详解(第2版)》——1.2 无操作系统时的设备驱动的相关文章

《Linux 设备驱动开发详解(第2版)》——1.6 设备驱动Hello World:LED驱动

1.6 设备驱动Hello World:LED驱动 Linux 设备驱动开发详解(第2版)1.6.1 无操作系统时的LED驱动 在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O口)控制.GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器.控制寄存器可设置GPIO口的工作方式为输入或是输出.当引脚被设置为输出时,向数据寄存器的对应位写入1和0会分别在引脚上产生高电平和低电平:当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上的电平为高或低. 在本例子中,我们

《Linux 设备驱动开发详解(第2版)》——1.4 Linux设备驱动

1.4 Linux设备驱动 Linux 设备驱动开发详解(第2版)1.4.1 设备的分类及特点 计算机系统的硬件主要由CPU.存储器和外设组成.随着IC制作工艺的发展,目前,芯片的集成度越来越高,往往在CPU内部就集成了存储器和外设适配器.譬如,相当多的ARM.PowerPC.MIPS等处理器都集成了UART.I2C控制器.USB控制器.SDRAM控制器等,有的处理器还集成了片内RAM和Flash. 驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设),而不是针对CPU核.Linux

《Linux 设备驱动开发详解(第2版)》——1.3 有操作系统时的设备驱动

1.3 有操作系统时的设备驱动 Linux 设备驱动开发详解(第2版)1.2节中我们看到一个干净利落的设备驱动,它直接运行在硬件之上,不与任何操作系统关联.当系统中包含操作系统后,设备驱动会变得怎样? 首先,无操作系统时设备驱动的硬件操作工作仍然是必不可少的,没有这一部分,驱动不可能与硬件打交道. 其次,我们还需要将驱动融入内核.为了实现这种融合,必须在所有设备的驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备. 由此可见,当系统中存在操作系统

《Linux 设备驱动开发详解(第2版)》——导读

前言 本书第1版在2008年初出版以后,受到广大读者的支持和厚爱,累计销售1.6万册,从几年的市场和读者反馈看,在第1版中还存在一些不足,主要是以下几方面. 没有现成的开发环境,读者需要从头到尾构建,而构建需要花费很长的时间,许多时候会不成功,加之配套光盘中的实例没有Makefile,更加大了操作的难度. 没有配套的开发板,大量的基于S3C2410的实例读者身边如果没有可以直接运行的平台,就无法亲身体验这些驱动. 个别内容实用性不强或过于陈旧,也有个别知识点的讲解语言晦涩,读者不易理解,如pla

《Linux设备驱动开发详解 A》一一1.6 设备驱动Hello World:LED驱动

1.6 设备驱动Hello World:LED驱动 1.6.1 无操作系统时的LED驱动 在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O)口控制.GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器.控制寄存器可设置GPIO口的工作方式为输入或者输出.当引脚被设置为输出时,向数据寄存器的对应位写入1和0会分别在引脚上产生高电平和低电平:当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上的电平为高或低. 在本例子中,我们屏蔽具体CPU的差异,假设在GPIO_

《Linux设备驱动开发详解 A》一一1.3 有操作系统时的设备驱动

1.3 有操作系统时的设备驱动 在1.2节中我们看到一个清晰的设备驱动,它直接运行在硬件之上,不与任何操作系统关联.当系统包含操作系统时,设备驱动会变得怎样呢?首先,无操作系统时设备驱动的硬件操作工作仍然是必不可少的,没有这一部分,驱动不可能与硬件打交道.其次,我们还需要将驱动融入内核.为了实现这种融合,必须在所有设备的驱动中设计面向操作系统内核的接口,这样的接口由操作系统规定,对一类设备而言结构一致,独立于具体的设备.由此可见,当系统中存在操作系统的时候,驱动变成了连接硬件和内核的桥梁.如图1

《Linux设备驱动开发详解 A》一一

1.2 无操作系统时的设备驱动 并不是任何一个计算机系统都一定要有操作系统,在许多情况下,操作系统都不必存在.对于功能比较单一.控制并不复杂的系统,譬如ASIC内部.公交车的刷卡机.电冰箱.微波炉.简单的手机和小灵通等,并不需要多任务调度.文件系统.内存管理等复杂功能,用单任务架构完全可以良好地支持它们的工作.一个无限循环中夹杂着对设备中断的检测或者对设备的轮询是这种系统中软件的典型架构,如代码清单1.1所示.代码清单1.1 单任务软件典型架构 1?int main(int argc, char

《Linux设备驱动开发详解 A》一一3.1 Linux内核的发展与演变

3.1 Linux内核的发展与演变 Linux操作系统是UNIX操作系统的一种克隆系统,是一种类UNIX操作系统,诞生于1991年10月5日(第一次正式向外公布的时间),起初的作者是Linus Torvalds.Linux操作系统的诞生.发展和成长过程依赖着5个重要支柱:UNIX操作系统.Minix操作系统.GNU计划.POSIX标准和Internet. 1.?UNIX操作系统 UNIX 操作系统是美国贝尔实验室的Ken. Thompson和Dennis Ritchie于1969年夏在DEC P

《Linux设备驱动开发详解 A》一一1.1 设备驱动的作用

1.1 设备驱动的作用 任何一个计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁.硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑:软件则实现了具体应用,它按照各种不同的业务需求而设计,并完成用户的最终诉求.硬件较固定,软件则很灵活,可以适应各种复杂多变的应用.因此,计算机系统的软硬件相互成就了对方.但是,软硬件之间同样存在着悖论,那就是软件和硬件不应该互相渗透入对方的领地.为尽可能快速地完成设计,应用软