[FreeRTOS 功能應用] 互斥量 功能應用

文章目錄

    • 一、基礎知識點
    • 二、代碼講解
    • 三、結果演示
    • 四、代碼下載


一、基礎知識點

[FreeRTOS 基礎知識] 互斥量 概念
[FreeRTOS 內部實現] 互斥量

本實驗是基于STM32F103開發移植FreeRTOS實時操作系統,互斥量實戰操作。
使用工具:Keil、串口工具


二、代碼講解

1、使用xSemaphoreCreateMutex函數創建信號量

// 路徑:項目\Core\Src\freertos.c
// 全局變量
SemaphoreHandle_t g_Semaphore_Mutex;
g_Semaphore_Mutex= xSemaphoreCreateBinary( );

2、使用osThreadCreate創建任務
創建兩個任務優先級不同。

// 路徑:項目\Core\Src\freertos.c
// 全局變量
osThreadId Sender1_Handle;
osThreadId Seceiver_Handle;if ( g_Semaphore != NULL )
{// 創建兩個任務osThreadDef(Sender1, vSendTask, osPriorityHigh, 0, 1000);Sender1_Handle = osThreadCreate(osThread(Sender1), NULL);if( Sender1_Handle != NULL ){printf("Succeeded in creating Sender1_Handle Queue. Procedure!\n\r");}else{printf("Fail in creating Sender1_Handle Queue. Procedure!\n\r");}osThreadDef(Seceiver, vSeceiverTask, osPriorityNormal, 0, 1000);Seceiver_Handle = osThreadCreate(osThread(Seceiver), NULL);		if( Seceiver_Handle != NULL ){printf("Succeeded in creating Seceiver_Handle Queue. Procedure!\n\r");}else{printf("Fail in creating Seceiver_Handle Queue. Procedure!\n\r");}		
}

函數中通過osThreadDef 宏構建osThreadDef_t 結構體,名稱os_thread_def_##name(## 表示字符拼接),結構體成員包括 :#name 任務名稱;thread 任務處理函數;priority 任務優先級;instances 實例; stacksz 棧大小;

#define osThreadDef(name, thread, priority, instances, stacksz)  \
const osThreadDef_t os_thread_def_##name = \
{ #name, (thread), (priority), (instances), (stacksz), NULL, NULL }

將構建的osThreadDef_t 結構體傳入osThreadCreate函數中,實際調用xTaskCreate函數創建任務。

osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{TaskHandle_t handle;if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),&handle) != pdPASS)  {return NULL;} return handle;
}

3、Sender1 任務函數vSendTask 實現

void vSendTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask */int32_t i;/* Infinite loop */for(;;){/* 獲得互斥量: 上鎖 */xSemaphoreTake(g_Semaphore_Mutex, portMAX_DELAY);for (i = 0; i < 26; i++)printf("vSendTask ---- %d", i);printf("\r\n");		/* 釋放互斥量: 開鎖 */xSemaphoreGive(g_Semaphore_Mutex);vTaskDelay(pdMS_TO_TICKS(250));   // 延時250ms}	/* USER CODE END StartDefaultTask */
}

4、Seceiver任務函數 vSeceiverTask實現

void vSeceiverTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask */int32_t i;/* Infinite loop */for(;;){/* 獲得互斥量: 上鎖 */xSemaphoreTake(g_Semaphore_Mutex, portMAX_DELAY);for (i = 0; i < 34; i++)printf("vSeceiverTask ---- %d", i);printf("\r\n");		/* 釋放互斥量: 開鎖 */xSemaphoreGive(g_Semaphore_Mutex);vTaskDelay(pdMS_TO_TICKS(300));   // 延時300ms}	
}

三、結果演示

如下圖演示結果發現,兩個任務雖然優先級不同,但沒有發現有搶占的現象。若低優先級獲取到互斥鎖沒有釋放之前,高優先級任務獲取互斥鎖失敗后會提高低優先級的任務,等低優先級釋放鎖之后,高優先級才能獲取到鎖運行。
在這里插入圖片描述


四、代碼下載

