嵌入式 Linux 下 USB 驱动程序的研 究与开发 指导老师 郭卫锋 03 级软件 2 班 何瓛.

Slides:



Advertisements
Similar presentations
高校教师、高级项目经理 任铄 QQ : 第一章 操作系统引论 1.1 操作系统的目标和作用 1.2 操作系统的发展过程 1.3 操作系统的基本特性 1.4 操作系统的主要功能 1.5 OS 结构设计.
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
实用操作系统概念 张惠娟 副教授 1.
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
Chapter 6 時序.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
施耐德电气(中国)投资有限公司 运动控制部技术经理 李幼涵 高级工程师
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
OpenMP简介和开发教程 广州创龙电子科技有限公司
嵌入式系统课程简介 宋健建 南京大学软件学院 2004/02/10.
第二讲 搭建Java Web开发环境 主讲人:孙娜
R in Enterprise Environment 企业环境中的R
SVN服务器的搭建(Windows) 柳峰
辅导课程六.
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
Visual Studio Team System 简介
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
SPI驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
单元测试工具XUnit 任课老师:黄武 下午2时20分 25.
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
如何生成设备节点 广州创龙电子科技有限公司
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Windows 7 的系统设置.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
三:基于Eclipse的集成开发环境搭建与使用
程序设计工具实习 Software Program Tool
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
第四章 团队音乐会序幕: 团队协作平台的快速创建
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
Platform Builder使用介绍 WINCE系统应用开发流程说明 ACTION RDC 杨 涛 2005.Dec.3th
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
姚金宇 MIT SCHEME 使用说明 姚金宇
实验七 安全FTP服务器实验 2019/4/28.
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
临界区问题的硬件指令解决方案 (Synchronization Hardware)
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
一个实时嵌入式操作系统移植问题研究 报告人:荣峰华.
Presentation transcript:

嵌入式 Linux 下 USB 驱动程序的研 究与开发 指导老师 郭卫锋 03 级软件 2 班 何瓛

一 本课题设计(研究)的目的: 源代码开发的 Linux 以其自身的优势,吸引了众 多开发商的目光,成为嵌入式操作系统的新宠。 由于其源代码的开放,驱动的添加一般不用开 发者从头做起,主要是修改并编译相关驱动文 件,以适合自己需要。

二 目前设计(研究)中公认的重点与难点: 设备驱动属于 Linux 内核的部分,编写 Linux 设备驱动 需要有一定的 Linux 操作系统内核基础; 编写 Linux 设备驱动需要对硬件的原理有相当的了解, 大多数情况下是针对一个特定的嵌入式硬件平台编写 驱动的; Linux 设备驱动中广泛涉及到多进程并发的同步、互 斥等控制,容易出现 bug ; 由于属于内核的一部分, Linux 设备驱动的调试也相 当复杂。

设计(研究)中我所遇到的的重点与难点: 1. 尚且不太 熟悉嵌入式系统进行应用程序的开 发的工具与环境. 2. 开发者需要对嵌入式即插即用硬件设备有基 本的了解.

3 :若 USB 设备可以在任何时间点从系统中取 走(如 U 盘、 USB 读卡器、 MP3 或数码相机), 即使程序目前正在访问它。 USB 驱动程序必须 要能够很好地处理解决此问题,它需要能够切 断任何当前的读写,同时通知用户空间程序: USB 设备已经被取走。

三 Linux 上搭建 C/C++IDE 开发环境 1. 进行开发之前, 首先要有合适的开发环境. 而首先必须充 分地熟悉了 Redhat linux 操作系统. 2. 开发者可以使用 GLADE 做界面,用 emacs 或 vi 编辑 器 等等编辑程序,再用终端模拟器编辑开发项目。 GLADE 仍然不能算是一个 “ 集成开发环境 ”( 相比 VS STUDIO 来说 ) 。 而 Anjuta ,一种最近新兴的 Linux 开发环境, 可以将所有这些繁杂零散 的任务都在一个统一的、集成的、自然而然的环境下完成, 是 Linux 下 第一个正式的 IDE, 而非传统的记事本编辑器.

