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

news2024/11/16 3:09:00

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); // 释放信号量 +1
        sleep(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); // 释放信号量 +1

        sleep(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); // 创建任务1
    if (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); // 创建任务2
    if (Task2_ID != NULL) {
        printf("ID = %d, Create Task2_ID is OK!\n", Task2_ID);
    }
}
SYS_RUN(kernel_mutex_semaphore_example);

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

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

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

相关文章

采购OLED透明屏指南

一、引言 OLED透明屏作为一种前沿的显示技术&#xff0c;以其独特的透明度和出色的显示效果&#xff0c;受到了众多行业的青睐。在采购OLED透明屏时&#xff0c;需要综合考虑多个因素&#xff0c;以确保选择到符合需求的高质量产品。以下是一份详细的采购OLED透明屏指南&#x…

智领全栈,模力全开|2024中国智算中心全栈技术大会,锐捷网络引爆智算网络新风潮

6月25日至27日&#xff0c;2024中国智算中心全栈技术大会暨展览会、第5届中国数据中心绿色能源大会暨第10届中国(上海)国际数据中心产业展览会在上海新国际博览中心隆重开幕。此次大会由CDCC和益企研究院主办&#xff0c;以“AI赋能&#xff0c;重构未来”为主题&#xff0c;吸…

kettle 安装9.0版本 建议设置为英语

0.新建转换的常用组件 0. Generate rows 定一个字符串 name value就是字符串的值 0.1 String operations 字段转大写 去空格 1. Json input 来源于一个json文件 1.json 或mq接收到的data内容是json字符串 2. Json output 定义Jsonbloc值为 data, 左侧Fieldname是数据库查…

镜头下的光学

说实话&#xff0c;当我看到几何光学的内容全是初中的解析几何的时候&#xff0c;我就觉得讲的方式太原始了&#xff0c;而且太过复杂也看不懂。所以我尝试做了数学建模&#xff0c;发现建模之后模型可以解释一些物理现象&#xff0c;也不会有矛盾的地方&#xff0c;那就算过得…

软件测试学习笔记丨JUnit5执行顺序

本文转自测试人社区&#xff0c;原文链接&#xff1a; https://ceshiren.com/t/topic/28025 指定顺序使用场景 测试用例有业务逻辑相关集成测试(主流程测试) 排序方式 方法排序类排序Suite官方网站没有明确说明默认排序的具体规则 方法排序的类型 方法排序-Order 注解指定排序 …

2024最新three.js在vue中的使用(保姆级手把手教程)

2024最新three.js在vue中的使用&#xff08;保姆级手把手教程&#xff09; 一、three.js介绍 Three.js 是一个跨浏览器的脚本&#xff0c;使用 JavaScript 函数库或 API 来在网页浏览器中创建和展示动画的 三维计算机图形。写这篇文章也是因为目前越来越多的3dweb出现&#x…

数据模拟接口

因项目需要&#xff0c;使用FastAPI框架编写了一个简单的HTTP API服务&#xff0c;用于生成短信发送记录和短信回复记录。 is_valid_phone_numbers函数用于验证手机号码列表的格式是否正确。current_time_str函数返回当前时间的字符串表示&#xff0c;可选参数format用于指定时…

聚乙烯醇(PVA)涂布型薄膜是高阻隔性包装材料 我国市场增长快速

聚乙烯醇&#xff08;PVA&#xff09;涂布型薄膜是高阻隔性包装材料 我国市场增长快速 聚乙烯醇&#xff08;PVA&#xff09;涂布型薄膜&#xff0c;是以其他塑料薄膜&#xff08;主要是双向拉伸薄膜&#xff09;为基材&#xff0c;以聚乙烯醇为涂料&#xff0c;经表面涂布后制…

推荐5个国内宝藏级物联网平台

随着物联网技术的快速发展物联网平台正成为企业和个人开发者构建智能系统的首选。这些平台以其灵活性、成本效益和强大的社区支持&#xff0c;为用户提供了快速开发和部署物联网解决方案的新途径。本文将介绍几款市场上流行的物联网平台&#xff0c;以及它们各自的技术优势和核…

昇思25天学习打卡营第1天|基本介绍与快速入门

