RTX5 | 信号量01 - 信号量的使用
文章目錄
- 一、前言
- 二、實驗目的
- 三、API
- 3.1、osSemaphoreAttr_t
- 3.2、osSemaphoreNew
- 3.3、osSemaphoreAcquire
- 3.4、osSemaphoreRelease
- 3.5、osSemaphoreGetCount
- 四、代碼
- 4.1、main.h
- 4.2、main.c
- 五、Event Recorder調試
- 5.1、線程A每隔1S時間運行一次
- 5.1、按下按鍵KEY0,獲取全部信號量
- 5.2、按下按鍵KEY1,釋放信號量
一、前言
信號量常用于管理和保護對共享資源的訪問,信號量跟互斥量非常相似。在同一個時刻上互斥量只允許一個線程訪問共享的資源,但是,信號量允許一個固定的數量的線程或ISR同時訪問共享資源池。使用信號量,可以管理訪問一組相同的外設(比如多個DMA channels)。
一個信號量對象應該被初始化為可使用的共享資源的最大數量??墒褂玫墓蚕碣Y源的最大數量是通過函數osSemaphoreNew設定的。每一次信號量的獲取是使用osSemaphoreAcquire獲得(信號量在有效的狀態下),接著信號量的數量被遞減。當信號量的數量是0時,就沒有更多的信號量可以被獲取。此時,線程與ISR繼續從此信號量對象獲取信號量時,就會進入阻塞態一直等待,直到其他線程或ISR使用osSemaphoreRelease將信號量釋放,信號量的數量遞增。
以上都是從RTX5官方文檔翻譯過來的。除此之外,我強烈建議把《嵌入式實時操作系統uc/OS-III》的第13章-資源管理仔細讀幾遍,在實際工作中反復思考。
STM32工程:
鏈接:https://pan.baidu.com/s/1SBWXuNQqf-9tWJdEPgJdoA
提取碼:5kti
二、實驗目的
1、線程A每隔1s時間就會從信號量New Semaphore獲取一個信號量,獲取成功的話,打印信息表示獲取成功。獲取不了的話,進入阻塞態,直到信號量New Semaphre有信號量被線程A獲取。
2、按下按鍵KEY0,從信號量New Semaphore獲取一個信號量(不會將信號量釋放回去)。
3、按下按鍵KEY1,將信號量New Semaphore的信號量釋放回去。
4、連續按下按鍵KEY0,將信號量New Semaphore的信號量全部獲取后,線程A將一直保持阻塞態,不能運行。接著,按下KEY1將信號量釋放后,線程A又能周期地運行下去了。
三、API
3.1、osSemaphoreAttr_t
/* 信號量屬性 */ const osSemaphoreAttr_t sema_New_Attr = {.name = "New Semaphore", /* 信號量的名字 */ };3.2、osSemaphoreNew
/* 使用案例1 */ osSemaphoreId_t semaID_New = NULL; /* 保存信號量ID */ /* 創建信號量 */ semaID_New = osSemaphoreNew(5U, /* 信號量的最大值為5 */5U, /* 信號量的初始值為5 */&sema_New_Attr /* 信號量的屬性 */);/* 使用案例2 */ osSemaphoreId_t semaID_New = NULL; /* 保存信號量ID */ /* 創建信號量(當信號量的最大值為1時,信號量就類似一個互斥量了) */ semaID_New = osSemaphoreNew(1U, /* 信號量的最大值為1 */1U, /* 信號量的初始值為1 */&sema_New_Attr /* 信號量的屬性 */);3.3、osSemaphoreAcquire
/* 使用案例1 */ status = osSemaphoreAcquire(semaID_New,osWaitForever); /* 獲取信號量,一直等到有信號量 */switch(status){case osOK:printf("the semaphore is got successfully.\r\n"); /* 打印信息 */break;case osErrorResource:printf("occur osErrorResource.\r\n"); /* 打印信息 */break;case osErrorParameter:printf("occur osErrorParameter.\r\n"); /* 打印信息 */break;default:break;}/* 使用案例2 */ status = osSemaphoreAcquire(semaID_New,10U); /* 獲取信號量,超時時間10個time ticks */switch(status){case osOK:printf("the semaphore is got successfully.\r\n"); /* 打印信息 */break;case osErrorResource:printf("occur osErrorResource.\r\n"); /* 打印信息 */break;case osErrorParameter:printf("occur osErrorParameter.\r\n"); /* 打印信息 */break;default:break;}3.4、osSemaphoreRelease
osSemaphoreRelease(semaID_New); /* 釋放一個信號量 */3.5、osSemaphoreGetCount
uint32_t number_Of_Sema; number_Of_Sema = osSemaphoreGetCount(semaID_New); /* 獲取當前的信號量剩余數量 */四、代碼
4.1、main.h
4.2、main.c
五、Event Recorder調試
5.1、線程A每隔1S時間運行一次
5.1、按下按鍵KEY0,獲取全部信號量
5.2、按下按鍵KEY1,釋放信號量
總結
以上是生活随笔為你收集整理的RTX5 | 信号量01 - 信号量的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT Core | 信号槽02 - GU
- 下一篇: C语言 | 内存对齐03 - 内存对齐的