Hi3861 OpenHarmony嵌入式應用入門--LiteOS Semaphore做同步使用

信號量作為同步使用

創建一個Semaphore對象,并指定一個初始的計數值(通常稱為“許可”或“令牌”的數量)。這個計數值表示當前可用的資源數量或可以同時訪問共享資源的線程數。當一個線程需要訪問共享資源時,它會嘗試從Semaphore對象中獲取一個許可。如果Semaphore的當前計數值大于0,線程會立即獲得一個許可,并且計數值減1。線程現在可以安全地訪問共享資源。如果Semaphore的當前計數值為0(表示沒有可用的許可),線程會被阻塞(掛起),直到有其他線程釋放一個許可。acquire方法通常支持超時機制,即線程在嘗試獲取許可時可以指定一個超時時間。如果在這個時間內沒有獲取到許可,線程可以選擇繼續等待、拋出異常或返回表示失敗的狀態。當線程完成對共享資源的訪問后,它會釋放之前獲取的許可。線程通過調用Semaphore對象的release方法來釋放許可。這個方法會將Semaphore的計數值加1,表示有一個新的許可可用。如果有其他線程正在等待獲取許可,release方法會喚醒其中一個線程,并使其能夠繼續執行。

Semaphore API

API名稱

說明

osSemaphoreNew

創建并初始化一個信號量

osSemaphoreGetName

獲取一個信號量的名字

osSemaphoreAcquire

獲取一個信號量的令牌,若獲取不到,則會超時返回

osSemaphoreRelease

釋放一個信號量的令牌,但是令牌的數量不超過初始定義的的令牌數

osSemaphoreGetCount

獲取當前的信號量令牌數

osSemaphoreDelete

刪除一個信號量

代碼編寫