先贴上打卡截图 基本介绍 首先来看基本介绍&#xff0c;昇思MindSpore是华为的一个全场景深度学习框架&#xff0c;属于昇腾AI全栈的一部分。 总体架构如下图所示&#xff08;来自官方学习材料&#xff09; 从对底层多样性硬件适用的Runtime到应用层面的Model Zoo、科学计算…

Windows bat 提取多个目录下的文件,到一个目录

批处理命令 echo off setlocalrem 设置源目录和目标目录 set "sourceDirE:\motrix" set "targetDirE:\新建文件夹"rem 创建目标目录&#xff0c;如果不存在 if not exist "%targetDir%" mkdir "%targetDir%"rem 循环遍历源目录中的所…

微信小程序服务器从腾讯云迁移到阿里云出现的坑

微信小程序服务器从腾讯云迁移到阿里云出现的坑 背景 原先小程序后台服务器到期&#xff0c;因为之前买的是腾讯云新用户&#xff0c;便宜&#xff0c;到期后续费金额懂的都懂。就在阿里云用新用户买了个新的&#xff0c;遂把服务全转到了阿里云服务器上。 此时&#xff0c;域…

[SAP ABAP] 汇总内表数据

在加入新数据记录时&#xff0c;将非数值字段具有相同内容记录的数值字段汇总 语法格式 COLLECT <wa> INTO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a;

解决google chrome helper 内存占用较高!

导语&#xff1a;mac 后台有很多 google chrome helper 线程并且内存占用较高。一直怀疑是IDEA插件的锅&#xff0c;并不是&#xff01; 查看是哪个网页&#xff0c;哪个插件占用内存。 chrome 更多工具 -> 任务管理器&#xff1a; 找到罪魁祸首&#xff0c;关闭标签页或者…

基于前馈神经网络的姓氏分类任务(基础)

1、认识前馈神经网络 What is it 图1-1 前馈神经网络结构 人们大多使用多层感知机&#xff08;英语&#xff1a;Multilayer Perceptron&#xff0c;缩写&#xff1a;MLP&#xff09;作为前馈神经网络的代名词&#xff0c;但是除了MLP之外&#xff0c;卷积神经网络&#xff08…

Linux通用LInux高危漏洞(CVE-2024-1086)修复案例

一、漏洞描述 2024年3月28日&#xff0c;监 Linux kernel权限提升漏洞&#xff08;CVE-2024-1086&#xff09;的PoC/EXP在互联网上公开&#xff0c;该漏洞的CVSS评分为7.8&#xff0c;目前漏洞细节已经公开披露&#xff0c;美国网络安全与基础设施安全局&#xff08;CISA&…

[leetcode]search-insert-position 搜索插入位置

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0, right nums.size()-1;while(left <right) {int mid left (right-left)/2;if(nums[mid] target){return mid;} else if(nu…

视觉与味蕾的交响:红酒与艺术的无界狂欢,震撼你的感官世界

在浩瀚的艺术海洋中&#xff0c;红酒以其不同的魅力&#xff0c;成为了一种跨界整合的媒介。当雷盛红酒与艺术相遇&#xff0c;它们共同呈现出一场特别的视觉盛宴&#xff0c;让人沉醉在色彩与光影的交织中&#xff0c;感受红酒与艺术的无界碰撞。 雷盛红酒&#xff0c;宛如一件…

DNS入门指南:企业DNS系统架构趋势解读

诞生于1987年的DNS是互联网和IT基础设施中发生的几乎所有事情的起点。从最初的简单域名解析到现在的智能解析、安全解析&#xff0c;伴随技术的变化与演进&#xff0c;DNS系统也在发生着诸多的变化。总体来说DNS系统的发展有着五大趋势&#xff0c;本文将会逐一进行解读。   …

DataX数据迁移

DataX数据迁移 访问DataX Web管理页面&#xff1a; http://ip:9527/index.html 用户名&#xff1a;admin&#xff0c;密码&#xff1a;123456 本文中示例将SqlServer数据增量同步到MySql中。 增量同步同步时&#xff0c;MySql中的新字段设置默认值 1. 查看执行器是否注册成…