毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

Linux设备驱动之semaphore机制分析 第2页

更新时间:2013-6-14:  来源:毕业论文

在此函数中首先进行信号量资源数的查看,如果信号量数据(count)不为0,则把其减1,并返回,调用成功;否则调用__down进行等待,调用者进行睡眠。实现过程如下。

C/C++ code?1234567891011 void down(struct semaphore *sem) {     unsigned long flags;       spin_lock_irqsave(&sem->lock, flags);     if (likely(sem->count > 0))         sem->count--;     else        __down(sem);     spin_unlock_irqrestore(&sem->lock, flags); }

在此函数中引起调用者进行睡眠的函数是__down函数,在等待中能不能中断同样是由于__down函数引起,所以,关键点在于__down函数,__down函数的实现如下。

C/C++ code?12345 static noinline void __sched __down(struct semaphore *sem) {     __down_common(sem,TASK_UNINTERRUPTIBLE,\ MAX_SCHEDULE_TIMEOUT); }

在__down函数中,通过调用__down_common函数来进行相关的操作,在上面的分析中我提到,传给__down_common函数的state参数将决定调用者是否可以中断,所以,down接口在睡眠过程中不能中断就是因为传入的实参决定。所以,在编过程中,最好很用此接口,尽量应用down_interruptible、 down_killable接口替代。MAX_SCHEDULE_TIMEOUT为一个宏定义,实定义如下。

C/C++ code?1 #define    MAX_SCHEDULE_TIMEOUT    LONG_MAX

LONG_MAX同时也是一个宏定义,其定义如下。

C/C++ code?1 #define LONG_MAX    ((long)(~0UL>>1))

所以,此接口不会因为超时而用,因为需要等待232-1个时钟滴答才能超时,这是一个很长的时间。所以,如果不使用up接口进行唤醒,整个进程将死掉。
9 down_interruptible接口分析
down_interruptible接口也是用于获取一个信号量,与down接口不同的是,
此接口在等待过程中是可以被中断的,是正常返回还是被中断返回通过返回值进行判断,其它与down相同,所以,在此不再进行分析。
10 down_killable接口分析
down_killable与down_interruptible相同,只是传入的__down_common的实
参不同,所以,在此不再进行分析。
11 down_trylock接口分析
down_trylock接口用于试着获取一个信号量,但是,此接口不会引起调用者
的睡眠。不管有无可用信号量,都马上进行返回,如果返回0,则获取信号量成功,如果返回1,则获取失败。所以,在调用此接口时,必须进行返回的值的查看,看是否获取成功。其实现过程如下。

C/C++ code?12345678910111213 int down_trylock(struct semaphore *sem) {     unsigned long flags;     int count;       spin_lock_irqsave(&sem->lock, flags);     count = sem->count - 1;     if (likely(count >= 0))         sem->count = count;     spin_unlock_irqrestore(&sem->lock, flags);       return (count < 0); }

12 down_timeout接口分析
down_timeout接口的实现过程与down接口的实现过程差不多,只是此接口
可以自定义超时时间,也就是如果在超时间内不能得到信号量,调用者会因为超时而自行唤醒。其实现过程如下,请注意超时参数的传入。

C/C++ code?1234567891011121314 int down_timeout(struct semaphore *sem, long jiffies) {     unsigned long flags;     int result = 0;       spin_lock_irqsave(&sem->lock, flags);     if (likely(sem->count > 0))         sem->count--;     else        result = __down_timeout(sem, jiffies);     spin_unlock_irqrestore(&sem->lock, flags);       return result; }

13 up接口分析
up接口用于唤醒处于等待的线程,对于某些不能获取信号量的线程,如果不
强制唤醒,那么也许会造此线程的死掉,所以,才有up接口。此接口的实现比较简单,所以不进行详细的分析,其实现如下。

C/C++ code?12345678 static noinline void __sched __up(struct semaphore *sem) {     struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,                         struct semaphore_waiter, list);     list_del(&waiter->list);     waiter->up = 1;     wake_up_process(waiter->task); }

14 关于其它说明
从开始学习嵌入式Linux到现在也有差不多4个月的时间了,从一味的看书
到走进Linux内核,这是本人的一个重大的进步,很多时候知其然而不知其所以然,写不出好的程序,所以,深入Linux是每个学习嵌入式Linux驱动开发学习者的必经之路,同时也是一个生的事。
Linux内核的不断发展,每一个版本之间都或多或少的有改变,如果不进行入其内核进行分析,那么这样就等于把自己限定于某一内核版本内,对自己的技术的提高、发展有很大的影响。同时,在工作中,不是你知道什么,会什么就做什么,而是需要做什么,不管你会与会都必须得做,所以,能不能深入Linux内核在一点上把不同能力的人给区分了。
在能不能看懂Linux内核的问题上,起决定作用的是个人的C语言能力,这也是C语言好坏的体现,如果C语言不好,那么就不能可看懂Linux内核,那么也就决定了个人的发展。所以说在嵌入式C语言是决定个人发展的重大条件,同时也是个人能力的体现。

上一页  [1] [2] 

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。