高级C语言教程-中断和设备驱动

简述设备驱动、Boot Loader与BSP之间的区别!
设备驱动是介于底层硬件与操作系统之间的一层软件。设备驱动的主要功能就是屏蔽硬件控制的具体细节,对操作系统提供一个抽象的、统一的硬件资源访问接口。
Boot Loader的概念。Boot Loader是一段固化在嵌入式系统目标系统ROM(或者诸如Flash等非易失性存储器)中的一段程序,他的主要作用就是引导操作系统(这也是为什么叫他Boot Lodaer 的原因)。
BSP,所谓的板级支持包类似于PC平台上的BIOS(BasicInputOutput System,基本输入输出系统)。一般而言,BSP也是一段固化在嵌入式系统目标目标系统ROM中的程序。
在UNIX系统中将文件抽象为字符流(Byte Sream),所谓的文件就是一个可以输入/输出的字符流。设备也可以被抽象为字符流,用户对这个设备的读和写可以抽象为对这个字符流的读和写,将所有对设备的操作都抽象为对文件的操作,这样做的好处就是;
第一,将设备和文件统一有利于操作系统的管理,实际上很多的外围的设备天然的和文件系统相关,比如磁盘驱动器,CF卡等,第二,不同的设备被抽象为文件,便于操作系统采用统一的方式管理不同的外为设备。
中断处理模块可能是设备驱动中最重要的部分之一,因为设备的异步特性,操作系统不可能采用轮询的方式,对设备进行管理,采用中断处理异步事件是唯一的选择。

设备驱动的中断处理程序主要包括

  1. 将设备的数据从硬件FIFO中读出来,并将数据存放到由设备驱动管理的软件接收缓冲区中,或者将需要发送给硬件设备数据从驱动管理的缓冲区写到硬件发送的FIFO中;
  2. 如果是由于硬件设备故障或者状态变化引起的中断,中断处理程序需要处理这些问题;
  3. 在处理基本的数据接收和发送工作之后,对于有操作系统的系统而言,中断处理程序需要通过调用一个系统调用的方式通知操作系统内核中断的发生,如果中断的发生**了操作系统中更高优先级的任务,OS内核将通过任务调度器将任务由当前任务切换到更高优先级任务,
    说明:并不是所有的外围设备驱动都需要中断处理程序,某些设备(如 LCD)通常情况下是不需要中断处理的;
    中断的处理过程一般由硬件和软件两部分共同完成。实现的部分有:
    中断实现的两种方式,硬件实现还要软件实现方式的流程:

高级C语言教程-中断和设备驱动

  1. 虽然现在的RISC处理器的大多数指令可以在一个周期内完成,但是依然存在一些特殊的指令必须在多个周期才能完成而这些指令运行期间CPU是不接受中断请求的,比如ARM指令中的LDM和STM两类指令,这些指令是多装宅多存储指令。他们的执行时间取决于软件程序员希望通过一条指令保存多少数据,在最坏的情况下可能需要十几个周期才能完成。
  2. 几乎所有的处理器在相应中断期间都是关闭中断的,也就是说CPU相应某个中断请求的时候,硬件会自动的将程序状态字中的中断使能位清除(ARM处理器刚好相反在相应中断时硬件会自动的在CPSR中设置一位禁止中断位),硬件之所以这样设计是为了防止CPU相应一个中断期间又进入另一个中断进而造成中断现场保存的混乱。总之默认情况下CPU相应中断之后不会在接受新的中断,也就是不支持中断的嵌套,CPU只有从该中断处理程序中退出之后才可能相应新的中断,虽然,在CPU完成中断现场保护工作之后,程序员可以通过软件重新打开中断以接收中断嵌套,但是在通常的情况下,操作系统的任务调度只能发生在外层中断返回时,对于嵌套的中断返回将不会发生在任务调度。

可重入函数和不可重入函数

可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。