简述设备驱动、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)通常情况下是不需要中断处理的;
    中断的处理过程一般由硬件和软件两部分共同完成。实现的部分有:
    中断实现的两种方式,硬件实现还要软件实现方式的流程:

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

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

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

高级C语言教程-中断和设备驱动相关推荐

  1. linux iic设备中断,Linux设备驱动之I2C架构分析(一)

    Linux设备驱动之I2C架构分析 一:前言 I2c是philips提出的外设总线.I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL.正因为这样,它方便了工程人员的布线.另外,I2C是一种 ...

  2. 字符设备驱动高级篇3——自动创建字符设备驱动的设备文件

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.问题描述 使用mknod创建设备文件的缺点: 能否自动生成和删除设备文件: 2.解决方案:udev(嵌入式中用 ...

  3. 高级C语言教程-存储器和指针

    ATPCS即ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)的简称 回调函数 通常情况下函数的调用是用户的函数调用操作系统的函数,上层的函数调用底层 ...

  4. 高级C语言教程-编译链接调试

    编译器 一般认为所谓的编译就是将便于程序员编写.阅读.维护的高级计算机语言翻译为计算机能够解读.运行的低级机器语言的特定程序.编译器将源代码作为输入翻译生成使用目标语言的等价程序,事实上一般的C语言程 ...

  5. 高级C语言教程-关键字和运算符

    volatile 关键字 一个定义为volatile的变量会被意想不到的改变,这样编译器就不会假设这个变量的值了,精确的来说就是编译器在用到这个变量的时候必须每次都小心的重新读取这个变量的值,而不是使 ...

  6. 高级C语言教程-指针和存储

    讲一讲C语言中的值传递引用还有地址传递: 以下面的一段代码为例: void GetMemory(char *p) {p = (char *) malloc(100); } void Test(void ...

  7. 高级C语言教程-作用域

    C语言中一共有4中作用域:代码块作用域.文件作用域.函数作用域和原型作用域. 1.代码块的作用域,位域一对大括号中的所有语句构成一个代码块(Block)任何在代码块开始声明的标识符都具有代码块作用域, ...

  8. 高级C语言教程-sscanf()函数使用方式

    C语言支持可变参数的函数,这需要采用 #include <stdio.h>int main( void ) {char tokenstring[] = "15 12 14...& ...

  9. 高级C语言教程编码风格

    列表内容 每个C文件包含额头文件的顺序应该遵循先底层后上层的原则, ASIC-ii头文件 底层库头文件 操作系统头文件 应用程序头文件 2.利用括号来表示运算的优先顺序 每行语句单独一行,不要使用过长 ...

最新文章

  1. 杰思安全获数千万元A+轮投资,绿盟科技领投,德联资本跟投
  2. Android O: View的绘制流程(一): 创建和加载
  3. DAY77-Django框架(八)
  4. break 和 continue 语句, 以及循环中的 else 子句
  5. Oracle中的数据库对象
  6. Educoder Matplotlib和Seaborn 三维图 第一关绘制三维图
  7. 将Windows网络适配器共享网络的ip:192.168.137.1 改为其他IP
  8. Kafka分区与消费者的关系
  9. 火山PC_数据库知识_MySQL操作
  10. 解决矢量地图与卫星地图叠加有偏移的两种方法
  11. PHP IE下载时提示”无法复制 无法读取源文件或磁盘”的解决办法
  12. OpenCV读写视频(编解码器)
  13. 苹果怎么使用计算机,苹果系统电脑怎么用_超详细mac新手教程-win7之家
  14. python过滤违禁词_网站全站敏感词检测、广告违禁词查询很简单,一个python脚本轻松搞定...
  15. 图解 Python 编程(6) | 条件控制与if语句(附要点速查表·完结)
  16. 如何关闭计算机软件更新功能,如何关闭电脑自动更新功能
  17. Eclipse:source 1.5 中不支持 diamond 运算符
  18. NIO和BIO的比较
  19. 用户画像--用户标签
  20. 计算机管理找不到防火墙,win10系统防火墙服务找不到的具体方案

热门文章

  1. 程序员相亲记之准博士mm
  2. hdu 5491 The Next(数学模拟)
  3. hdu 5280(最大子串和变形,dp)
  4. hdu-4704 sum(费马小定理)
  5. 学委收作业神器-查未交同学
  6. NYOJ 741 数学家ST
  7. NYOJ 123 士兵杀敌(四)
  8. MyCAT+MySQL 搭建高可用企业级数据库集群
  9. 浅谈python异步IO,同步IO,线程与进程~
  10. SpringMVC源代码学习(一)从HTttpServletBean到DispatcherServlet