嵌入式系统原理及应用教程第10章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《嵌入式系统原理及应用教程第10章.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统原理及应用教程第10章.ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式系嵌入式系统统原理及原理及应应用用教教程程主主讲内讲内容容第第8章章 嵌入式系嵌入式系统统Boot Loader技技术术第第9章章 嵌入式嵌入式Linux操作系操作系统统移植移植第第10章章 嵌入式嵌入式Linux设备驱动设备驱动程序程序开发开发第第11章章 嵌入式嵌入式Linux应应用程序用程序设计设计10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.1.1 嵌入式嵌入式Linux设备驱动设备驱动程序分程序分类类l静态静态加加载载的的驱动驱动程序程序l动态动态加加载载的的驱动驱动程序程序 Linux将设
2、备将设备按照功能特性按照功能特性划划分分为为三三种类种类型:字符型:字符设设备备,块设备块设备和和网络设备网络设备。10.1.2 最最简单简单的的内内核模核模块块1helloworld模模块块源代源代码码2模模块块的的编译编译3模模块块的加的加载载和卸和卸载载10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.2 嵌入式嵌入式Linux设备驱动设备驱动重要技重要技术术10.2.1 内内存存与与I/O端口端口(1)内内核空核空间间和用和用户户空空间间(2)内内核中核中内内存分配存分配内内核中核中获获取取内内存的几存
3、的几种种方式如下。方式如下。通通过伙过伙伴算法分配大片物理伴算法分配大片物理内内存存通通过过slab缓缓冲冲区区分配小片物理分配小片物理内内存存非非连续内连续内存存区区分配分配高端高端内内存映射存映射固定固定线线性地址映射性地址映射10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础(3)I/O端口端口 根据根据CPU体系体系结构结构的不同,的不同,CPU对对IO端口的端口的编编址方式址方式有有两种两种:I/O映射方式(映射方式(I/O-mapped)和)和内内存映射方存映射方式(式(Memory-mapped)。)。下面主要下面主要讨论讨论一下一下内内存映射方式存映射方式访问访问
4、I/O端口的方法,端口的方法,我我们称们称之之为为I/O内内存操作。存操作。l I/O 内内存存区区必必须须在使用前分配在使用前分配l I/O内内存映射存映射 l 访问访问I/O内内存存l 映射到用映射到用户户空空间间 10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.2.2 同步机制同步机制 Linux内内核中包含的同步机制包括:原子操作、信核中包含的同步机制包括:原子操作、信号号量(量(semaphore)、)、读写读写信信号号量(量(rw_semaphore)、)、自旋自旋锁锁(spinlock)、大)、
5、大内内核核锁锁(Big Kernel Lock,BKL)、读写锁读写锁(rwlock)、)、读读拷拷贝贝更新(更新(Read-Copy Update,RCU)和)和seqlock(顺顺序序锁锁)等。)等。10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础1.原子操作原子操作 原子操作主要用于原子操作主要用于实现资实现资源源计数计数,很多引用,很多引用计数计数(refcnt)就是就是通通过过原子操作原子操作实现实现的。的。原子原子类类型定型定义义如下:如下:typedef struct volatile int counter;atomic_t;原子操作通常用于原子操作通常用于实现
6、资实现资源的引用源的引用计数计数 2.信信号号量量 信信号号量在量在创创建建时时需要需要设设置一置一个个初始初始值值.3.读写读写信信号号量量 读写读写信信号号量有量有两种实现两种实现:l一一种种是通用的,不依是通用的,不依赖赖于硬件架于硬件架构构 l 一一种种是架是架构构相相关关的的10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础读写读写信信号号量的相量的相关关API有:有:DECLARE_RWSEM(name)该该宏宏声声明一明一个读写个读写信信号号量量name并对并对其其进进行初始化。行初始化。void init_rwsem(struct rw_semaphore*sem
7、);该该函函数对读写数对读写信信号号量量sem进进行初始化。行初始化。void down_read(struct rw_semaphore*sem);在在Linux中,每一中,每一个进个进程都用一程都用一个类个类型型为为task_t或或struct task_struct的的结构来结构来描述描述 10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础4.自旋自旋锁锁 一一个执个执行行单单元要想元要想访问访问被自旋被自旋锁锁保保护护的共享的共享资资源,必源,必须须先得到先得到锁锁,在,在访问访问完共享完共享资资源后,必源后,必须释须释放放锁锁。自旋自旋锁锁的的API有:有:spin_l
8、ock_init(x);10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.2.3 阻塞阻塞与与非阻塞非阻塞1.阻塞操作阻塞操作2.非阻塞操作非阻塞操作10.2.4 时间问题时间问题1.延延时时操作:操作:(1)长长延延时时。(。(2)短延)短延时时2.内内核定核定时时器器内内核提供核提供给驱动许给驱动许多函多函数来声数来声明、注明、注册册、以及去除、以及去除内内核定核定时时器。器。3.工作工作队队列列采用缺省工作者采用缺省工作者线线程程来实现来实现工作工作队队列列 的的API:INIT_WORK(_work,_func,_data)10.1 嵌入式嵌入式Linux驱动驱动程
9、序程序开发开发基基础础 int schedule_work(struct work_struct*work)int schedule_delayed_work(struct work_struct*work,unsigned long delay)void flush_scheduled_work(void)int cancel_delayed_work(struct work_struct*work)创创建自己的工作者建自己的工作者线线程和工作程和工作队队列,列,API:struct workqueue_struct*create_workqueue(const char*name)int
10、queue_work(struct workqueue_struct*wq,struct work_struct*work)int queue_delayed_work(struct workqueue_struct*wq,struct work_struct*work,unsigned long delay)void flush_workqueue(struct workqueue_struct*wq)void destroy_workqueue(struct workqueue_struct*wq)10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.2.5 中中断处断处理
11、理在在Linux系系统统里,里,对对中中断断的的处处理是理是属属于系于系统统核心部分,核心部分,因而如果因而如果设别与设别与系系统统之之间间以中以中断断方式方式进进行行数数据交据交换换,就必就必须须把把该设备该设备的的驱动驱动程序作程序作为为系系统统核心的一部分。核心的一部分。设备驱动设备驱动程序通程序通过调过调用用request_irq函函数来数来申申请请中中断断,通通过过free_irq来释来释放中放中断断。它们它们被定被定义为义为:#include int request_irq(unsigned int irq,void(*handler)(int irq,void dev_id,st
12、ruct pt_regs*regs),unsigned long flags,const char*device,void*dev_id);void free_irq(unsigned int irq,void*dev_id);10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础函函数数的的参数参数如下。如下。unsigned int irq:请请求的中求的中断号断号。irqreturn_t(*handler):安装的中:安装的中断处断处理函理函数数指指针针。unsigned long flags:中:中断处断处理的理的属属性。性。const char*dev_name:这个传递给
13、这个传递给request_irq的字串的字串用在用在/proc/interrupts来显来显示中示中断断的的拥拥有者。有者。void*dev_id:用作共享中:用作共享中断断的指的指针针。10.1 嵌入式嵌入式Linux驱动驱动程序程序开发开发基基础础10.3 字符字符设备驱动设备驱动程序程序字符字符设备驱动设备驱动程序可以分程序可以分为为三三个个主要主要组组成部分:成部分:,自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。,服务于I/O请求的子程序,又称为驱动程序的上半部分。,中断服务子程序,又称为驱动程序的下半部分。10.3.1 字符字符设备驱动结构设备驱动结构
14、1.主次主次设备号设备号:字符:字符设备设备和和块设备块设备通通过过文件系文件系统统中的名子中的名子来来存取。存取。主主编号标识设备编号标识设备相相连连的的驱动驱动。次次编号编号被被内内核用核用来决来决定引用定引用哪个设备哪个设备。设备编号设备编号在在驱动驱动程序的程序的内内部具有固定的表示方式。部具有固定的表示方式。在建立在建立驱动时驱动时,需要做的第一件事是,需要做的第一件事是获获取一取一个个或多或多个设备编号来个设备编号来使用。使用。在在驱动驱动程序程序执执行的行的过过程中,如果不希望在使用程中,如果不希望在使用该设备该设备,要及,要及时时的的将设备编将设备编号释号释放:放:10.1 嵌
15、入式嵌入式Linux驱动驱动程序程序开发开发基基础础2.驱动驱动相相关数关数据据结构结构 大部分的基大部分的基础础性的性的驱动驱动操作包括操作包括3个个重要的重要的内内核核数数据据结构结构,它它们们是是file_operations,file,和,和inode。(1)文件操作()文件操作(file_operations)file_operation 结构结构表示了用表示了用户户程序程序怎样对设备进怎样对设备进行操作。行操作。这个结构这个结构,定,定义义在在中,是一中,是一个个函函数数指指针针的集合的集合 struct module*owner。(2)文件)文件结构结构struct file定定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 应用 教程 10
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内