四 LINUX 下最基本的编译命令 运行 gcc Linux 中最重要的软件开发工具是 GCC 。 GCC 是 GNU 的 C 和 C++ 编译器。实际上, GCC 能够编译三种语言: C 、 C++ 和 ObjectC ( C 语 言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。 gcc 的主要选项 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些 特色,例如 asm 或 typeof 关键词。 -c 只编译并生成目标文件。 -DMACRO 以字符串 “1” 定义 MACRO 宏。 -DMACRO=DEFN 以字符串 “DEFN” 定义 MACRO 宏。 -E 只运行 C 预编译器。 -g 生成调试信息。 GNU 调试器可利用该信息。

五 流行的即插即用设备与硬件 PDIUSBD12 是一款性价比很高的 USB 器件, 虽然只支持 USB1.1 规 范, 但具备本地 DMA 直接传输能力, 可以将 uClinux 的驱动编译进系 统内核. 整个硬件框架如下 :

六 Linux 设备驱动之字符设备驱动程序 Linux 下的设备驱动程序被组织为一组完成不同任务的函 数的集合,通过这些函数使得 Windows 的设备操作犹如文 件一般。在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作, 如 open () 、 close () 、 read () 、 write () 等。 Linux 主要将设备分为二类:字符设备和块设备。字符设 备是指设备发送和接收数据以字符的形式进行;而块设备 则以整个数据缓冲区的形式进行。字符设备的驱动相对比 较简单。

六 Linux 设备驱动之字符设备驱动程序 驱动程序是内核的一部分,因此我们需要给其添加模块初始化函 数,该函数用来完成对所控设备的初始化工作,并调用 register_chrdev() 函数注册字符设备: static int __init gobalvar_init(void) { if (register_chrdev(MAJOR_NUM, " gobalvar ", &gobalvar_fops)) { //… 注册失败 } else { //… 注册成功 } }

六 Linux 设备驱动之字符设备驱动程序 与模块初始化函数对应的就是模块卸载函数,需要调用 register_chrdev() 的 " 反函数 " unregister_chrdev() : static void __exit gobalvar_exit(void) { if (unregister_chrdev(MAJOR_NUM, " gobalvar ")) { //… 卸载失败 } else { //… 卸载成功 } }

六 Linux 设备驱动编程中的阻塞与非阻塞 阻塞操作是指,在执行设备操作时,若不能获得资源,则 进程挂起直到满足可操作的条件再进行操作。非阻塞操作 的进程在不能进行设备操作时,并不挂起。被挂起的进程 进入 sleep 状态,被从调度器的运行队列移走,直到等待 的条件被满足。 在 Linux 驱动程序中,我们可以使用等待队列( wait queue ) 来实现阻塞操作。 wait queue 很早就作为一个基本的功能 单位出现在 Linux 内核里了,它以队列为基础数据结构, 与进程调度机制紧密结合,能够用于实现核心的异步事件 通知机制。等待队列可以用来同步对系统资源的访问.

六 设备驱动编程中的内存与 I/O 操作 每一种外设都是通过读写设备上的寄存器来进行的,通常 包括控制寄存器、状态寄存器和数据寄存器三大类,外设 的寄存器通常被连续地编址。根据 CPU 体系结构的不同, CPU 对 IO 端口的编址方式有两种: I/O 映射方式( I/O-mapped ) 内存映射方式( Memory-mapped )

六 Linux 设备驱动之并发控制 在驱动程序中,当多个线程同时访问相同 的资源时(驱动程序中的全局变量是一种 典型的共享资源),可能会引发 “ 竞态 ” ,因 此我们必须对共享资源进行并发控制。 Linux 内核中解决并发控制的最常用方法是 信号量

六 Linux 设备驱动之并发控制 与信号量相关的 API 主要有: 定义信号量 struct semaphore sem; 初始化信号量 void sema_init (struct semaphore *sem, int val); 该函数初始化信号量,并设置信号量 sem 的值为 val void init_MUTEX (struct semaphore *sem); 该函数用于初始化一个互斥锁,即它把信号量 sem 的值设置为 1 ,等同于 sema_init (struct semaphore *sem, 1) ; void init_MUTEX_LOCKED (struct semaphore *sem); 该函数也用于初始化一个互斥锁,但它把信号量 sem 的值设置为 0 ,等同于 sema_init (struct semaphore *sem, 0) ; 获得信号量 void down(struct semaphore * sem); 该函数用于获得信号量 sem ,它会导致睡眠,因此不能在中断上下文使用; int down_trylock(struct semaphore * sem); 该函数尝试获得信号量 sem ,如果能够立刻获得,它就获得该信号量并返回 0 ,否则, 返回非 0 值。它不会导致调用者睡眠,可以在中断上下文使用。 释放信号量 void up(struct semaphore * sem); 该函数释放信号量 sem ,唤醒等待者。

六 异步通知 结合阻塞与非阻塞访问可以较好地解决设备的读 写,但是如果有了异步通知就更方便了。异步通 知的意思是:一旦设备就绪,则主动通知应用程 序,这样应用程序根本就不需要查询设备状态 驱动程序中调用 fasync() 函数,并在 write() 函数中 当数据被写入时,调用 kill_fasync() 函数激发一个 通知信号

七 定时器 Linux 内核中定义了一个 timer_list 结构: struct timer_list { struct list_head list; unsigned long expires; // 定时器到期时间 unsigned long data; // 作为参数被传入定时器处理函数 void (*function)(unsigned long); }; 那么就能在驱动开发中加以利用 增加定时器 void add_timer(struct timer_list * timer); 删除定时器 int del_timer(struct timer_list * timer);

谢谢老师