当前课程知识点:嵌入式系统设计 >  第五章:嵌入式Linux驱动开发 >  5.1 Linux 设备驱动技术 >  Video

返回《嵌入式系统设计》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《嵌入式系统设计》慕课在线视频列表

Video课程教案、知识点、字幕

首先看下Linux设备驱动的要点

Linux设备驱动程序是操作系统内核和硬件设备之间的接口

第二点,设备驱动程序为应用程序屏蔽了硬件的细节

在应用程序看来设备只是一个设备文件

可以像操作普通文件一样对硬件设备进行操作

设备驱动程序由一些私有数据和一组函数组成

是Linux内核的一部分

在这些要点中我们重点要清楚通过设备驱动

可以让设备变成一个设备文件

那么上层的应用调用这个设备只需要对文件进行操作

设备驱动程序的组成部分, 第一个是初始化配置程序

这个程序检测硬件存在与否,能不能正常工作

并对其进行初始化

第二个是I/O程序

用户空间函数通过I/O程序完成数据的通信

应用程序进行的系统调用由这部分来完成

也就是说,数据这部分由I/O程序这部分来完成

第三个,中断服务程序,它指的是硬件产生中断后

被内核调用的一段程序代码

大部分设备都是通过中断方式来实现的

因此,中断服务程序,是设备驱动程序的重要组成部分

Linux的设备分成了三类,第一类叫字符设备

这个设备是指一种可以当做字节流来存取的设备,比如说文件

这种驱动呢

常常要实现open、close、read和write系统调用

这种设备和普通文件还有一定的区别

体现在普通文件可以前后移动访问位置

但大部分字符设备只能顺序访问

第二类,块设备

块设备传送的是一个或多个长度是512字节的块

这个512字节实际上是指2的指数,有可能更大

块设备和字符设备的区别主要在内部数据管理的方式上

他们的访问方式实际上是差不多的

需要注意的是操作系统的文件系统必须安装在块设备上

第三类是叫网络设备

网络设备是与其他主机交换数据的设备或者接口

也就是说不是在本机之上

网络接口可能是硬件设备,也可能是一个纯粹的软件设备

比如说loopback接口

内核和网络设备驱动程序间的通信

完全不同于内核与字符及块设备之间的通信

它调用的是一套和数据包传输相关的函数

而不是标准的read、write等

在Linux下面呢,我们就是使用的socket机制

由于设备驱动,它常以内核模块的形式出现

因此我们来分析一下Linux的内核模块

一般Linux的内核模块包括以下几个部分

第一个模块的加载函数

通常在Linux下要使用命令insmod等等来装载模块

加载模块的时候呢,加载函数会自动的被内核执行

比如这个函数我们写好了之后,只要我们使用这个命令

那么内核就会执行加载

模块的加载函数必须以“module_init”函数来指定

第二个模块卸载函数

它的功能与模块加载函数刚好相反了

第三个模块的许可证声明

常见的就是GPL

第四个模块参数,装载的时候可以给它传一定的参数进去

这个就是模块参数的内容,这个是可选的

模块导出符号,应用于模块间的通讯

导出符号多是函数或者变量

这个是比较重要的,因为上层调用驱动的话

用的就是这些函数或者变量

第六个,作者信息声明,主要是作者的个人信息

在Linux驱动程序中,中断是一个非常重要的部分

下面看一下中断处理

Linux内核把中断服务程序分为两部分,上部分和下部分

上部分设计得短小精悍

大量复杂耗时的工作由下部分处理

这两部分不同的是,下部分是可中断的,上部分是不可中断的

也就是说下部分处理的并不是非常紧急的

与Linux驱动设备中断处理的相关API函数有request_irq()和free_irq()

我们重点关心的request中的有个参数

就是这一个,handler

这个回调函数实际上就是我们的中断处理程序

下面看一下并发控制的概念

并发指的两个以上执行单元同时、并行地执行

驱动程序里面往往它资源只有一个,而要两个同时去访问它的话

这个时候就会产生冲突

因此有第二个概念,叫互斥访问

指同一时刻有且只有一个执行单元可以访问共享资源

为了实现互斥访问,

在驱动程序中往往是使用临界区来访问共享资源

这个临界区实际上是一段程序代码

这个程序代码能够保证互斥访问

为了实现互斥就是避免竞争,必须互斥的访问共享资源

就需要某种互斥机制来保护临界区

这个互斥机制常见的就是自旋锁和信号量

自旋锁与信号量都是为了互斥访问

但是它们是有区别的

第一点自旋锁不会影响调用者休眠

也即是说自旋锁已经被别的执行单元保持的话

调用者就一直循环的查看

是否该自旋锁的保持者已经释放了该锁

这个自旋就是在原地打转

而信号量,它是引起调用者睡眠,也就是说当它发现

这个资源已经被别的任务占用的时候

它就把进程从运行队列上拖出去,除非获得锁

这就是和自旋锁不同的地方

不管是自旋锁还是信号量最多只能有一个保持者

因为资源是有限的,这就是他们的类似

一般而言自旋锁适合于保持时间非常短的情况

而信号量适合保持时间较长的情况

如果被保护的共享资源需要在中断上下文访问

就必须使用自旋锁

嵌入式系统设计课程列表:

第一章:嵌入式系统基础

-1.1 嵌入式系统概念

--Video

-第一章:嵌入式系统基础--1.1 嵌入式系统概念

-1.2 嵌入式系统组成

--Video

-第一章:嵌入式系统基础--1.2 嵌入式系统组成

第二章:嵌入式处理器

-2.1 嵌入式处理器发展历史

--Video

-第二章:嵌入式处理器--2.1 嵌入式处理器发展历史

-2.2 三星S3C2440 微处理器

--Video

-第二章:嵌入式处理器--2.2 三星S3C2440 微处理器

第三章:嵌入式操作系统

-3.1 嵌入式操作系统概述

--Video

-第三章:嵌入式操作系统--3.1 嵌入式操作系统概述

-3.2 嵌入式Linux 操作系统

--Video

-第三章:嵌入式操作系统--3.2 嵌入式Linux 操作系统

-3.3 Linux 操作系统实时性改造

--Video

-第三章:嵌入式操作系统--3.3 Linux 操作系统实时性改造

第四章:嵌入式软件开发平台

-4.1 基于Linux的开发流程

--Video

-第四章:嵌入式软件开发平台--4.1 基于Linux的开发流程

-4.2 GCC 编译器

--Video

-第四章:嵌入式软件开发平台--4.2 GCC 编译器

-4.3 GDB 调试器

--Video

-第四章:嵌入式软件开发平台--4.3 GDB 调试器

第五章:嵌入式Linux驱动开发

-5.1 Linux 设备驱动技术

--Video

-第五章:嵌入式Linux驱动开发--5.1 Linux 设备驱动技术

-5.2 Linux 设备驱动程序

--Video

-第五章:嵌入式Linux驱动开发--5.2 Linux 设备驱动程序

第六章:嵌入式系统实验

-实验一:基于ARM的嵌入式Linux开发环境建立

--Video

-第六章:嵌入式系统实验--实验一:基于ARM的嵌入式Linux开发环境建立

-实验二:基于ARM的模块方式驱动程序实验

--Video

-第六章:嵌入式系统实验--实验二:基于ARM的模块方式驱动程序实验

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。