FreeRTOS計數型信號量

目錄

一、計數型信號量簡介

二、計數型信號量相關API

1、創建計數型信號量

2、釋放計數型信號量

3、獲取計數型信號量

4、獲取計數型信號量的計數值

三、計數型信號量實操

1、實驗需求

2、CubeMX配置

3、代碼實現


一、計數型信號量簡介

①取值只有0與1兩種狀態的信號量稱之為二值信號量;取值大于1的信號量稱之為計數信號量

計數信號量是一種長度大于1,消息大小為0的特殊消息隊列。 ?

③計數信號量的取值也可以為1,但通常大于1,如果取值為1,相當于只有0與1兩種狀態,用二值信號量即可。

④創建計數信號量時,系統會為創建的計數信號量分配內存

計數型信號量相當于隊列長度大于1 的隊列,因此計數型信號量能夠容納多個資源,這在計數型信號量被創建的時候確定的。

使用計數型信號量可以解決多個任務之間的同步問題,例如控制對共享資源的訪問和協調任務的執行順序

二、計數型信號量相關API

函數描述
xSemaphoreCreateCounting()

使用動態方法創建計數型信號量

xSemaphoreCreateCountingStatic()使用靜態方法創建計數型信號量
xSemaphoreGive()釋放信號量
xSemaphoreGiveFromISR()中斷釋放信號量
xSemaphoreTake()獲取信號量
xSemaphoreTakeFromISR()中斷獲取信號量
uxSemaphoreGetCount()獲取信號量的計數值

1、創建計數型信號量

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,UBaseType_t uxInitialCount);

參數:

  • uxMaxCount:可以達到的最大計數值
  • uxInitialCount:創建信號量時分配給信號量的計數值,即計數值的初始值(一般設置為0才能正常計數)

返回值:

  • 成功,返回對應計數型信號量的句柄;
  • 失敗,返回 NULL。

2、釋放計數型信號量

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );

參數:

  • xSemaphore:要釋放的信號量句柄

返回值:

  • 成功,返回 pdPASS ;
  • 失敗,返回 errQUEUE_FULL 。

3、獲取計數型信號量

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait );

參數:

  • xSemaphore:要獲取的信號量句柄
  • xTicksToWait:超時時間,0 表示不超時,portMAX_DELAY表示卡死等待;

返回值:

  • 成功,返回 pdPASS ;
  • 失敗,返回 errQUEUE_FULL 。

4、獲取計數型信號量的計數值

BaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );

參數:

  • xSemaphore:要獲取的信號量句柄

返回值:

????????得到計數型信號量的值。

三、計數型信號量實操

1、實驗需求

創建一個計數型信號量,按下 KEY1 則釋放信號量,按下 KEY2 獲取信號量。

2、CubeMX配置

這里已經將FreeRTOS移植到STM32F103C8T6,具體操作流程看前面的文章。

查看原理圖配置按鍵引腳

?創建兩個任務用來放入和獲取信號量

使能計數型信號量

創建計數型信號量

3、代碼實現

uart.c 重定向printf

#include "stdio.h"
int fputc(int ch,FILE *f)
{unsigned char temp[1] = {ch};HAL_UART_Transmit(&huart1,temp,1,0xffff);return ch;
}

需要打開魔術棒勾上紅框內選項實現串口打印

打開freertos.c并添加代碼

void StartTaskKey1(void const * argument)
{for(;;){if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){if(xSemaphoreGive(myCountingSemHandle) == pdTRUE) printf("計數型信號量放入成功\r\n");elseprintf("計數型信號量放入失敗\r\n");}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);}osDelay(10);}
}void StartTaskKey2(void const * argument)
{for(;;){if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){	if(xSemaphoreTake(myCountingSemHandle,0) == pdTRUE) printf("計數型信號量獲取成功\r\n");elseprintf("計數型信號量獲取失敗\r\n");}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);}osDelay(10);}
}

