Alios things學習之訊號量與互斥量
-
Sem訊號量
1. 概念
任務可以通過獲取訊號量來獲取訪問共享資源的“門禁”,可以通過配置訊號量數目,讓多個任務同時獲取門禁,當無法獲取時,任務會按照優先順序排隊獲取“門禁”,缺點是存在優先順序翻轉問題。
2. sem操作
1)靜態建立:kstat_t krhino_sem_create(ksem_t * sem, const name_t * name,sem_count_t count) //sem佔用的記憶體在外部定義。
2)動態建立:kstat_t krhino_sem_dyn_create(ksem_t * * sem, const name_t * name,sem_count_t count) //sem佔用的記憶體在內部申請。
設定訊號量count值:Krhino_sem_count_set()
獲取當前count值:krhino_sem_count_get()
3)sem刪除:kstat_t krhino_sem_del(ksem_t* sem, const name_t * name,sem_count_t count)
4)sem動態刪除:kstat_t krhino_sem_dyn_del(ksem_t* *sem, const name_t *name,sem_count_t count)
5)sem獲取:kstat_t krhino_sem_take(ksem_t * sem,tick_t ticks)
四種情況:成功獲取,非等待獲取,設定最大等待時間,無限等待獲取。
6)sem釋放:
kstat_t krhino_give(ksem_t * sem)//喚醒單個任務,將阻塞在當前sem的最高優先順序任務恢復。
kstat_t krhino_give_all(ksem_t * sem) //喚醒所有任務,將阻塞在當前sem的所有任務恢復。
Mutex
1. 與訊號量的區別
1)mutex是完全互斥的,即同一時刻,只能被同一個任務獲取。sem按照起始的配置,可能會被多個任務獲取,若sem的count 初值設為1,同樣有mutex的作用。
2)sem可以由其他任務上下文進行釋放,並可以選擇釋放單個任務或所有阻塞的任務;
mutex的釋放必須由佔有該mutex的任務釋放。
3)解決優先順序翻轉問題,用優先順序繼承(priority inheritance) ,或優先順序天花板(priority ceilings)方法。
2. mutex操作
1)mutex建立: kstat_t krhino_mutex_create(kmutex_t * mutex, const name_t * name)
2)mutex刪除: kstat_t krhino_mutex_del(kmutex_t * mutex)
3)mutex獲取: kstat_t krhino_mutex_lock(kmutex_t * mutex,tick_t ticks)(ticks設定非等待,等待延遲和無限等待幾種模式)。
4)Mutex釋放: kstat_t krhino_mutex_unlock(kmutex_t * mutex)