日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTX5 | 信号量01 - 信号量的使用

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 - 信号量的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。