嵌入式Linux的同步机制在设备驱动开发中的应用.doc

上传人:scccc 文档编号:11792293 上传时间:2021-09-12 格式:DOC 页数:7 大小:103.50KB
返回 下载 相关 举报
嵌入式Linux的同步机制在设备驱动开发中的应用.doc_第1页
第1页 / 共7页
嵌入式Linux的同步机制在设备驱动开发中的应用.doc_第2页
第2页 / 共7页
嵌入式Linux的同步机制在设备驱动开发中的应用.doc_第3页
第3页 / 共7页
嵌入式Linux的同步机制在设备驱动开发中的应用.doc_第4页
第4页 / 共7页
嵌入式Linux的同步机制在设备驱动开发中的应用.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《嵌入式Linux的同步机制在设备驱动开发中的应用.doc》由会员分享,可在线阅读,更多相关《嵌入式Linux的同步机制在设备驱动开发中的应用.doc(7页珍藏版)》请在三一文库上搜索。

1、第25卷第2期2010年6月Vol. 25. No.2Jun. ,2009安徽工程科技学院学报Journal of Anhui U niversity of Technology and Science文章编号:1672 2477(2010) 02 0071 04嵌入式Linux的同步机制在设备驱动开发中的应用张良清,陈永煌*(安徽工程大学 安徽电气传动与控制重点实验室,安徽芜湖 241000)摘要:基于ARM硬件平台和嵌入式Linux软件平台进行驱动开发时,对共享资源 的保护是常遇 到的问题,嵌 入式Linux的同步机制便是解决该问 题的方法之一,也是嵌入式Linux的核心内容之一.首先分析

2、了自旋锁、 信号量的原理和相关函数,然后论述了自旋锁与信号量的选用,最后用一个示例 加以分析,详细说明了它们在驱动程序中的应用.并在Linux2. 6平台上对自旋锁和信号量进行了验证,验证结果同理论分析一致.关 键 词:嵌入式系统;A RM ; Linux ;设备驱动;自旋锁;信号量中图分类号:TP216文献标识码:A嵌入式Linux内核非常复杂,主要由进程调度、内存管理、虚拟文件系统、网络子系统、进程通信、设备 管理等几个子系统组成,各个子系统之间相互依赖.其中断处理、多任务环境、多处理器是现代操作系统的 特征.在驱动程序中,当多个进程、线程同时访问某个资源时,可能会引发 竞态从而导致错误.

3、因此内核 需要提供并发控制机制,对公共资源的访问进行同步控制,确保公共资源的安全访问.Li nux操作系统中包含众多的同步机制,主要有信号量(semaphore)、自旋锁(spinlock)、原子操作(atom ic operation)、读写 锁(rw lo ck)等.在不同场合可以选择不同机制.本文重点揭示信号量(semaphore)与自旋锁(sp in lock)在设备驱动程序开发中的应用技巧.1自旋锁原理及相关函数自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段,其名称来源于它的工作方式 .为了获得一个自旋锁,在某CPU上运行的代码需先执行一个原子操作,该操作测试并设

4、置某个内存变量,由于是原子操作,所以在该操作完成之前其它执行单元不可能访问这个内存变量,自旋锁主要用在多处理器的环境下在单处理器环境中,spinock()和spin_unlock()的作用仅限于禁止和允许内核抢占.自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元占有,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁.这种特性避免了调用进程的挂起,用自旋来取代进程切换.自旋锁的使用主要包括:定义、初始化、得锁、释放锁等几个过程,其中得锁与释放锁之间便是被保护 内容,不会被外界中断.相关函数主要有:spinlock_t spin;(定义自旋锁)spin_lock( lock);(得锁,进

5、入临界资源保护)spin_lock_init( lock);(初始化自旋锁)spin_unlock( lock);(释放自旋锁)2信号量原理及相关函数信号量(semaphore)与自旋锁功能很相似,但它们实现机理完全不一样信号量的调用会引起调用者睡眠,除非获得锁信号量适用于单处理器系统和多处理器系统,信号量允许并行访问,即可以有多个内核控制路径同时掌握该信号量,它所允许的并行访问数目是在创建信号量的时候定义的.互斥对象(mutex)是一种特殊的信号量,它所保护的资源在同一时刻只允许一个内核控制路径访问信号量的使用包括:定义、初始化、获得信号量、释放信号量.获得信号量与释放信号量之间就是被保 护

6、资源.收稿日期:2009 10 12作者简介:张良清(1971 ),男,安徽肥西人,硕士研究生.通讯作者:陈永煌(1949 ),男,安徽芜湖人,教授,硕导.4 丨: I luna Academic Tlll nal Electronic PuhiKhina Hbuscl AU rifthts reserved. nttK/wwwcnki.:72安徽工程科技学院学报第25卷CPU将运行其它进程鉴于进程上下文切换的开销很大,struct semaphore sem;(定义信号量)void sema_init( struct semaphore * sem, int val)(初始 化信 号量)vo

