1. 程式人生 > >Alios things學習之訊號量與互斥量

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)