Hi3861 OpenHarmony嵌入式应用入门--LiteOS semaphore作为锁

CMSIS 2.0 接口中的 Semaphore(信号量)是用于嵌入式系统中多线程或中断服务例程(ISR)之间同步和共享资源保护的重要机制。Semaphore 是一种用于控制对多个共享资源访问的同步机制。它可以被看作是一个计数器,用于跟踪可用资源的数量。

特性

计数信号量:Semaphore 可以作为计数信号量使用,管理多个相同类型的资源。例如,如果有多个 DMA 通道,可以使用 Semaphore 来限制同时访问这些通道的数量。

生产者/消费者信号量:Semaphore 也可以用于实现生产者和消费者之间的同步,确保在消费者准备好之前,生产者不会覆盖数据。

Semaphore在并发编程中确实可以作为一种锁来使用,用于控制多个线程对共享资源的访问。首先,你需要确定在任意时刻能够同时访问共享资源的最大线程数,并将这个数作为初始值来创建一个Semaphore对象。这个初始值通常表示许可的数量,每个许可允许一个线程访问共享资源。当线程想要访问共享资源时,它应该首先调用Semaphore对象的osSemaphoreAcquire()方法。这个方法会尝试从Semaphore中获取一个许可。如果Semaphore中有可用的许可(即计数器的值大于0),那么线程会立即获取一个许可并继续执行。如果没有可用的许可(即计数器的值为0),那么线程将被阻塞,直到有可用的许可。一旦线程成功获取到许可,它就可以安全地访问共享资源了。在访问期间,线程可以执行任何需要的操作。当线程完成对共享资源的访问后,它应该调用Semaphore对象的osSemaphoreRelease()方法来释放之前获取的许可。这个方法会将Semaphore的计数器加1,表示有一个新的许可可用。其他等待的线程(如果有的话)现在可能会获取到这个许可并继续执行。

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",]
}

创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_05_semaphore_as_mutex文件夹