7、id init_M UTEX(struct semaphore * sem);(该函数 初始 化互斥锁,等同于 sema_init( str uct semaphore * sem, 1) void init_M U T EX_LOCK ED( str uct semaphore * sem)(该 函数等同于 sema_init( struct semaphore * sem,0) void down(struct semaphore * sem);(获得信号量,它会导 致睡眠,因此不能在中断上下文使用)int down_inter ruptible( str uct semaphore *

8、sem);(该函 数 信号量是进程级的,用于多个进程对资源的互斥身份,会发生进程切换,而使当前进程进入睡眠获得信号量,能被信号打断,用返回值来区分是正常返回还 是被信号中断,如果返回0,表示获得信号量并正常返回, 如果被信号打断,返回-El NT R.)int down_try lock( struct semaphore * sem);(该函 数 尝试 获得信号量,如果能够立刻获得,它将获得该信号量并返回0,否则,返回非0值.它不会导致调用者睡眠,可以在中断 上下文使用.)void up( str uct semaphore * sem);(该函 数释放 信号量,唤 醒等待者.),虽然也是在

9、内核中,但是该内核执行路径是以进程owner: THIS MODULE,sPin_lock_init( & 即;#安徽工程科技学院学报第25卷因此,只有当进程占用资源时间较长时,用信号量才是较好的选择当所要保护的临界区访问时间较短时,用自旋锁是非常方便的,因为它节省了上下文切换的时间但是CPU得不到自旋锁会在那里空转直到其它单元解锁为止,所以要求锁不能在临界区里长时间停留,否则会降低系统效率由此,可以总结出自旋锁与信号量使用的基本原则:(1)当锁不能被获得时,使用信号量的开销是进程上下文切换时间,使用自旋锁的开销是等待获得自旋锁(由临界区执行时间决定),若临界区执行时间比较小,应使用自旋锁;若

10、进程上下文切换时间很大,应使用信号量;(2)信号量所保护的临界 区可包含可能引起阻塞的代码 (但要小心,防止死锁),而自旋锁则绝对要避免用来保护包含这样代码的临 界区.因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程试图获得本自旋锁,死锁就会发生;(3)信号量存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则只能使用自旋锁当然,如果一定要使用信号量,则只能通过dow n_try lock()方式进行,不能获取就立即 返回以避免阻塞3自旋锁及信号量的程序实现以上对自旋锁及信号量的原理和相关函数做了分析,为了掌握它们的应用方法,现在编写一个设备驱动程序,该

11、驱动程序是一个简单的字符型设备驱动程序,虽然简单,但是对自旋锁和信号量的理解及正确应用是非常有益的.在该驱动程序中,我们定义两个整型全局变量chardev_var和chardev_count,前者将要被复制到用户空间,后者用来记录打开设备的进程数,为了控制对chardev_var的并发访问,chardev_read()函数使用了信号量进行共享资源保护为了实现设备只能被一个进程打开即chardev_count最大值为1,我们借助于自旋锁在函数chardev_open()中进行控制.下面我们重点看一下它们在驱动程序中的实现过程:owner: THIS MODULE,sPin_lock_init(

12、& 即;73安徽工程科技学院学报第25卷(1) 相关头文件,宏声明及变量定义等.static int chardev_var= 0;static int chardev_count= 0;static struct semaphoresem;static spinlock_t spin;这里显示的是两个整型 全局变量chardev_var和chardev_ count的定义和初始化、自旋锁和信号量的定义.(2) 初始化字符设备驱动的f ile_operatio ns结构体.在struct file_operations结构体中定义了一系 列指针,每个 指针对应一个系统调用.struct fil

13、e_operations chardev_fops=read: chardev_read,w rite: chardev_writ e,open: chardev_open,release: chardev_release,(3) chardev_init()函数.在模块加载时该函数被调用,重点完成设备注册、初始化信号量、自旋锁等static int _init chardev_init( void)/ *初始化互斥锁(信号量)、自旋锁* /init_M UTEX(& sem);owner: THIS MODULE,sPin_lock_init( & 即;#安徽工程科技学院学报第25卷(4)

14、chardev_open()函数在函数中用自旋锁进行并发控制,确保设备文件只被一个进程打开static int chardev_open( struct inode* inode, struct file * filp)/*获得自旋锁* /spin_lock( & spin);/*临界资源访问:如果正在被别的进程打开则释放自旋锁 并返回忙,如未被打开,则此进程成功打开并计数器加1, 最后释放自旋锁* /if( chardev_count)spin_unlock( & spin);return - EBU SY;char_dev count+ + ;spin_unlock( & spin);re

15、turn 0;(5) chardev_release()函数该函数重点完成打开次数减1的计数static int chardev_release(struct inode* ino de, str uct file* filp);hardev_count-;return 0;(6) static ssize_t chardev_read()函数该函数实现将内核变量chardev_var复制到用户空间,其中用信号量进行同步控制static ssize_t chardev_read(struct file* filp, char* buf, size_t len, loff_t* off)/*获得

16、信号量以作判断* /if( down_inter rupt ible(& sem)return - ERESTART SYS;/ *开始复制.参数buf指用户空间 的缓冲区,chardev_var是前面定义过的处于内核空间的变量,在ARM平台中,int指32位即4字节,所以sizeof( int) = 4* /if( copy_t o_user( buf, & chardev_var, sizeof( int)/*释放信号量* /up( & sem);retur n- EFAULT;up( & sem);return sizeof( int);(7) chardev_wr ite()函数该函数

17、是将用户空间的数据复制给内核空间变量chardev_varstatic ssize_t chardev_w rite (struct file* filp, char* buf, size_t len, loff_t* off)/*获得信号量以作判断* /if( down_inter ruptible( & sem)return - ERESTART SYS;/*将用户空间的数据复制到内核空间的chardev_var* /if( copy_f rom_user( & chardev_var, buf, sizeof( int)/*释放信号量* /up( & sem);return - EF A

18、U LT;up( & sem);retur n sizeof( int);(8) chardev_exit()函数完成进程访问的退岀static void _exit chardev_exit( void)(9) 模块加载和卸载驱动程 序入口模块加载或卸载时,分别调用chardev_init()和chardev _ exit()module_init( chardev_init);module_exit( chardev_exit);76安徽工程科技学院学报第25卷以上是字符型设备驱动的框架,重点强调了自旋锁与信号量的应用而略去其它部分4结语编写了两个驱动程序对信号量验证,在写入完成后释放信号

19、量并加入一行唤醒等待队列程序另一个 驱动程序中删除了唤醒等待队列 ,其余相同前者能够得到输出结果 1,而后者却得不到结果可见自旋锁 是一种互斥访问机制,是一种忙等待;信号量的内核执行路径是以进程身份 ,会发生进程切换,而使当前进 程进入睡眠,CPU将运行其他进程参考文献:1 华清远见嵌入式培训中心嵌入式Linux C语言应用程序设计M.北京:北京邮电出版社,2007:334 347.2 冯国进.嵌入式Linux驱动程序设计从入门到精通M.北京:清华大学出版社,2008:17 19.3 林小飞,刘彬,张辉,等.基于ARM嵌入式Linux应用开发与实例教程M.北京:清华大学出版社,2007: 21

20、0 355.4 何世烈,陈健.基于嵌入式Linux的设备驱动程序设计J.单片机与嵌入式系统应用,2007(7):65 67.Application of semaphore and spinlockof embeded Linux to device driverZHA NG Liang qing, CHEN Yong huang(A nhui Provincial Key Laboratory of Electric and Control, A nhui Polytechnic U niversit y, Wuhu 241000, China)Abstract: One of the pr

21、oblems is how to protect shared materials when developing some projects based on ARM and embedded Linux. The paper focuses on the explanation of spinlo ck and semaphore, fristly of the principle and the related functio ns and then on how to make a choice between them. At last, the ap plication in th

22、e device driver developm ent is expounded.Key words: embedded system; ARM ; Linux ; device driv er; spin lock; semaphore(上接第32页)The conditions of the liquid fermentation of pleurotus ostreatusto producexylanaseusing brewers spentgrain as raw materialsPAN Zhen qing, CHEN Tao(Coll. of Bioch. Engn. ,An

23、hui Polytechnic University, Wuhu 241000, China)Abstract: This paper researches the feasibility of liquid ferm entation of Pleurotus ostreatus strain to pro duce xylanase using brewers spent grain as raw mater ials. The best medium form ula was obtained by or thog o nal experime nt. The importa nt in

24、 dicator s (reduci ng sugar a nd xy la nase) on differe nt ferme ntati on tim e was also obtained. T he results are as follow : the optim um medium fo rmula of beers spent grains 6g, soybeanmeal 0. 32 g, corn flour 2 g, sugar 10 g, pH 5. 0. T he best time for ferm entation was 72 h. Un der this condition, the largest activity of xylanase reached 9. 2 U/mL.Key words: brew er s spent grain; liquid ferm entation; xylanase 1994-2011 China Acadeinic Journal Electronic Publishing ilousc, All rights reserved, http:Avwxv,cnki.ncT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1