[FreeRTOS] 互斥量 功能應用

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

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

相關文章

Rust變量綁定

變量綁定 Rust 通過靜態類型確保類型安全。變量綁定可以在聲明時說明類型&#xff0c;不過在多數情況下&#xff0c;編譯器能夠從上下文推導出變量的類型&#xff0c;從而大大減少了類型說明的工作。 使用 let 綁定操作可以將值&#xff08;比如字面量&#xff09;綁定&#…

全面解析智慧校園行政辦公的協作日程功能

在智慧校園的行政辦公生態系統中&#xff0c;協作日程功能成為促進團隊互動與工作同步的橋梁&#xff0c;它超越了傳統個人日程的范疇&#xff0c;強調的是集體效率與信息的無縫對接。這一功能設計的核心&#xff0c;在于創造一個開放而有序的平臺&#xff0c;讓教育工作者們能…

2-4 Softmax 回歸的從零開始實現

就像我們從零開始實現線性回歸一樣&#xff0c; 我們認為softmax回歸也是重要的基礎&#xff0c;因此應該知道實現softmax回歸的細節。 本節我們將使用剛剛在2-3節中引入的Fashion-MNIST數據集&#xff0c; 并設置數據迭代器的批量大小為256。 import torch from IPython impo…

【chtagpt】pytorch中的方法對象和屬性

文章目錄 定義一個簡單的類屬性和方法對象的區別PyTorch 張量中的屬性和方法對象進一步解釋總結self.value value 的解釋示例解釋總結 為了更好地理解方法對象和屬性&#xff0c;我們可以通過一個簡單的類來演示這兩者的區別及其用法。 定義一個簡單的類 我們定義一個名為 My…

開發個人Go-ChatGPT--1 項目介紹

開發個人Go-ChatGPT--1 項目介紹 開發個人Go-ChatGPT--1 項目介紹知識點大綱文章目錄項目地址 開發個人Go-ChatGPT–1 項目介紹 本文將以一個使用Ollama部署的ChatGPT為背景&#xff0c;主要還是介紹和學習使用 go-zero 框架&#xff0c;開發個人Go-ChatGPT的服務器后端&#…

主從復制原理及操作

主從復制的概念 主從復制是一種在數據庫系統中常用的數據備份和讀取擴展技術&#xff0c;通過將一個數據庫服務器&#xff08;主服務器&#xff09;上的數據變更自動同步到一個或多個數據庫服務器&#xff08;從服務器&#xff09;上&#xff0c;以此來實現數據的冗余備份、讀…

解決video.js在demo中可以播放,在已有項目中無限waiting的問題

video.js的是有推薦的和react一起使用的寫法的&#xff1a;https://videojs.com/guides/react/ 但是這個寫法在demo中可以正常播放&#xff0c;在放在現有的項目中則播不出來&#xff0c;也不報錯&#xff0c;就是log里顯示on waiting后就什么動靜都沒有了&#xff0c;頁面顯示…

貝葉斯學習中先驗分布的詳細解釋

在貝葉斯學習中&#xff0c;先驗分布&#xff08;Prior Distribution&#xff09;是一個非常重要的概念。它代表了在觀察到任何數據之前&#xff0c;對未知參數的初始信念或知識。先驗分布的選擇通常基于領域知識、歷史數據或者純粹的假設。 文章目錄 先驗分布的含義先驗分布的…

dtpay聚合支付系統在跨境支付場景中技術及業務方案

1 什么是跨境支付 我們從兩個維度來分析什么是跨境支付&#xff0c;第一個維度我們從資金流向分析&#xff0c;國內的消費者在境外進行消費對于國內資金流來說這屬于資金流出&#xff0c;這是跨境支付的第一種應用場景。第二個場景國外游客在國內進行消費&#xff0c;這屬于資…

昇思25天學習打卡營第11天 | LLM原理和實踐:基于MindSpore實現BERT對話情緒識別

1. 基于MindSpore實現BERT對話情緒識別 1.1 環境配置 # 實驗環境已經預裝了mindspore2.2.14&#xff0c;如需更換mindspore版本&#xff0c;可更改下面mindspore的版本號 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

