第6讲 嵌入式驱动程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Bourne Shell ----贝尔实验室开发; BASH-----GNU的OS默认的Shell; Korn Shell----兼容Bourne Shell 但有所发展 C Shell----Sun的Shell的BSD版本
Linux 文件结构
采用多级目录树结构
Linux实用工具
2. Linux操作系统结构图
内核模块不可选, 其它模块都为可 选
Windows CE 内核定制流程
对操作系统进行裁剪, 1. 对操作系统进行裁剪,配置上述各个 组件; 组件; 建立定制WinCE Image文件 WinCE的 文件; 2. 建立定制WinCE的Image文件; 如果目标系统本身也是定制的, 3. 如果目标系统本身也是定制的,就需 要开发OAL OAL层 OEM适配层 适配层) 要开发OAL层(OEM适配层)和该系统 WinCE加载程序 加载程序; 的WinCE加载程序; 将建立的Image文件下载到目标设备上, Image文件下载到目标设备上 4. 将建立的Image文件下载到目标设备上, 进行调试; 进行调试; 重复上述过程直到达到要求. 5. 重复上述过程直到达到要求. 在定制OS基础上,可发布SDK OS基础上 SDK供软件 6. 在定制OS基础上,可发布SDK供软件 开发者使用. 开发者使用.
6.3 嵌入式操作系统的驱动设计
设备驱动程序概述 Linux系统的驱动程序设计 WinCE系统的驱动程序设计
6.3.1
设备驱动程序概述
OS中设备驱动程序主要功能
探测设备和初始化设备 从设备接收数据并提交内核 从内核接收数据送到设备 检测和处理设备错误
OS中设备驱动程序分类
Linux操作系统
字符类型设备 块设备 网络设备
适用于紧急任务
要求立即执行.
抢占Hale Waihona Puke Baidu原则有:
优先权原则. 短作业(进程)优先原则. 时间片原则.
5. RTOS 抢占型内核的调度
RTOS内核对进程的控制调度原则
当有更高优先级的任务就绪时总能够得到一个CPU 的控制权
抢占过程:
当一个运行着的任务使一个比他的优先级高的任务 进入到就绪状态时,当前任务的CPU使用权就立即 被剥夺,或者叫挂起.而优先级高的进程立刻得到 CPU的控制权. 如果是中断服务子程序使一个高优先级的任务进入 到就绪态,当中断完成时,被中断的任务会被挂起, 而让高优先级进程先运行.
设备的打开与释放
用打开设备来完成设备的初始化准备
Include/linux/fs.h中file_operation结构的open(); Include/linux/fs.h中file_operation结构的open(); 结构的open()
Open()完成的工作: Open()完成的工作: 完成的工作
应用对硬件设备调用
内核根据设备类型和主设 备号调用相应的驱动 从用户态进入到内核态; 从用户态进入到内核态; 驱动判断此设备号, 驱动判断此设备号,完成 对相应硬件的操作. 对相应硬件的操作.
2. Linux设备驱动程序结构
设备驱动的接口
与OS内核的接口 OS内核的接口
./include/linux/fs.h中的file_operations数据结构来完成 ./include/linux/fs.h中的file_operations数据结构来完成 中的file_operations
中断是最有效的响应方法
硬件在需要的时候想内核发出中断信号; 硬件在需要的时候想内核发出中断信号; 内核通过驱动注册过的中断, 内核通过驱动注册过的中断,把硬件中断信息传递 给相应的设备驱动; 给相应的设备驱动; 对中断资源请求在驱动初始化时已完成; 对中断资源请求在驱动初始化时已完成; 如何将中断发送给CPU取决于体系结构. CPU取决于体系结构 如何将中断发送给CPU取决于体系结构.
设备驱动 程序
3. Linux的内核编译方法
三条命令来进行配置内核:
Make config (文本界面方式) Make menuconfig (文本界面 菜单驱动) Make xconfig (图形界面方式)
文件系统 Jffs2与Extfs
Jffs2文件系统具有更好的崩溃恢复机制
3. Linux的内核编译方法
6.3.2
Linux系统的驱动程序设计
1. Linux的设备文件
硬件设备看作普通文件,用标准调用接口来完 成文件的打开关闭,读写控制.
都用open()打开,read()和write()读写; 驱动主要任务就是实现这些系统调用函数.
设备文件的设备号
主设备号: 次设备号:
标识设备种类, 使用的驱动程序 标识同一驱动的 不同硬件设备
先检查设备错误,如设备未准备好等错误; 先检查设备错误,如设备未准备好等错误; 第一次打开要初始化硬件设备; 第一次打开要初始化硬件设备; 识别次设备号,更新读写操作当前位置指针f_ops; 识别次设备号,更新读写操作当前位置指针f_ops; 分配和填写要放在file >private_data中断数据 计数器增1 file中断数据, 分配和填写要放在file->private_data中断数据,计数器增1.
第6讲 嵌入式驱动程序设计
第6讲 嵌入式驱动程序设计 讲
6.1 嵌入式操作系统 6.2 嵌入式操作系统的内核编译 4.3 嵌入式操作系统的驱动设计
6.1 嵌入式操作系统
1. 嵌入式操作系统的特点
嵌入式OS应该
编码体积小 面向应用,可裁剪,可移植 实时性强 高可靠性
2. RTOS需求背景
是指系统能及时(或即时)响应外部事件的请 求,在规定的时间内完成对该事件的处理, 并控制所有实时任务协调一致地运行. 实时系统应用需求
内核可以编译成三种形式:
Vmlinux Image zImage (无压缩可执行文件) (压缩文件) (自解压压缩文件)
映像文件的生成
Mkfs.jffs2工具
6.2.2 Window CE的内核定制
Windows CE 的内核模块组成
Windows CE 内核模块功能
内核 持久存储 图形与多媒体 进程间通信 通信服务 安全服务 用户界面服务 Internet服务 Internet服务
6.2 嵌入式操作系统的内核编译
1. linux操作系统的内核编译 2. Window CE的内核定制
6.2.1 linux操作系统的内核编译
1. Linux OS 的组成
Linux 内核
实际上是从抽象资源操作到具体硬件操作细节之间的接口
Linux Shell
系统的用户界面,提供用户与内核进行交互的接口 Shell实际上是一个命令解释器.有如下主要Shell:
块设备的读写: 块设备的读写:
调用函数block_read() / block_write(); 调用函数block_read() block_write();
block_read() / block_write()
向设备请求表中增加读写请求, 向设备请求表中增加读写请求,让内核可对请求进 行优化; 行优化; 块读写是对内存缓冲区进行读写; 块读写是对内存缓冲区进行读写; 如果需要真正的从/向设备读/ 如果需要真正的从/向设备读/写,要使用结构 blk_dev_struct中的request_fn()来完成 中的request_fn()来完成. blk_dev_struct中的request_fn()来完成.
设备的控制操作 对设备除了读写,还需要控制; 对设备除了读写,还需要控制; 设备驱动中的ioctl() 函数完成控制功能: 设备驱动中的ioctl() 函数完成控制功能: 与设备密切相关, Ioctl() 与设备密切相关,需具体分析
设备的轮询与中断 中断处理与轮询查询
不支持中断的硬件设备读写时要轮询设备状态; 不支持中断的硬件设备读写时要轮询设备状态; 内核定期查询对CPU资源是个浪费; CPU资源是个浪费 内核定期查询对CPU资源是个浪费; 定时器轮询. 定时器轮询.
实时控制. 实时信息处理.
3. RTOS的特点
实时为其主要特征. RTOS系统中必须支持优先级操作.实时系统 下的每一个任务都必须有一个优先级 真正的实时系统是指基于优先级的抢占式操作 系统.
非抢占调度方式(Non-preemptive Mode) 抢占调度方式(preemptive Mode)
4. 抢占调度方式
时钟
驱动程序很多地方都要使用时钟.OS应为驱动程序提供定时 驱动程序很多地方都要使用时钟.OS应为驱动程序提供定时 机制.一般是在超过预订时间后回调注册的时钟函数. 机制.一般是在超过预订时间后回调注册的时钟函数.
OS中设备驱动程序的调用
Linux
采用内核模块机制 驱动模块没有编译到内核 模块中 模块的插入与卸载
Insmod rmmod
WinCE
驱动程序通常被编译成动 态链接库DLL DLL, 态链接库DLL,进行动态 加载. 加载. 驱动的安装: 驱动的安装:
连接WinCE设备; 连接WinCE设备; WinCE设备 将设备驱动程序的dll dll文件 将设备驱动程序的dll文件 拷贝到Windows目录下; Windows目录下 拷贝到Windows目录下; 在注册表中创建相应的项, 在注册表中创建相应的项, 填入键值. 填入键值.
已注册的硬件设备的主设备号在/proc/devices查看
1. Linux的设备文件
设备驱动源代码分布
/drivers/block: /drivers/char: /drivers/cdrom: /drivers/pci: /drivers/scsi: /drivers/net: /drivers/sound:
设备的注册与注销 注册
为设备赋予一个主设备号; 为设备赋予一个主设备号; Fs/devices.c中的 中的register_chrdev()函数,或 函数, 中的 函数 Fs/block_dev.c的register_blkdev()函数. 函数. 的 函数
注销
释放主设备号; 释放主设备号; Fs/devices.c中的 中的unregister_chrdev()函数,或 函数, 中的 函数 Fs/block_dev.c的unregister_blkdev()函数. 函数. 的 函数
与系统引导的接口
利用驱动程序对设备进行初始化; 利用驱动程序对设备进行初始化;
与设备的接口
描述驱动如何与设备进行交互,与具体设备密切相关. 描述驱动如何与设备进行交互,与具体设备密切相关.
2. Linux设备驱动程序结构
设备驱动的功能
驱动的注册与注销 设备的打开与释放 设备的读写 设备的控制; 设备的控制; 设备的中断和轮询处理
System Call Interface(POSIX.1),shell, GUI, Compiler, Library, etc.
Modules Linux Kernel Device Drivers
CPU Disk
2. Linux操作系统结构图
进程管理 存储器 管理
虚拟文件 管理 网络 协议栈
释放设备
file_operation结构的release(); file_operation结构的release(); 结构的release() Release()的操作与 的操作与open() 相反. Release()的操作与open() 相反.
设备的读写操作 字符设备的读写
直接使用函数read()/write(); ; 直接使用函数
WinCE系统设备驱动 模型
流接口驱动 本地设备驱动
OS中设备驱动程序的特点
读 /写
每个驱动程序要复制本设备的读/写操作.OS定义好读/ 每个驱动程序要复制本设备的读/写操作.OS定义好读/写接 定义好读 再由驱动程序完成具体的功能. 口,再由驱动程序完成具体的功能.
中断
操作系统必须提供驱动程序相应中断的能力, 操作系统必须提供驱动程序相应中断的能力,一般是将一个 中断处理程序注册到系统中.OS在硬件中断发生后 在硬件中断发生后, 中断处理程序注册到系统中.OS在硬件中断发生后,调用驱 动程序进行处理. 动程序进行处理.
驱动注册过的中断信息
中断例程与中断号通过注册已被记录, 中断例程与中断号通过注册已被记录,可在 /proc/interrupts查询 查询. /proc/interrupts查询.
相关文档
最新文档