共享资源的方法:关中断、关调度器、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混合使用,可以解决此问题。