兩個紅框說明當釋放信號量成功時,能成功獲取信號量(在設置最大范圍之內);當超過最大范圍后再次釋放會失敗,同時成功獲取信號量次數也是3次(設置的最大數),超過了再次獲取也會失敗。

注意:

創建后的計數型信號量原先代碼和修改后的代碼如下:

由于CubeMX內置函數設置計數值的初始值為最大值,即我們一開始設置的可以達到的最大計數值為3,所以第一次復位后釋放信號量總是失敗,初始值為最大值說明已經釋放完畢,此時可以直接獲取成功,當全部被獲取后,計數值才從0開始,即此時可以正常釋放信號量直至設定的最大值,如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11478.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Springboot的滴答拍攝影

基于SpringbootVue的滴答拍攝影設計與實現 開發語言:Java數據庫:MySQL技術:SpringbootMybatis工具:IDEA、Maven、Navicat 系統展示 用戶登錄 首頁 攝影作品 攝影服務 攝影論壇 后臺登錄 后臺首頁 用戶管理 攝影師管理 攝影作…

YOLOv8小白中的小白安裝環境教程!沒一個字廢話,看一遍不踩坑!

文章目錄 去哪里下代碼?怎么下代碼?怎么裝環境?命令行界面(CLI)指令和Python腳本區別?附錄1 conda常用指令附錄2 git常用指令附錄3 項目代碼文件作用 去哪里下代碼? 下載代碼請大家直接去 YOLOv8的官方倉庫下載&#…

HTTP和HTTPS的區別和聯系

目錄 1. 簡介2. TLS 握手過程3. 常見的加密算法3.1 對稱加密算法3.2 非對稱加密算法 1. 簡介 HTTPS在HTTP的基礎上引入了一個TLS層,采用密文進行傳輸,結合對稱加密技術和非對稱加密技術來實現數據的安全性和完整性。 客戶端會生成隨機密鑰,…

讓 計算機 將 數學 公式 表達式 的計算過程繪制出來 【mathematical-expression(MAE)】

目錄 文章目錄 目錄介紹開始實戰引入數學表達式計算庫引入流程圖代碼生成庫開始進行生成 介紹 大家好 今天我們來分享一個新知識,將數學表達式的整個計算過程,以及計算繁多結果在 Java 中繪制出來,計算機中的數學表達式計算的功能很常見了&a…

react 對輸入做出反應與狀態

React 提供了一種操作 UI 的聲明性方式。您無需直接操作 UI 的各個部分,而是描述組件可能處于的不同狀態,并在它們之間切換以響應用戶輸入。 聲明式 UI 與命令式 UI 的比較 在設計 UI 交互時,可能會考慮 UI 如何響應用戶操作而更改。考慮一…

[C語言]總覽

目錄 1. 框架、默認數據類型 2. 分支結構 (1). if ... else ... (2). switch ... case ... 3. 循環結構 (1). while (2). for (3). do ... while 4. 函…

區塊鏈的跨鏈交互:從學校間交流看跨鏈技術

區塊鏈是一種去中心化的分布式賬本技術,它通過加密學和共識機制來確保數據的安全性和不可篡改性。每個區塊鏈就像一所獨立的學校,有自己的制度、學生和重點專業。它們各自運行,有時在同一領域展開不同的活動。隨著區塊鏈技術的不斷發展&#…

【組合博弈】Outcome Classes

Outcome Classes 一個游戲 G G G的outcome函數代表這個游戲最終的結果,就是說這個游戲最后的贏家是誰。outcome函數是一個從游戲 G G G映射到四個結果的函數,四個結果分別是 L , R , P , N L, R, P, N L,R,P,N。意義如下表: ClassNameDefin…

學習筆記:Adaptive Platform(AP)適配到RTOS

一、背景 1、AP版本 Adaptive Platform AUTOSAR R20-11版本標準支持C14。CM模塊支持DDS、SOME/IP協議 2、RTOS RTOS-A核,當前完全支持POSIX PSE51、POSIX PSE52接口,POSIX PSE53部分支持,POSIX PSE54基本不支持。詳細接口參考&#xff1a…

