FreeRTOS_信號量_學習筆記

信號量的特性

消息隊列用于傳輸多個數據,但是有時候我們只需要傳遞狀態,這個狀態值需要用一個數值表示。套用隊列筆記中的流水線例子,可以理解為流水線上工件的數量。
信號:起通知作用
量:還可以用來表示資源的數量
當"量"沒有限制時,它就是"計數型信號量"(Counting Semaphores)
當"量"只有0、1兩個取值時,它就是"二進制信號量"(Binary Semaphores)
支持的動作:"give"給出資源,計數值加1;"take"獲得資源,計數值減1。
在這里插入圖片描述

隊列信號量
數據存儲可容納多個數據。創建時要分配隊列結構體和存儲數據的空間只有計數值。創建時只需要分配信號量結構體
生產者沒有空間存入時可以阻塞不阻塞,計數值最大時返回失敗
消費者沒有數據時可阻塞計數值最小時可阻塞

信號量分為二進制信號量和計數型信號量。二進制信號量初始值為0,計數型信號量的最大值不是1。

信號量函數

創建

 // 動態創建二進制信號量
SemaphoreHandle_t xSemaphoreCreateBinary( void );// 靜態創建二進制信號量
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );//動態創建計數型信號量
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);
//靜態創建計數型信號量
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );

刪除

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

存取

/*在任務中使用*/
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
/*在中斷中使用*/
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);

xSemaphore:信號量句柄
*pxHigherPriorityTaskWoken:如果在信號量操作中喚醒了一個更高優先級的任務,會被設置為 pdTRUE,否則為pdFALSE

/*在任務中使用*/
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);
/*在中斷中使用*/
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);

xTicksToWait:阻塞的時間

信號量實驗

模擬車輛進站,假設車輛要有票才能同行,用一個信號量來模擬總共有多少票。當有票的時候,車拿走一張并開出,當其到達終點,就把票放回票倉,下一輛車再開出。

static SemaphoreHandle_t g_xSemTicks; 
static uint32_t g_xres, g_yres, g_bpp;
static uint8_t *g_framebuffer;
// 定義汽車結構體,包括位置和控制鍵
struct car {int x;int y;int control_key;
};
// 定義三輛汽車的初始位置和控制鍵
struct car g_cars[3] = {{0, 0, IR_KEY_1},{0, 17, IR_KEY_2},{0, 34, IR_KEY_3},
};
// 汽車圖片的二進制數據
static const byte carImg[] = {0x40,0xF8,0xEC,0x2C,0x2C,0x38,0xF0,0x10,0xD0,0x30,0xE8,0x4C,0x4C,0x9C,0xF0,0x02,0x1F,0x37,0x34,0x34,0x1C,0x0F,0x08,0x0B,0x0C,0x17,0x32,0x32,0x39,0x0F,
};
// 清除區域的圖像數據,用于隱藏汽車
static const byte clearImg[30] = {0};
// 顯示汽車
static void ShowCar(struct car *pcar)
{draw_bitmap(pcar->x, pcar->y, carImg, 15, 16, false, 0);draw_flushArea(pcar->x, pcar->y, 15, 16);
}
// 隱藏汽車
static void HideCar(struct car *pcar)
{draw_bitmap(pcar->x, pcar->y, clearImg, 15, 16, false, 0);draw_flushArea(pcar->x, pcar->y, 15, 16);
}// 每輛汽車的任務
static void CarTask(void *params)
{struct car *pcar = params;// 任務開始時等待信號量,以同步啟動所有車輛xSemaphoreTake(g_xSemTicks, portMAX_DELAY);while (1){if (pcar->x < g_xres - CAR_LENGTH){HideCar(pcar);  // 隱藏汽車以更新位置// 更新汽車位置pcar->x += 1;ShowCar(pcar);  // 顯示新位置的汽車vTaskDelay(50); // 控制更新頻率if (pcar->x == g_xres - CAR_LENGTH){xSemaphoreGive(g_xSemTicks); // 到達屏幕邊緣時釋放信號量并結束任務vTaskDelete(NULL);}}}
}
// 主游戲函數,初始化并啟動任務
void car_game(void)
{g_framebuffer = LCD_GetFrameBuffer(&g_xres, &g_yres, &g_bpp);draw_init();draw_end();// 創建信號量,開始計數為2,最大計數為3g_xSemTicks = xSemaphoreCreateCounting(3, 2);// 創建每輛汽車的任務xTaskCreate(CarTask, "car1", 128, &g_cars[0], osPriorityNormal, NULL);xTaskCreate(CarTask, "car2", 128, &g_cars[1], osPriorityNormal, NULL);xTaskCreate(CarTask, "car3", 128, &g_cars[2], osPriorityNormal, NULL);	
}

