基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】

三、cmsis_os2的API互斥锁(Mutex)接口简介
struct osMutexAttr_t //互斥锁的属性结构体
宏定义:
#define osMutexRecursive 0x00000001U //递归互斥锁
#define osMutexPrioInherit 0x00000002U //优先级继承协议
#define osMutexRobust 0x00000008U //强健的互斥锁
函数:
osMutexId_t osMutexNew (const osMutexAttr_t *attr) //创建并初始化一个互斥锁对象。
const char * osMutexGetName (osMutexId_t mutex_id) //获取互斥锁对象的名称。
osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) //如果它被锁定,则获取互斥锁或超时值。
osStatus_t osMutexRelease (osMutexId_t mutex_id) //释放由 osMutexAcquire 获取的互斥锁。
osThreadId_t osMutexGetOwner (osMutexId_t mutex_id) //获取拥有互斥锁对象的线程。
osStatus_t osMutexDelete (osMutexId_t mutex_id) //删除互斥锁对象。
互斥锁作用:相互排斥(广为人知的互斥锁)在各种操作系统中用于资源管理。
单片机器件中的许多资源可以重复使用,但一次只能使用一个线程(例如通信通道,内存和文件)。
互斥锁用于保护对共享资源的访问。互斥体被创建并在线程之间传递(它们可以获取并释放互斥锁)
不能从中断服务程序(ISR)调用互斥锁管理函数,这与可以从 ISR 释放的二进制信号不同。有关 RTX5 配置选项,请参阅互斥锁配置。
同一个线程可以多次使用互斥锁,而不会自行锁定。每当拥有的线程获取互斥锁时,锁定计数就会增加。互斥锁必须多次释放,
直到锁计数达到零。在达到零时,互斥锁实际上被释放并且可以被其他线程获取。
案例代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h> #include "ohos_init.h"
#include "cmsis_os2.h" osMutexId_t mutex_id; void HighPrioThread(void)
{
// wait 1s until start actual work
osDelay(100U);
while (1)
{
// try to acquire mutex
osMutexAcquire(mutex_id, osWaitForever); printf("HighPrioThread is runing.\r\n");
osDelay(300U);
osMutexRelease(mutex_id);
}
} void MidPrioThread(void)
{
// wait 1s until start actual work
osDelay(100U); while (1)
{
printf("MidPrioThread is runing.\r\n");
osDelay(100);
}
} void LowPrioThread(void)
{
while (1)
{
osMutexAcquire(mutex_id, osWaitForever);
printf("LowPrioThread is runing.\r\n"); // block mutex for 3s
osDelay(300U);
osMutexRelease(mutex_id);
}
} void Mutex_example(void)
{
osThreadAttr_t attr; attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024 * 4; attr.name = "HighPrioThread";
attr.priority = 24;
if (osThreadNew((osThreadFunc_t)HighPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create HighPrioThread!\n");
} attr.name = "MidPrioThread";
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)MidPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create MidPrioThread!\n");
} attr.name = "LowPrioThread";
attr.priority = 26;
if (osThreadNew((osThreadFunc_t)LowPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create LowPrioThread!\n");
}
mutex_id = osMutexNew(NULL);
if (mutex_id == NULL)
{
printf("Falied to create Mutex!\n");
}
}
APP_FEATURE_INIT(Mutex_example);
基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】的更多相关文章
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【一】
基于小熊派鸿蒙季BearPi-HM_Nano HarmonyOS 鸿蒙系统Hi3861开发板NFC 开发步骤:1.购买开发板:某宝上购买就行 2.安装开发环境 3.下载源码 4.编写案例并执行 开发 ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【五】
BearPi-HM_Nano开发板鸿蒙OS内核编程开发--消息队列 什么是消息队列? 答:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能. ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】
软件定时器:是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数.定时精度与系统Tick时钟的周期有关. 定时器运行机制: cmsis_os2的A ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【二】
HarmonyOS内核开发-信号量开发案例学习记录 一.LiteOS里面的任务管理介绍: 任务状态通常分为以下四种: 就绪(Ready):该任务在就绪列表中,只等待CPU. 运行(Running) ...
- 基于小程序云Serverless开发微信小程序
本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...
- 如何基于App SDK快速地开发一个IoT App?
一.背景及大纲介绍 在如今物联网DCM(Device.Connect.Manage)的大框架下,有一个应用层来分析和处理数据,是必备技能.但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很 ...
- 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器
摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- 【资源下载】Linux下的Hi3861一站式鸿蒙开发烧录(附工具)
下载附件 2021春节前夕,华为发布了 HUAWEI DevEco Device Tool 2.0 Beta1,整体提供了异常强大的功能.得知消息后,我在第一时间带着无比兴奋的心情下载尝鲜,但结果却是 ...
随机推荐
- 查询表空间总大小(dba_data_files和dba_segments,dba_free_space区别)
1, dba_data_files,dba_segments,dba_free_space得出结论:一般情况下(没有drop表的时候):dba_data_files bytes = (dba_segm ...
- Spring Cloud Data Flow整合UAA之使用LDAP进行账号管理
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Data Flow整合UAA的文章已经写了两篇,之前的方案是把用户信息保存在数据库中: ...
- 在Visual Studio 中使用git——同步到远程服务器-下(十二)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- MySQL—Dos命令操作数据库
MySQL 是一个关系型数据库,存在表的概念 结构,数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录 Dos命令操作数据库 PhpStudy使用终端打开数据库 第一次打开默认的密 ...
- js笔记7
1.作用域链 作用域:浏览器给js的一个生存环境(栈内存) 作用域链:js中的关键字var和function都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行执 ...
- Redis热点key优化
热门新闻事件或商品通常会给系统带来巨大的流量,对存储这类信息的Redis来说却是一个巨大的挑战.以Redis Cluster为例,它会造成整体流量的不均知,个别节点出现OPS过大的情况,极端情况下热点 ...
- Linux系统安装-C7
1.安装部署操作系统 (1)创建虚拟机,加载系统镜像 (2)进入系统引导界面进行配置 补充:centos7系统网卡名称 默认系统的网卡名称为 eth0 eth1 –centos6 默认系统的网卡名称为 ...
- 15、oracle多表查询
15.0.实验建表: --父表 create table class( id number(10)constraint class_id_pk primary key, class_name varc ...
- 使用Retrofit上传图片
Retrofit使用协程发送请求参考文章 :https://www.cnblogs.com/sw-code/p/14451921.html 导入依赖 app的build文件中加入: implement ...
- Java:Java实例化(new)过程
实例化过程(new) 1.首先去JVM 的方法区中区寻找类的class对象,如果能找到,则按照定义生成对象,找不到 >>如下2.所示 2.加载类定义:类加载器(classLoader)寻找 ...