第十四天:PHP 開發,輸入輸出類留言板訪問 IPUA 頭來源

1.PHP-全局變量$_SERVER 2.MYSQL-插入語法INSERT 3.輸入輸出-XSS&反射&存儲 4.安全問題-XSS跨站&CSRF等 1.輸入輸出類安全問題 反射性xss 這個先準備一個數據,隨便弄一個表名字,在隨便弄一點數據存入即可 作為連接的數據庫&#xff0c…

排序-歸并排序(merge sort)

歸并排序(Merge Sort)是一種分而治之的算法,它將原始數組分成越來越小的子數組,直到每個子數組只有一個元素,然后將這些子數組兩兩合并,過程中保持排序狀態,最終合并成一個完全有序的數組。歸并…

《一》Word文字編輯軟件---架構設計分析

1,簡單介紹 今天,我們來模擬offic軟件中的word文檔,運行如圖: 運行程序后會出現主界面,頂端的菜單欄包括“文件”“編輯”“格式”“窗口”和“幫助五個主菜單。 菜單欄下面是工具欄,包含了系統常用的功能按…

如何判斷海外住宅ip的好壞?

在海外IP代理中,住宅IP屬于相對較好的資源,無論是用于工作、學習、還是娛樂,都能得到較好的使用效果。作為用戶,該如何判斷海外住宅IP的好壞呢? 穩定性與可靠性:海外住宅IP相比動態IP地址,通常具…

Java全局異常處理,@ControllerAdvice異常攔截原理解析【簡單易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目錄 一、全局異常處理器的類型1-1、實現方式一1-2、實現方式二 二、全局異常攔截點2-1、入口2-2、全局異常攔截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、執行3-1、解析3-2、執行 四、其它4-1、設…

電腦提示找不到ffmpeg.dll無法繼續執行代碼怎么辦?

電腦提示找不到找不到ffmpeg.dll無法繼續執行代碼怎么辦,有什么好的解決辦法,出現這樣的彈出就會導致軟件無法打開或者是異常關閉,找不到dll文件,是一個非常重要的電腦使用問題,會給使用者帶來許多的麻煩。那么找不到d…

LeetCode746:使用最小花費爬樓梯

題目描述 給你一個整數數組 cost ,其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用,即可選擇向上爬一個或者兩個臺階。 你可以選擇從下標為 0 或下標為 1 的臺階開始爬樓梯。 請你計算并返回達到樓梯頂部的最低花費。 代碼 …

MongoDB和AI 賦能行業應用:制造業和汽車行業

歡迎閱讀“MongoDB和AI 賦能行業應用”系列的第一篇。 本系列重點介紹AI應用于不同行業的關鍵用例,涵蓋制造業和汽車行業、金融服務、零售、電信和媒體、保險以及醫療保健行業。 隨著人工智能(AI)在制造業和汽車行業的集成,傳統…

CDN的工作原理及流程

CDN(Content Delivery Network,內容分發網絡)是一種構建在數據網絡上的分布式內容分發網絡。 CDN利用全局負載均衡技術,將用戶的訪問請求指向離用戶最近且工作正常的流媒體服務器上,由流媒體服務器直接響應用戶的請求…

Tableau學習2.0版——復習

官網下載鏈接:https://www.tableau.com/zh-cn/support/releases 學生賬戶申請鏈接:https://www.tableau.com/zh-cn/academic/students。直接去學信網下載學籍在線驗證作為申請證明。 目錄 1、可視化原理 2、基礎圖表制作 2.1 對比分析(比…

@游戲行業er!MongoDB廣州線下沙龍邀您報名!

隨著游戲和應用程序的發展,數據變得越來越重要。在為您的下一個游戲選擇數據庫時,數據庫管理者常常會面對靈活性、可擴展性、可靠性、運營效率等問題或挑戰。 MongoDB在游戲開發領域有著廣泛的應用,靈活數據模型可以存儲和處理各種類型的數據…