Hi3861 OpenHarmony嵌入式应用入门--LiteOS Mutex

CMSIS 2.0接口中的Mutex(互斥锁)是用于在多线程环境中保护共享资源的访问机制。Mutex(互斥锁)是一种特殊的信号量,用于确保同一时间只有一个线程可以访问特定的共享资源。 在嵌入式系统或多线程应用中,当多个线程需要访问同一资源时,如果没有适当的同步机制,可能会导致数据不一致或其他问题。Mutex就是用来解决这类问题的。这些函数通常不能在中断服务程序(ISR)中调用,因为中断的上下文可能与这些函数的设计不符。 在使用Mutex时,必须确保正确地获取和释放锁,以避免死锁或其他同步问题。

Mutex API

API名称

说明

osMutexNew

创建并初始化一个互斥锁

osMutexGetName

获得指定互斥锁的名字

osMutexAcquire

获得指定的互斥锁的访问权限,若互斥锁已经被锁,则返回超时

osMutexRelease

释放指定的互斥锁

osMutexGetOwner

获得指定互斥锁的所有者线程

osMutexDelete

删除指定的互斥锁

代码编写

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

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

文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_04_mutex\kernel_mutex_example.c文件D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\kernel_04_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_mutex_example") {sources = ["kernel_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
osMutexId_t Mutex_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;printf("enter Task 1.......\n");while (1) {osMutexAcquire(Mutex_ID, osWaitForever);    // 请求互斥锁// 操作共享数据 写数据printf("write Buff Data: \n");for (i = 0; i < sizeof(buff); i++) {buff[i] = i;}printf("\n");osMutexRelease(Mutex_ID);   // 释放互斥锁sleep(TASK_DELAY_TIME);}
}
/*** @description: 任务2* @param {*}* @return {*}*/
void Task2(void)
{int i = 0;printf("enter Task 2.......\n");while (1) {osMutexAcquire(Mutex_ID, osWaitForever);    // 请求互斥锁// 操作共享数据 读数据printf("read Buff Data: \n");for (i = 0; i < sizeof(buff); i++) {printf("%d \n", buff[i]);}printf("\n");osMutexRelease(Mutex_ID);   // 释放互斥锁sleep(TASK_DELAY_TIME);}
}
/*** @description: 初始化并创建任务* @param {*}* @return {*}*/
static void kernel_mutex_example(void)
{printf("Enter kernel_mutex_example()!\n");// 创建互斥锁Mutex_ID = osMutexNew(NULL);if (Mutex_ID != NULL) {printf("ID = %d, Create Mutex_ID is OK!\n", Mutex_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_example);

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

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

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

相关文章

C语言常用标准头文件

头文件的基础概念 在C的系列语言程序中&#xff0c;头文件&#xff08;通常扩展名为.h&#xff09;被大量使用&#xff0c;它通常包含函数、变量、结构体等的声明和定义&#xff0c;以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码&#xff0c;它可以被多…

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果&#xff0c;仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时&#xff0c;兼顾渲染速度和时间还需要进行一些调节设置&#xff0c;如何让渲染效果更加逼真&#xff1f; 一、全局照明与…

【Python】已解决:urllib模块设置代理ip

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;urllib模块设置代理ip 一、分析问题背景 在使用Python的urllib模块进行网络请求时&#xff0c;有时我们需要通过代理服务器来发送请求&#xff0c;以达到隐藏真…

设计模式原则——单一职责原则(SPS)

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 单一职责原则&#xff08;SPS&#xff09;&#xff1a; 又称单一功能原则&#xff0c;面向对象五个基本原则&#xff08;SOLID&#xff09;之一原则定义&#xff1a;一个类应…

使用 ks 安装 mysql

https://www.kubesphere.io/zh/docs/v3.3/application-store/built-in-apps/mysql-app/ 准备工作 您需要启用 OpenPitrix 系统。如何启用&#xff1f; 动手实验 步骤 1&#xff1a;从应用商店部署 MySQL 在 demo-project 的概览页面&#xff0c;点击左上角的应用商店。找到 …

Linux-磁盘管理与文件系统

目录 一、磁盘结构 1、磁盘的物理结构 2、磁盘的数据结构 3、磁盘存储容量 4、接口类型 二、磁盘分区 1、磁盘的两种分区方式 1.1、MBR分区 1.2、GPT分区 三、查看硬盘的分区情况 1、Fdisk—查询磁盘设备 2、lsblk—以树形查看磁盘分区 3、blkid—查看磁盘的UUID …

ONLYOFFICE 桌面编辑器 8.1 发布:全新功能齐备的 PDF 编辑器、丰富的幻灯片版式

前言 在当前数字化迅速发展的时代&#xff0c;办公软件套件作为企业日常工作的核心工具&#xff0c;其功能的全面性和使用的便捷性直接影响着工作效率和团队协作的效果。在众多办公软件中&#xff0c;ONLYOFFICE凭借其卓越的性能和丰富的功能&#xff0c;备受用户青睐。近日&a…

基于Java少儿编程管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

手机照片怎么恢复?3个方法,从灾难中崛起

已经成为了我们随身携带的必备品。而在这些小巧玲珑的设备中&#xff0c;存储着我们大量的个人回忆和重要资料。其中&#xff0c;手机拍摄的照片更是承载着我们的欢笑、泪水、成长与经历&#xff0c;但它们会因为意外从此消失。 面对这样的困境&#xff0c;我们是否只能无奈接…

Linux基础 - 定时计划

目录 零. 简介 一. cron 二. crontab 三. cron和crontab的区别 四. 例子 零. 简介 在 Ubuntu 系统中可以使用 crontab 来设置定时计划任务。crontab 是 Linux 下的无图形界面的计划任务工具&#xff0c;它可以在无需人工干预的情况下运行作业。 一. cron 在 Ubuntu 系统…

[ARM-2D 专题]3. ##运算符

C语言的宏系统相当强大&#xff0c;它允许使用##符号来处理预处理期的文本替换。这种用法被称为标记连接&#xff08;token pasting&#xff09;操作&#xff0c;其结果是将两个标记紧紧地连接在一起&#xff0c;而省略掉它们之间的所有空格。在复杂的宏定义中&#xff0c;运用…

13 物理层介质及设备

物理层介质及设备 一、线缆的连接 &#xff08;一&#xff09;线序 ​ 线序&#xff1a; RJ-45连接头12345678568A绿白绿橙白蓝蓝白橙棕白棕568B橙白橙绿白蓝蓝白绿棕白棕 ​ 1、2发送&#xff0c;3、6接收 &#xff08;二&#xff09;线缆的应用 1.线缆的连接 ​ 标准…

边缘计算为企业解决数据问题,提升业务效率和竞争力-天拓四方

企业在当前数字化时代面临着一系列具体的问题和挑战&#xff0c;这些问题往往与数据处理、实时响应、安全性以及运营成本等方面密切相关。边缘计算作为一种新兴的计算模型&#xff0c;能够有效地帮助企业解决这些问题&#xff0c;提升业务效率和竞争力。 首先&#xff0c;企业…

业务架构交付物

背景 业务的核心元素、扩展元素以及它们的协同关系&#xff0c;业务架构和其他架构的关系等等已经有了不少认识&#xff0c;那么&#xff0c;通过对业务架构的还原和分析&#xff0c;到底能够得到什么业务架构的内容呢&#xff1f;它可以是一套流程框架体系&#xff0c;也可以…

el-dialog使用::v-deep()穿透设置样式不生效,解决办法亲测有效!

场景&#xff1a; <el-dialogv-model"dialogVisible"width"800px":before-close"beforeClose"append-to-body:close-on-click-modal"false"title"增加文档"><template #footer><div style"text-align:c…

电梯开关状态人员进出检测数据集VOC+YOLO格式2220张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2220 标注数量(xml文件个数)&#xff1a;2220 标注数量(txt文件个数)&#xff1a;2220 标注…

YOLOv10(6):YOLOv10基于TensorRT的部署(基于INetworkDefinition)

1. 写在前面 我们在前面已经讲过很多关于YOLOv10的一些知识点&#xff0c;也简单理了一下如何训练自己的数据。 现在本篇文章主要是讲解一下如何在TensorRT中部署YOLOv10&#xff0c;相信经过这一步&#xff0c;各位小伙伴已经能够无限的接近于将YOLOv10产品化了。 另一个需要说…

C++学习合集

#整理到一块&#xff0c;方便查东西&#xff0c;顺便补充一些之前没有学习到的东西# 变量 char--1字节 short--2字节 int-4字节 long--4字节 long long(int)--8字节&#xff1b;准确来说变量的大小取决于编译器&#xff0c;1字节8个二进制位&#xff0c;其中最高位为符号位…

【系统架构设计师】五、计算机网络(概念|通信技术|网络技术)

目录 一、计算机网络概念 二、通信技术 三、网络技术 3.1 局域网(LAN) 3.1.1 局域网拓扑结构 3.1.2 局域网协议 3.2 无线局域网(WLAN) 3.3 广域网(WAN) 3.4 城域网&#xff08;MAN) 3.5 移动通信网 四、组网技术 4.1 OSI七层模型 4.1.1 交换机 4.1.2 路由器 4.2…

Linux下环境变量配置与解读

文章目录 1.linux下查找java的安装目录&#xff08;没有配置环境变量&#xff09;2.配置文件加载解读3.配置java环境变量 1.linux下查找java的安装目录&#xff08;没有配置环境变量&#xff09; 执行如下命令&#xff0c;查看版本信息&#xff0c;确定java已经安装 java -vers…