js的作用域鏈

function test(){} 運行期上下文&#xff1a;當函數執行時&#xff0c;會創建一個稱為執行期上下文的內部對象。一個執行期上下文定義了一個函數執行時的環境&#xff0c;函數每次執行時對應的執行上下文都是 獨一無二的&#xff0c;所以多次調用一個函數對導致創建多個執行上下…

Linux 安裝pdfjam (PDF文件尺寸調整)

跟Ghostscript搭配使用&#xff0c;這樣就可以將不同尺寸的PDF調整到相同尺寸合并了。 在 CentOS 上安裝 pdfjam 需要安裝 TeX Live&#xff0c;因為 pdfjam 是基于 TeX Live 的。以下是詳細的步驟來安裝 pdfjam&#xff1a; ### 步驟 1: 安裝 EPEL 倉庫 首先&#xff0c;安…

springboot集成tika解析word,pdf,xls文件文本內容

介紹 Apache Tika 是一個開源的內容分析工具包&#xff0c;用于從各種文檔格式中提取文本和元數據。它支持多種文檔類型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文檔、圖像文件等。Tika 的主要功能包括內容檢測、文本提取和元數據提取。 官網 https…

python入門詳細介紹

Python 是一種廣泛使用的高級編程語言&#xff0c;以其清晰的語法和代碼可讀性而聞名。它支持多種編程范式&#xff0c;包括面向對象、命令式、函數式和過程式編程。Python 由 Guido van Rossum 于1989年底發明&#xff0c;第一個公開發行版發行于1991年。 Python 的特點&…

java-初始化Map快捷裝數據

*單個Map創建 Map<String, String> stringStringMap Collections.singletonMap("reason", "同意");使用匿名類初始化Map List<Map<String,Object>> mapListnew ArrayList<>();mapList.add(new HashMap<String, Object>() {…

基于STM32F407ZG的FreeRTOS移植

1.從FreeRTOS官網中下載源碼 2、簡單分析FreeRTOS源碼目錄結構 2.1、簡單分析FreeRTOS源碼根目錄 &#xff08;1&#xff09;Demo&#xff1a;是官方為一些單片機移植FreeRTOS的例程 &#xff08;2&#xff09;License&#xff1a;許可信息 &#xff08;3&#xff09;Sourc…

《中國品牌網》揭秘格行品牌崛起之路:如何從混亂市場中殺出重圍,領跑未來?

在隨身WiFi行業亂象叢生的背景下&#xff0c;格行品牌憑借其獨特的經營理念和長期主義的精神&#xff0c;逐漸嶄露頭角&#xff0c;成為行業的領跑者。近日&#xff0c;《中國品牌網》記者專訪了格行品牌的創始人劉永先先生&#xff0c;就他的經營理念、市場策略以及未來展望進…

如何在 Odoo 16 中對 Many2Many 字段使用 Group by

Many2many 字段與 Many2one 字段類似,因為它們在模型之間建立了新的關系。在Odoo 16中,您無法按 many2many 字段分組,因為可以使用 many2many 記錄選擇任何記錄。當您使用 many2many 字段給出 group by 過濾器時,您將遇到斷言錯誤。 介紹如何在 Odoo 16 中使用 Many2Many…

AIGC | 為機器學習工作站安裝NVIDIA 4070 Ti Super顯卡驅動

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] 0x00 前言簡述 話接上篇《AIGC | Ubuntu24.04桌面版安裝后必要配置》文章&#xff0c;作為作者進行機器學習的基礎篇&#xff08;筑基期&#xff09;&#xff0c;后續將主要介紹機器學習環境之如何…

6-google::protobuf命名空間下常用的C++ API----repeated_field.h

#include <google/protobuf/repeated_field.h> namespace google::protobuf 所生成的協議消息類使用RepeatedField和RepeatedPtrField來操作重復字段。 這些類與STL的vector非常相似&#xff0c;但包含了許多優化&#xff0c;這些優化被發現特別適用于協議緩沖區的情況。…