os_sem.c

共享资源的方法:关中断、关调度器、Sem、Mutex。
    关中断:任务与中断共享资源的唯一方法(CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); *****;  CPU_CRITICAL_EXIT();)。    
    关调度:当调度被关闭的时候,中断是开启的,当中断发生时,ISR会立即执行,执行完不管有没有高优先级的任务,都会回到被中断的任务。(OSSchedLock();  ***; OSSchedUnlock();)
    Sem:最初被用在控制共享资源(创建时初始值>0),现在也被用在同步上(创建时初始值=0)。
        binary semaphores:只能为0(Sem不可得,需要等待)或1(Sem可得,继续执行)。
        counting semaphores:0到OS_SEM_CTR对应的最大值(当资源可以被多个任务使用时,如缓冲池)。
    Mutex:一种特殊类型的binary semaphores,可以克服优先级翻转。


Sem在任务之间共享IO设备的时候非常有用,最好将处理和获取释放Sem封装起来。


优先级翻转:

L得到Sem,当H想要Sem时得不到,H被插入到等待List中,L被M终止,M执行完后,L继续执行释放Sem,H的到Sem运行。
Mutex可以解决这个问题(当高优先级任务H需要时,会将此时占用Mutex的低优先级的任务L优先级提高到和H相同)。




避免死锁的方法:
    1. 先获取所有的资源,然后在处理。
    2. 用同一个顺序获取资源。
    3. Pend操作使用timeout。


多个任务等待一个Sem,使多个任务同时运行。(广播Broadcast是同步多个任务同时运行的通用技术)
如果不使用Flag,但可能出现一种情况,在广播时有任务没有等待这个Sem,将Sem和Flag混合使用,可以解决此问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值