文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_05_semaphore_as_mutex\kernel_semaphore_as_mutex_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_05_semaphore_as_mutex\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_as_mutex_example") {sources = ["kernel_semaphore_as_mutex_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
uint8_t buff[20] = {0};       // 定义一个共享资源
#define TASK_STACK_SIZE 1024
#define TASK_DELAY_TIME 1 // s/*** @description: 任务1* @param {*}* @return {*}*/
void Task1(void)
{int i = 0;while (1) {printf("[info] enter Task 1.......\n");osSemaphoreAcquire(Semaphore_ID, osWaitForever); // 请求信号量 -1// 操作共享数据 写数据printf("[info] write Buff Data: \n");for (i = 0; i < sizeof(buff); i++) {buff[i] = i;}printf("\n");osSemaphoreRelease(Semaphore_ID); // 释放信号量 +1sleep(TASK_DELAY_TIME);}
}
/*** @description: 任务2* @param {*}* @return {*}*/
void Task2(void)
{int i = 0;while (1) {printf("enter Task 2.......\n");osSemaphoreAcquire(Semaphore_ID, osWaitForever); // 请求信号量 -1// 操作共享数据 读数据printf("[info] read Buff Data: \n");for (i = 0; i < sizeof(buff); i++) {printf("%d \n", buff[i]);}printf("\n");osSemaphoreRelease(Semaphore_ID); // 释放信号量 +1sleep(TASK_DELAY_TIME);}
}
/*** @description: 初始化并创建任务* @param {*}* @return {*}*/
static void kernel_mutex_semaphore_example(void)
{printf("Enter kernel_mutex_semaphore_example()!\n");// 创建信号量Semaphore_ID = osSemaphoreNew(1, 1, 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_mutex_semaphore_example);

使用build,编译成功后,使用upload进行烧录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理,网络安全,软件工程等上机报告

这些都是学长们当年的战斗&#xff0c;如果需要的话后台联系我

【从0实现React18】 (六) 完成commit提交流程并初步实现react-dom包,完成首屏渲染测试

前面&#xff0c;我们提到 React 更新流程有四个阶段&#xff1a; 触发更新&#xff08;Update Trigger&#xff09;调度阶段&#xff08;Schedule Phase&#xff09;协调阶段&#xff08;Reconciliation Phase&#xff09;提交阶段&#xff08;Commit Phase&#xff09; 之前…

并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向 主要方向在于优化算法和将硬件的性能发挥到极致想要发挥出更多的硬件性能&#xff0c;最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率操作系统已经解决了磁盘和网卡的利用率问题&#xff0c;利用中断机制还能避免 CPU 轮询 I/O 状态&#xff0c;也提…

【机器学习】在【R语言】中的应用:结合【PostgreSQL数据库】的【金融行业信用评分模型】构建

目录 1.数据库和数据集的选择 1.准备工作 2.PostgreSQL安装与配置 3.R和RStudio安装与配置 2.数据导入和预处理 1.连接数据库并导入数据 1.连接数据库 2.数据检查和清洗 1.数据标准化 2.拆分训练集和测试集 3.特征工程 1.生成新特征 2.特征选择 4.模型训练和评估…

使用Tailwindcss之后,vxe-table表头排序箭头高亮消失的问题解决

环境 vue2.7.8 vxe-table3.5.9 tailwindcss/postcss7-compat2.2.17 postcss7.0.39 autoprefixer9.8.8 问题 vxe-table 表格表头 th 的排序箭头在开启正序或逆序排序时&#xff0c;会显示蓝色高亮来提示用户表格数据处在排序情况下。在项目开启运行了tailwindcss之后&#xff0…

数据集的未来:如何利用亮数据浏览器提升数据采集效率

目录 一、跨境电商的瓶颈1、技术门槛2、语言与文化差异3、网络稳定性4、验证码处理和自动识别5、数据安全6、法规和合规 二、跨境电商现在是一个合适的商机吗&#xff1f;三、数据集与亮数据浏览器1、市场分析2、价格监控3、产品开发4、供应链优化5、客户分析 四、亮数据浏览器…

上海计算机学会2020年3月月赛C++丙组T4连乘问题

题目描述 给定 a1​,a2​,⋯,an​&#xff0c;请计算一组乘积&#xff0c;记为P1​,P2​,⋯,Pn​&#xff0c;其中 Pi​ 的定义如下&#xff1a; 也就是说&#xff0c;Pi​ 是 a1​ 到 an​ 的连乘再除去 ai​。由于答案可能比较大&#xff0c;输出每个 Pi​ 模 10000 的余数。…

算法05 模拟算法之二维数组相关内容详解【C++实现】

大家好&#xff0c;我是bigbigli&#xff0c;前面一节我们一节讲过一维数组的模拟了&#xff0c;如果还没看的话&#xff0c;可以&#x1f449;点击此处。模拟算法还有很多内容需要讲&#xff0c;比如图像、日期相关的模拟算法&#xff0c;后续将继续更新&#xff0c;今天先来讲…

代码随想录——跳跃游戏Ⅱ(Leetcode 45)

题目链接 贪心 class Solution {public int jump(int[] nums) {if(nums.length 1){return 0;}int count 0;// 当前覆盖最远距离下标int curDistance 0;// 下一步覆盖距离最远下标int nextDistance 0;for(int i 0; i < nums.length; i){nextDistance Math.max(nums[…

快速修复mfc100u.dll丢失解决方案

相连文章&#xff1a;SecureCRT的安装破解 [详细过程2024] 有小伙伴向我反馈在打开SecureFX注册机之后显示【mfc100u.dll找不到】重装之后也没有用&#xff0c;这个是因为Microsoft Visual C的运行时组件和库出现了错误&#xff0c;直接选择重新安装就可以 出现这种情况的原因…

高性能并行计算华为云实验五:PageRank算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变…

MySQL——联表查询JoinON详解

Join 对比&#xff08;7种&#xff09; 代码演示&#xff1a; -- 查询参加了考试的同学&#xff08;学号&#xff0c;姓名&#xff0c;科目编号&#xff0c;分数&#xff09; SELECT * FROM student SELECT * FROM result/* 1. 分析需求&#xff1a;分析查询的字段来自哪些表&…

spring原理篇

第三方bean默认为方法名 自动配置 自动配置的原理 springboot的自动配置原理 首先是从 SpringBootApplication这个注解出发 有一个ComponentScan()默认扫描同级包及其子包 第二个注解是springbootconfiguration 声明当前类是一个配置类 第三个是核心 enableAutoConfigurati…

通过看板系统管理工作流程:强调持续交付与可视化工作的全面指南

目录 前言1. 看板系统简介1.1 看板系统的基本原理1.2 看板系统的主要特点 2. 强调持续交付的重要性2.1 持续交付的优势2.2 持续交付的实施步骤 3. 可视化工作的核心价值3.1 提高透明度和可见性3.2 促进工作流程的优化3.3 增强团队的自我管理能力 4. 看板系统的实施指南4.1 初始…

vue-cli 搭建项目,ElementUI的搭建和使用

vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个vue的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建Maven项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速&#xff1b; …

在FlowUs息流,让知识库为你所用|如何打造个人知识库|如何打造企业知识库

&#x1f389; 在 FlowUs 的世界中&#xff0c;知识绽放出无限的可能&#xff01;&#x1f680; 在当今信息爆炸的时代&#xff0c;知识的更新换代速度极快&#xff0c;我们每天都面临着海量的信息冲击。拥有一个属于自己的知识库变得至关重要。 首先&#xff0c;打造自己的知…

【PB案例学习笔记】-24创建一个窗口图形菜单

写在前面 这是PB案例学习笔记系列文章的第24篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

免费APP分发平台:小猪APP分发如何解决开发者的痛点

你是否曾为自己开发的APP找不到合适的分发平台而烦恼&#xff1f;你是否因为高昂的分发费用而望而却步&#xff1f;放心吧&#xff0c;你并不是一个人。很多开发者都面临同样的问题。但别担心&#xff0c;小猪APP分发来了&#xff0c;它可以帮你解决这些问题。 小猪app封装www…

条件断点在找call中的应用

以TLBB为例&#xff0c;在2024.6.24附近左右的时间段&#xff0c;游戏窗口切换时就会有两个左右的call&#xff0c;在x64dbg下断点之后切换回游戏窗口&#xff0c;很难分辨出哪个是我们需要的动作引起的call&#xff0c;因此在send函数处下条件断点&#xff1a;$breakpointcoun…

数据库课程知识点总结

数据库概述 数据库基本特点&#xff1a;数据结构化&#xff0c;数据独立性&#xff0c;数据冗余小&#xff0c;易扩充&#xff0c;统一管理和控制&#xff0c;永久存储&#xff0c;有组织&#xff0c;可共享 三级模式 模式&#xff1a;一个数据库只有一个模式&#xff0c;是对…