修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. import("//build/lite/config/component/lite_component.gni")lite_component("demo") {features = [#"base_00_helloworld:base_helloworld_example",#"base_01_led:base_led_example",#"base_02_loopkey:base_loopkey_example",#"base_03_irqkey:base_irqkey_example",#"base_04_adc:base_adc_example",#"base_05_pwm:base_pwm_example",#"base_06_ssd1306:base_ssd1306_example",#"kernel_01_task:kernel_task_example",#"kernel_02_timer:kernel_timer_example",#"kernel_03_event:kernel_event_example",#"kernel_04_mutex:kernel_mutex_example",#"kernel_05_semaphore_as_mutex:kernel_semaphore_as_mutex_example","kernel_06_semaphore_for_sync:kernel_semaphore_for_sync_example",]
}

創建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_06_semaphore_for_sync文件夾

文件夾中創建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_06_semaphore_for_sync\kernel_semaphore_as_mutex_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_06_semaphore_for_sync\BUILD.gn文件

# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. static_library("kernel_semaphore_for_sync_example") {sources = ["kernel_semaphore_for_sync_example.c"]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis",]
}
/** Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"osThreadId_t Task1_ID;        //  任務1 ID
osThreadId_t Task2_ID;        //  任務2 ID
osSemaphoreId_t Semaphore_ID; // 信號量ID
#define TASK_STACK_SIZE 1024
#define TASK1_DELAY_TIME 1
#define TASK2_DELAY_TIME 2/*** @description: 任務1* @param {*}* @return {*}*/
void Task1(void)
{while (1) {osSemaphoreAcquire(Semaphore_ID, osWaitForever); // 請求信號量 -1printf("Task 1 osSemaphore Acquire <=====\n");sleep(TASK1_DELAY_TIME);}
}
/*** @description: 任務2* @param {*}* @return {*}*/
void Task2(void)
{while (1) {osSemaphoreRelease(Semaphore_ID); // 釋放信號量 +1printf("Task 2 osSemaphore Release =====>\n");sleep(TASK2_DELAY_TIME);}
}
/*** @description: 初始化并創建任務* @param {*}* @return {*}*/
static void kernel_sync_semaphore_example(void)
{printf("Enter kernel_sync_semaphore_example()!\n");// 創建信號量Semaphore_ID = osSemaphoreNew(1, 0, NULL); // 參數: 最大計數值,初始計數值,參數配置if (Semaphore_ID != NULL) {printf("ID = %d, Create Semaphore_ID is OK!\n", Semaphore_ID);}osThreadAttr_t taskOptions;taskOptions.name = "Task1";              // 任務的名字taskOptions.attr_bits = 0;               // 屬性位taskOptions.cb_mem = NULL;               // 堆空間地址taskOptions.cb_size = 0;                 // 堆空間大小taskOptions.stack_mem = NULL;            // 棧空間地址taskOptions.stack_size = TASK_STACK_SIZE;           // 棧空間大小 單位:字節taskOptions.priority = osPriorityNormal; // 任務的優先級Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &taskOptions); // 創建任務1if (Task1_ID != NULL) {printf("ID = %d, Create Task1_ID is OK!\n", Task1_ID);}taskOptions.name = "Task2";                                        // 任務的名字taskOptions.priority = osPriorityNormal;                           // 任務的優先級Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &taskOptions); // 創建任務2if (Task2_ID != NULL) {printf("ID = %d, Create Task2_ID is OK!\n", Task2_ID);}
}
SYS_RUN(kernel_sync_semaphore_example);

使用build,編譯成功后,使用upload進行燒錄。

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

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

相關文章

加油站可視化:打造智能化運營與管理新模式

智慧加油站可視化通過圖撲 HT 構建仿真的三維模型&#xff0c;將加油站的布局、設備狀態、人員活動等信息動態呈現。管理者可以通過直觀的可視化界面實時監控和分析運營狀況&#xff0c;快速做出決策&#xff0c;提高管理效率和安全水平&#xff0c;推動加油站向智能化管理轉型…

后端之路第三站(Mybatis)——結合案例講Mybatis怎么操作sql

先講一下準備工作整體流程要做什么 我們要基于一個員工管理系統作為案例&#xff0c;進行員工信息的【增、刪、改、查】 原理就是用Mybatis通過java語言來執行sql語句&#xff0c;來達到【增、刪、改、查】 一、準備工作 1、引入數據庫數據 首先我們把一個員工、部門表的數…

【51單片機入門】速通定時器

文章目錄 前言定時器是什么初始化定時器初始化的大概步驟TMOD寄存器C/T寄存器 觸發定時器中斷是什么中斷函數定時器點亮led 總結 前言 在嵌入式系統的開發中&#xff0c;定時器是一個非常重要的組成部分。它們可以用于產生精確的時間延遲&#xff0c;或者在特定的時間間隔內觸…

對外發布的PDF文檔進行數字證書簽名的重要性?

對外發布的PDF文檔進行數字證書簽名具有以下幾個重要性&#xff1a; 身份驗證&#xff1a;數字簽名可以證明文檔的來源&#xff0c;即確認文檔的簽署者身份。這如同在紙質文檔上手寫簽名或加蓋公章&#xff0c;但更安全可靠&#xff0c;因為數字簽名是基于加密技術&#xff0c;…

Java--常用類APl(復習總結)

前言: Java是一種強大而靈活的編程語言&#xff0c;具有廣泛的應用范圍&#xff0c;從桌面應用程序到企業級應用程序都能夠使用Java進行開發。在Java的編程過程中&#xff0c;使用標準類庫是非常重要的&#xff0c;因為標準類庫提供了豐富的類和API&#xff0c;可以簡化開發過…

【接口自動化測試】第三節.實現項目核心業務接口自動化

文章目錄 前言一、實現登錄接口對象封裝和調用 1.0 登錄接口的接口測試文檔 1.1 接口對象層&#xff08;封裝&#xff09; 1.2 測試腳本層&#xff08;調用&#xff09;二、課程新增接口對象封裝和調用 2.0 課程新增接口的接口測試文檔 2.1 接口對象層…

AVL樹模擬

1.概念 雖然二叉搜索樹可以縮短查找的效率&#xff0c;但如果數據有序或者接近有序時二叉搜索樹樹將退化為單支樹&#xff0c;查找元素相當于在順序表中搜索元素&#xff0c;效率低下。AVL 樹是具有一下性質的二叉搜索樹&#xff1a; 1.它的左右子樹都是AVL樹 2.左右子…

Mac 如何安裝 wget

1.安裝 Homebrew2.安裝 wget3.檢測 wget 是否安裝成功 1.安裝 Homebrew 在安裝 wget 之前需要安裝一個適用于 mac 的包管理器 Homebrew&#xff0c;打開 mac 終端執行如下命令進行安裝&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/h…

【Git】GitIgnore不生效

這里可能有兩種原因&#xff0c;一個沒有刷新Git緩存&#xff0c;二是Git忽略規則有問題 更新Git緩存 git rm -r --cached . git add . git commit -m "modify git ignore rule"Ignore規則 檢查下忽略文件的目錄表示是否正確 XXX忽略任意目錄下名為XXX的文件 …

新手第一個漏洞復現:MS17-010(永恒之藍)

文章目錄 漏洞原理漏洞影響范圍復現環境復現步驟 漏洞原理 漏洞出現在Windows SMB v1中的內核態函數srv!SrvOs2FeaListToNt在處理FEA&#xff08;File Extended Attributes&#xff09;轉換時。該函數在將FEA list轉換成NTFEA&#xff08;Windows NT FEA&#xff09;list前&am…

【Golang - 90天從新手到大師】Day14 - 方法和接口

一&#xff0e; go方法 go方法&#xff1a;在函數的func和函數名間增加一個特殊的接收器類型&#xff0c;接收器可以是結構體類型或非結構體類型。接收器可以在方法內部訪問。創建一個接收器類型為Type的methodName方法。 func (t Type) methodName(parameter list) {}go引入…

在 MATLAB 中顯示 3D 圖像

文章目錄 前言1. 曲面圖 (Surface Plot)2. 網格圖 (Mesh Plot)3. 散點圖 (Scatter Plot)4. 等值線圖 (Contour Plot) 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 項目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例…

享元模式(設計模式)

享元模式&#xff08;Flyweight Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過共享細粒度對象來減少內存使用&#xff0c;從而提高性能。在享元模式中&#xff0c;多個對象可以共享相同的狀態以減少內存消耗&#xff0c;特別適合用于大量相似對象的場景。 享元模…

解決“Duplicate keys detected: ‘ ‘.This may cause an update error.”問題

問題原因 出現“Duplicate keys detected”的錯誤&#xff0c;通常表示在v-for指令中使的:key綁定值有重復。 如果前端是靜態數據&#xff0c;一般能自我避免:key綁定值有重復。如果前端是綁定的動態數據&#xff0c;那么需要另外提供一個唯一的鍵。 在這個例子中&#xff0c…

【LeetCode】接雨水

目錄 一、題目二、解法完整代碼 一、題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff…

面向對象,常用類,集合,異常,JDBC,mysql數據庫內容的復習,

1&#xff0c;面向對象 面向對象與面向過程對比 面向過程&#xff1a;關注過程&#xff0c;適合解決簡單直接的問題&#xff0c;代碼結構以函數為單位&#xff0c;如C語言。 面向對象&#xff1a;關注類&#xff0c;適合解決復雜問題更加適合解決復雜的項目中的問題等等&…

跨平臺編程:在Conda中搭建R語言環境的終極指南

&#x1f310; 跨平臺編程&#xff1a;在Conda中搭建R語言環境的終極指南 &#x1f310; 在數據科學和統計分析領域&#xff0c;R語言以其強大的數據處理能力和豐富的圖形表示功能而廣受歡迎。然而&#xff0c;對于習慣了使用Linux操作系統的用戶來說&#xff0c;如何方便地在…

【UML用戶指南】-23-對高級行為建模-狀態機

目錄 1、概述 2、狀態 2.1、狀態的組成 3、轉移 3.1、轉移的組成 4、高級狀態和轉移 4.1、進入效應和退出效應 4.2、內部轉移 4.3、do活動 4.4、延遲事件 4.5、子狀態機 5、子狀態 5.1、非正交子狀態 5.2、歷史狀態 5.3、正交子狀態 6、分叉與匯合 7、主動對象…

GOROOT GOPATH GOPROXY GO111MODULE

GOROOT GOROOT代表Go的安裝目錄。可執行程序go(或go.exe)和gofmt(或gofmt.exe)位于 GOROOT/bin目錄中。 配置GOROOT環境變量&#xff0c;其值為Go的安裝目錄&#xff1b;然后在環境變量PATH中添加GOROOT/bin路徑。 注意&#xff1a;GOROOT變量只是代表了安裝目錄&#xff0c;不…

泛型的實際應用示例

泛型的實際應用示例 1. 集合框架中的泛型 在Java的集合框架中&#xff0c;泛型被廣泛使用以確保類型安全并減少運行時錯誤。以下是一個使用泛型ArrayList的示例&#xff1a; java import java.util.ArrayList; import java.util.List; public class GenericCollectionsExamp…