可以通過改變g_xSemTicks = xSemaphoreCreateCounting(3, 2);的參數,來改變有多少張票。

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

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

相關文章

打印機手動雙面打印技巧

一、WORD和PDF &#xff08;1&#xff09;首先選擇要打印的頁面范圍&#xff0c;然后選擇僅奇數頁打印 &#xff08;2&#xff09;將打印完的紙張翻過來&#xff0c;白紙朝上&#xff0c;紙張的頭部先放入打印機 &#xff08;3&#xff09;選擇要打印的頁面范圍&#xff0c;然…

oracle.jdbc.OracleDatabaseException: ORA-00911: 無效字符

先吐槽一句&#xff0c;oracle 真坑啊&#xff01; 一個很正常的sql 語句一直報 ORA-00911: 無效字符 &#xff0c;拿到數據庫去執行一點問題沒有&#xff0c;一運行代碼就報錯&#xff0c;然后一個字符一個字符的對比&#xff0c;竟然是因為sql 結尾的一個 ";" 導致…

TP6開發文檔概述

TP6&#xff08;ThinkPHP 6&#xff09;是一個使用PHP語言開發的快速、兼容且簡單的面向對象開發框架。以下是一個簡化的TP6開發文檔概述&#xff0c;涵蓋了核心功能和一些常用方法&#xff1a; 一、環境準備 PHP安裝&#xff1a;確保已經安裝了與TP6兼容的PHP版本。 Composer…

PHPIPAM在建立數據庫階段報錯

如題&#xff0c;參考大佬的操作IP地址管理系統phpipam部署-CSDN博客搭建PHPIPAM&#xff0c;不過我沒有選擇1.4&#xff0c;而是直接搭建了1.6版本&#xff0c;一切順利&#xff0c;到了最后建立數據庫階段&#xff0c;輸入數據庫賬號和密碼后提示Cannot install sql SCHEMA f…

大模型部署_書生浦語大模型 _作業2

本節課可以讓同學們實踐 4 個主要內容&#xff0c;分別是&#xff1a; 1、部署 InternLM2-Chat-1.8B 模型進行智能對話 1.1安裝依賴庫&#xff1a; pip install huggingface-hub0.17.3 pip install transformers4.34 pip install psutil5.9.8 pip install accelerate0.24.1…

Elasticsearch之文本分析

文本分析基本概念 官網&#xff1a;Text analysis | Elasticsearch Guide [7.17] | Elastic 官網稱為文本分析&#xff0c;這是對文本進行一直分析處理的方式&#xff0c;基本處理邏輯是為按照預先制定的分詞規則&#xff0c;把原本的文檔進行分割成多個小顆粒度的詞項&#x…

Python pands使用引擎實現excel條件格式

截至我的知識更新日期&#xff08;2023年&#xff09;&#xff0c;Pandas 庫本身并不直接支持Excel條件格式。Pandas 是一個強大的Python數據分析庫&#xff0c;它主要用于數據分析和操作&#xff0c;而不是用于創建或編輯Excel文件的格式。 然而&#xff0c;你可以使用 openp…

如何給出好的“文言一心”指令?

一、文言一心是什么&#xff1f; 在現代技術背景下&#xff0c;“文言一心”還是百度公司創建的一款大語言模型。這款模型基于飛槳深度學習平臺和文心知識增強大模型&#xff0c;并擁有強大的中文語料庫&#xff0c;可以理解和生成富含文化內涵和哲理的文本內容。其核心技術架構…

社區醫院|基于SprinBoot+vue的社區醫院管理服務系統(源碼+數據庫+文檔)

社區醫院管理服務系統 目錄 基于SprinBootvue的社區醫院管理服務系統 一、前言 二、系統設計 三、系統功能設計 1系統功能模塊 2管理員功能模塊 3用戶功能模塊 4醫生功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取…

看花眼,眼花繚亂的主食凍干到底應該怎么選?靠譜的主食凍干分享

