我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 3858|回复: 2

Blackfin嵌入式系统中设备驱动中的并发控制

[复制链接]

该用户从未签到

1万

主题

1292

回帖

936

积分

管理员

积分
936

社区居民最爱沙发原创达人社区明星终身成就奖优秀斑竹奖宣传大使奖特殊贡献奖

QQ
发表于 2012-4-30 22:42:32 | 显示全部楼层 |阅读模式
在驱动程序中,个人觉得最难的就是设备驱动中的并发控制,在使用Blackfin嵌入式系统时,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发“竞态”,因此我们必须对共享资源进行并发控制。
ucLinux 内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。自旋锁与信号量“类似而不类”,类似说的是它们功能上的相似性,“不类”指代它们在本质和实现机理上完全不一样,不属于一类。自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,“自旋”就是“在原地打转”。
而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁。这就是它们的“不类”。但是,无论是信号量,还是自旋锁,在任何时刻,最多只能有一个保持者,即在任何时刻最多只能有一个执行单元获得锁。这就是它们的“类似”。
鉴于自旋锁与信号量的上述特点,一般而言,自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用;信号量适合于保持时间较长的情况,会只能在进程上下文使用。如果被保护的共享资源只在进程上下文访问,则可以以信号量来保护该共享资源,如果对共享资源的访问时间非常短,自旋锁也是好的选择。
但是,如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
与信号量相关的 API 主要有:定义信号量struct semaphore sem;初始化信号量void sema_init (struct semaphore *sem, int val);该函数初始化信号量,并设置信号量 sem 的值为 valvoid 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_interruptible(struct semaphore * sem);该函数功能与 down 类似,不同之处为,down 不能被信号打断,但 down_interruptible 能被信号打断;int down_trylock(struct semaphore * sem);该函数尝试获得信号量 sem,如果能够立刻获得,它就获得该信号量并返回 0,否则,返回非 0 值。
它不会导致调用者睡眠,可以在中断上下文使用。释放信号量void up(struct semaphore * sem);该函数释放信号量 sem,唤醒等待者。与自旋锁相关的 API 主要有:定义自旋锁spinlock_t spin;初始化自旋锁spin_lock_init(lock)该宏用于动态初始化自旋锁 lock获得自旋锁spin_lock(lock)该宏用于获得自旋锁 lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放;spin_trylock(lock)该宏尝试获得自旋锁 lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际上不再“在原地打转”;释放自旋锁spin_unlock(lock)该宏释放自旋锁 lock,它与 spin_trylock 或 spin_lock 配对使用;
除此之外,还有一组自旋锁使用于中断情况下的 API,等过了五一,我写一篇关于这方面的博客,欢迎大家一起交流学习,共同进步。
回复

使用道具 举报

该用户从未签到

7

主题

290

回帖

285

积分

游客

积分
285

终身成就奖社区居民

QQ
发表于 2014-3-14 13:04:52 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 100 天

    [LV.6]常住居民II

    49

    主题

    1万

    回帖

    7万

    积分

    三级逆天

    积分
    73169

    终身成就奖特殊贡献奖原创先锋奖社区居民忠实会员社区劳模最爱沙发社区明星原创达人优秀斑竹奖宣传大使奖

    QQ
    发表于 2014-4-3 08:26:35 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表