RTX5 | 互斥量01 - 互斥量的使用
文章目錄
- 一、前言
- 二、實(shí)驗(yàn)?zāi)康?/li>
- 三、API
- 3.1、osMutexAttr_t
- 3.2、osMutexNew
- 3.3、osMutexAcquire
- 3.4、osMutexGetOwner
- 3.5、osMutexRelease
- 四、代碼
- 4.1、main.h
- 4.2、main.c
- 五、Event Recorder調(diào)試
- 5.1、System Analyzer
- 5.2、RTX RTOS
- 5.3、Debug (printf) Viewer
一、前言
互斥量通常在各種各樣的操作系統(tǒng)上用于資源管理。MCU上的很多資源能被復(fù)用,但是,在同一個(gè)時(shí)刻上僅僅只有一個(gè)線程能訪問這些資源(例如通訊(串口,SPI),內(nèi)存,文件等)。互斥量通常用于保護(hù)一些共享資源的訪問。在線程上獲取互斥量,也必須釋放互斥量(釋放了互斥量,其他線程才能訪問共享資源)。
互斥量是一個(gè)特別的信號(hào)量。在同一個(gè)時(shí)刻,信號(hào)量可以有多個(gè)訪問權(quán)限,而互斥量僅僅只有一個(gè)訪問權(quán)限(只允許一個(gè)線程訪問)。它要么有效的(1),要不被一個(gè)獲取了互斥量的線程阻塞(0)。互斥量的好處在于它引入線程所有權(quán)。當(dāng)一個(gè)線程獲取了互斥量就變成互斥量的擁有者,獲取互斥量并沒有任何延時(shí)(通過osMutexRecursive設(shè)置)。所以,互斥量的獲取與釋放可以被嵌套。
以上都是從RTX5官方文檔翻譯過來的。除此之外,我強(qiáng)烈建議把《嵌入式實(shí)時(shí)操作系統(tǒng)uc/OS-III》的第13章-資源管理仔細(xì)讀幾遍,在實(shí)際工作中反復(fù)思考。
STM32工程:
鏈接:https://pan.baidu.com/s/1jZc6XpyOJ9So2ey_7Bw4CA
提取碼:jalh
二、實(shí)驗(yàn)?zāi)康?/h1>
1、LED線程與A線程分別成功獲取互斥量后繼續(xù),線程終止時(shí)釋放互斥量。
三、API
3.1、osMutexAttr_t
/* 使用案例1 */ const osMutexAttr_t Thread_Mutex_attr = {.name = "Mutex One", /* 互斥量名字 */.attr_bits = osMutexPrioInherit | osMutexRobust, /* 繼承更高優(yōu)先級(解決優(yōu)先級反轉(zhuǎn)問題),線程終止時(shí)(終止態(tài))自動(dòng)釋放互斥量 */ };/* 使用案例2 */ const osMutexAttr_t Thread_Mutex_attr = {.name = "Mutex One",.attr_bits = osMutexPrioInherit | osMutexRobust | osMutexRecursive, /* 繼承更高優(yōu)先級,線程終止時(shí)自動(dòng)釋放互斥量,一個(gè)線程多次獲取互斥量不會(huì)進(jìn)入阻塞態(tài) */ };/* 使用案例3 */ const osMutexAttr_t Thread_Mutex_attr = {.name = "Mutex One",.attr_bits = 0, /* 不繼承更高優(yōu)先級,線程終止時(shí)不自動(dòng)釋放互斥量,一個(gè)線程多次獲取互斥量將會(huì)進(jìn)入阻塞態(tài)(除非先釋放互斥量才能再一次獲取互斥量) */ };3.2、osMutexNew
/* 使用案例1 */ osMutexId_t mutexID_One = NULL; /* 保存互斥量ID */const osMutexAttr_t Thread_Mutex_attr = {.name = "Mutex One", /* 互斥量名字 */.attr_bits = osMutexPrioInherit | osMutexRobust, /* 繼承更高優(yōu)先級(解決優(yōu)先級反轉(zhuǎn)問題),線程終止時(shí)自動(dòng)釋放互斥量 */ };mutexID_One = osMutexNew(&Thread_Mutex_attr); /* 創(chuàng)建互斥量 */3.3、osMutexAcquire
/* 使用案例 */ osMutexAcquire(mutexID_One,osWaitForever); /* 獲取互斥量,一直等待直到獲取成功 */ osMutexAcquire(mutexID_One,10U); /* 獲取互斥量,超時(shí)時(shí)間10個(gè)time ticks */3.4、osMutexGetOwner
/* 使用案例 */ osThreadId_t thread_Owner; thread_Owner = osMutexGetOwner(mutexID_One); /* 獲取互斥量metxID_One的線程擁有者 */3.5、osMutexRelease
/* 使用案例 */ status = osMutexRelease(mutexID_One); /* 釋放互斥量 */四、代碼
4.1、main.h
4.2、main.c
五、Event Recorder調(diào)試
5.1、System Analyzer
從System Analyzer看到互斥量被使用。
5.2、RTX RTOS
5.3、Debug (printf) Viewer
LED線程與A線程在交替運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的RTX5 | 互斥量01 - 互斥量的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: llinux c 语言延时,linux下
- 下一篇: STM32H743+CubeMX-梳理M