打印

有个关于UCOS中编写驱动的问题

[复制链接]
4651|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2008-11-18 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uCOS多任务环境下程序设计时, 在设计各个外设驱动时往往要进行互斥访问, 因为各个外设(SPI, I2C)相对于程序来说等于是全局资源, 多线程操作会造成一些麻烦..(除非只在一个任务中操作某一个设备,或者完全时分的方式).

最近在阅读一些代码时,发现大家都是在init一个设备时分配一个信号量Sem给该设备, 做为经典的互斥的应用为什么不是用互斥信号量Mutex呢? 

相关帖子

沙发
zyok| | 2008-11-18 23:29 | 只看该作者

顶!

使用特权

评论回复
板凳
John_Lee| | 2008-11-19 01:01 | 只看该作者

sem和mutex的区别

如果不考虑优先级反转问题,sem和mutex的区别就只有一点:mutex是有owner的。

sem是谁都可以释放的,如果有一个线程想野蛮地获取到sem,它完全可以先用一个释放操作后,再获取,但这种行为几乎必定会造成严重的后果。而mutex不会有这样的问题,mutex的释放必须是当初获取它的那个线程。

如果系统中的程序都比较规范,不存在上面说的野蛮操作,那么是可以用sem来代替mutex的。

使用特权

评论回复
地板
db10| | 2008-11-19 15:10 | 只看该作者

。。。

 顶John_Lee,分析得相当好。

使用特权

评论回复
5
db10| | 2008-11-19 15:45 | 只看该作者

。。。

 其实sem和mute真正得区别,mute是可以进行反转处理的,而sem不能:
   创建每一个Mutex,都需要指定一个空闲的优先级号,这个优先级号的优先级必须比所有可能使用此Mutex的任务的优先级都高!

    uC/OS-II的Mutex实现原理大致如下:
    当一个低优先级的任务A申请并得到了Mutex,于是它获得资源访问权。如果此后有一个高优先级的任务B开始运行(此时任务A已经被剥夺),而且也要求得到Mutex,系统就会把任务A的优先级提高到Mutex所指定的优先级。由于此优先级高于任何可能使用此Mutex的任务的优先级,所以任务A会马上获得CPU控制权。一直到任务A释放Mutex,任务A才回到它原有的优先级,这时任务B就可以拥有该Mutex了。

uC/OS-II中多个任务访问独占资源时,最好使用Mutex,但是Mutex是比较消耗CPU时间和内存的。如果某高优先级的任务要使用独占资源,但是不在乎久等的情况下,就可以使用Sem,因为Sem是最高效最省内存的内核对象。

使用特权

评论回复
6
Swd21ic|  楼主 | 2008-11-19 20:40 | 只看该作者

re

顶John_Lee,长见识了
 以前没考虑过这么怪的方法..先Post再Pend..呵.太不规范了.

To db10兄.

如果用Sem替代Mutex,可以节约FLASH和RAM.. 不过时间上应该是Mutex平均消耗最少.优先级一旦反转,高优先级任务等待的时间可是相当宝贵的..
: )

使用特权

评论回复
7
db10| | 2008-11-20 00:21 | 只看该作者

。。。

 ls,
 如果是多个任务使用同一资源,最好用互斥信号,可以防止反转。
 信号量一般用在中断程序与任务之间,作为一种消息方式使用比较多。

使用特权

评论回复
8
armecos| | 2008-11-20 00:45 | 只看该作者

《ecos增值包》里有更全面的驱动同步编程说明,

如果你的系统支持多CPU(SMP),那么必须使用自旋锁(spinlock)进行同步。
ecos驱动的调用级别分为ISR、DSR、Thread三个级别,各种同步函数的工作级别不同,互斥变量(mutex)和条件变量(cond)一般工作于Thread级别。

不同于ucos,ecos的驱动写法更加标准化,它为驱动程序专门抽象出了驱动专用同步函数,以cyg_drv_为前缀,与应用程序里使用的同步函数彻底分开,绝对不会用错,因为应用程序里用到的同步函数都不带cyg_drv_字样。

自旋锁函数
cyg_drv_spinlock_init()
cyg_drv_spinlock_destroy()
cyg_drv_spinlock_spin()
cyg_drv_spinlock_clear()
cyg_drv_spinlock_try()
cyg_drv_spinlock_test()
cyg_drv_spinlock_spin_intsave()
cyg_drv_spinlock_clear_intsave()

互斥变量函数
cyg_drv_mutex_init()
cyg_drv_mutex_destroy()
cyg_drv_mutex_lock()
cyg_drv_mutex_trylock()
cyg_drv_mutex_unlock()
cyg_drv_mutex_release()

条件变量函数
cyg_drv_cond_init()
cyg_drv_cond_destroy()
cyg_drv_cond_wait()
cyg_drv_cond_signal()
cyg_drv_cond_broadcast()

更多内容,详见:
《培训系列“丛书”》
www.armecos.com
-----------------------------------
More details, see:
《"Series Books" of Training》
www.armecos.com

使用特权

评论回复
9
lipm| | 2008-11-29 00:39 | 只看该作者

顶!分析的非常好!

使用特权

评论回复
10
cuihaijun| | 2008-12-14 21:05 | 只看该作者

分析的很透彻!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

781

帖子

1

粉丝