隨著科學養貓知識的普及&#xff0c;主食凍干喂養越來越受到養貓人的青睞。主食凍干不僅符合貓咪的飲食天性&#xff0c;還能提供均衡的營養&#xff0c;有助于維護貓咪的口腔和消化系統健康。許多貓主人認識到了主食凍干喂養的諸多益處&#xff0c;計劃嘗試這種喂養方式&#…

學英語材料:單口喜劇、講故事、短劇喜劇以及廣播劇和播客節目

學習英語節目 有名的單口喜劇、講故事、短劇喜劇以及廣播劇和播客節目&#xff1a; 單口喜劇&#xff08;Stand-up Comedy&#xff09; 描述&#xff1a;這是最接近相聲的形式&#xff0c;表演者獨自一人站在舞臺上&#xff0c;用幽默的方式講述個人經歷、觀察到的社會現象或…

C++面向對象程序設計 - 標準輸出流

在C中&#xff0c;標準輸出流通常指的是與標準輸出設備&#xff08;通常是終端或控制臺&#xff09;相關聯的流對象。這個流對象在C標準庫中被定義為std::cout、std::err、std::clog&#xff0c;它們是std::ostream類的一個實例。 一、cout&#xff0c;cerr和clog流 ostream類…

echarts(6大基礎圖表)的使用

目錄 一、vue2掛載 二、柱狀圖 2.1、基礎柱狀圖介紹 2.2、標記&#xff1a;最大值\最小值(markPoint)、平均值(markLine) 2.3、顯示&#xff1a;數值顯示(label)、柱子寬度(barWidth)、橫向柱狀圖 三、折線圖 3.1、標記&#xff1a;最大值\最小值(markPoint)、平均值(ma…

R可視化:組間點圖比較

散點組間比較 散點組間比較 介紹 ggplot2繪制散點組間比較加載R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE)library(tidyverse) library(ggplot2) library(ggprism) library(ggbeeswarm) library(rstatix)rm(list = ls()) options(stringsAsFactors = F) o…

android11禁止進入屏保和自動休眠

應某些客戶要求&#xff0c;關閉了開機進入屏保&#xff0c;一段時間會休眠的問題。以下diff可供參考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

Python3 筆記:repr() 函數

repr() 函數將對象轉化為供解釋器讀取的形式。 語法&#xff1a; repr(object) 返回一個對象的 string 格式。 tuple1 (1,2,3) print(type(repr((tuple1)))) # 運行結果&#xff1a;<class str> repr(str)與在字符串前加上“r”或“R”的原理有點相似&#xff0c;但…

node模塊的本質

對于一個模塊而言&#xff0c;有兩個關鍵的地方&#xff0c;一是有自己的作用域&#xff0c;二是有對外暴露的接口 不知道大家有沒有想過這樣一個問題&#xff0c;模塊是怎么實現上面兩個特性的呢&#xff1f;其實通過一個 立即執行函數 就可以了 實際上 Node 在編譯的時候&a…

常見5大開發進度盲點問題及解決方案

在軟件開發項目中&#xff0c;識別并解決常見的進度管理盲點問題&#xff0c;對于確保項目按時、按預算、高質量完成至關重要。它直接關系到項目能否順利進行&#xff0c;忽視任何一個問題&#xff0c;都可能導致項目延期、成本超支、質量下降&#xff0c;甚至項目失敗。 因此&…

IT技術培訓班:實用還是虛幻?

在學習IT技術的過程中&#xff0c;我經常被各種五花八門的技術培訓班所安利。這些培訓班以各種方式向我宣傳&#xff0c;聲稱可以快速提升技能、獲得認證、找到高薪工作等&#xff0c;讓我不禁懷疑&#xff1a;在培訓班里學技術真的有用嗎&#xff1f;我對此抱有怎樣的態度呢&a…

香橙派華為昇騰CANN架構編譯opencv4.9

香橙派華為升騰AI盒子 為啥要編譯opencv4.9.0&#xff0c; 因為在4.9.0 中增加了華為昇騰CANN的外接開發庫&#xff0c;下圖為盒子外觀&#xff0c;此次一接到這個盒子&#xff0c;立刻開始開箱操作&#xff0c;首先就是要編譯opencv4.9&#xff0c;以前在香橙派3588 的盒子中…