当前位置: 首页 > news >正文

6.物联网操作系统信号量

一。信号量的概念与应用

信号量定义

FreeRTOS信号量介绍

FreeRTOS信号量工作原理

1.信号量的定义

        多任务环境下使用,用来协调多个任务正确合理使用临界资源。

2.FreeRTOS信号量介绍

        Semaphore包括Binary,Count,Mutex;

        Mutex包括RecursiveMutex,Mutex。

3.FreeRTOS信号量工作原理

        任务1在运行时,使用了一个临界资源,他发送一个二值信号量同步信号,表示占用资源,任务2来运行时,发现有任务占用资源(信号量同步信号),所以堵塞任务,等待下资源的释放。

二。二值信号量函数的应用

1.功能需求

1、修改按键功能

2、当按键按下触发打印一次CPU利用率

3、使用二值信号量实现按键与任务间同步

2.API详解

(1)xSemaphoreCreateBinary()创建二值信号量

(2)xSemaphoreGive()任务间释放信号量

 (3)xSemaphoreGiveFromISR()任务间释放信号量

 (4)xSemaphoreTake()任务间获取信号量 semphr.h

 (5)xSemaphoreTakeFromISR()中断获取信号量

 3.任务实现

1.创建二值信号量

2.在任务中获取信号量

3.在中断中发送信号量

 3.1Cubemx创建工程(在上一个基础上queue队列)

(1)在FREERTOS中创建二值信号量

二值信号量在FREERTOS的初始化的时候就会创建(返回信号量的句柄)

3.2 步骤:

(1)把FREERTOS.c中的二值信号量声明外接到GPIO.c中(GPIO.c中有按键按下的GPIO中断处理)

#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"extern osSemaphoreId CpuPrintBinarySemHandle;

(2)在GPIO.c中的按键中断回调函数中加入任务释放信号量函数 

xSemaphoreGiveFromISR(CpuPrintBinarySemHandle,NULL);

(3)FREERTOS.c中的串口输出的主函数中

if(xSemaphoreTake(CpuPrintBinarySemHandle,portMAX_DELAY) == pdPASS){

结果

        复位直接打印程序的cpu利用率,由于没有运行就输出,所以只能打印printf,字符串没有东西,按key3释放信号量,这个时候主函数中接受到有信号量,所以再次运行。

三。技术信号量函数的应用

功能分析

API详解

功能实现

1.功能分析

1、修改按键功能,模拟停车位出入功能

2、当按键K3按下获取车位

3、当按键K4按下释放车位

2.API讲解

xSemaphoreCreateCounting()

 uxSemaphoreGetCount()

3.功能实现

1.按键k4初始化

2.创建技术信号量

3.k3按下获取停车位

4.按下释放停车位

1.cubemx创建工程

(1)Key4(PF11)初始配置,中断配置

 (2)FREERTOS中使能以下后,才可以添加计数信号量

 (3)创建计数信号量(初始化为4)

 2.步骤:

(1)在FREERTOS.c中有设置的计数信号量,extern设置到GPIO.c中

extern osSemaphoreId KeyCountingSemHandle;

(2)GPIO.c的中断回调函数中,Give为释放信号量,Take为使用信号量,Key3为释放,Key为使用。

《获取》

《释放》

 

//key3中
if(xSemaphoreTakeFromISR(KeyCountingSemHandle,NULL)==pdPASS){printf("Take success\n");
}else{printf("Take fail\n");
}
//key4中
if(xSemaphoreGiveFromISR(KeyCountingSemHandle,NULL)==pdPASS){printf("Give success\n");
}else{printf("Give fail\n");
}

结果:

按Key3为开走车,Key为停车

四。信号量实现原理

1.信号量创建删除

 

2.信号量释放

 

3.信号量获取

 

相关文章:

6.物联网操作系统信号量

一。信号量的概念与应用 信号量定义 FreeRTOS信号量介绍 FreeRTOS信号量工作原理 1.信号量的定义 多任务环境下使用,用来协调多个任务正确合理使用临界资源。 2.FreeRTOS信号量介绍 Semaphore包括Binary,Count,Mutex; Mutex包…...

《向量数据库指南》——使用Milvus Cloud操作员安装Milvus Cloud独立版

Milvus cloud操作员HelmDocker Compose Milvus cloud Operator是一种解决方案,帮助您在目标Kubernetes(K8s)集群上部署和管理完整的Milvus cloud服务堆栈。该堆栈包含所有Milvus cloud组件和相关依赖项,如etcd、Pulsar和MinIO。本主题介绍如何使用Milvus cloud Operator安…...

Redis的基础知识

目录 一、什么是Redis 二、关于Redis的一些基本知识 (1)set命令 (2)get命令 三、Redis中的一些常用命令 (1)keys (2)exists (3)type (4…...

Sorting Layer与Order in Layer

就像是两个数相比,比如34与26,Sorting Layer决定的是十位,而Order in Layer决定的是个位,如果Sorting Layer的级别比较高,则可以忽略Order in Layer的比较,当比较的二者的Sorting Layer级别相同&#xff0c…...

动手学深度学习—卷积神经网络(原理解释+代码详解)

目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…...

环球数科、BUFFALO面试(部分)

环球数科 系统复杂且需求迭代频繁,如何维护微服务之间的接口调用关系? API接口在设计的时候需要大量的需求文档,而且文档也需要不断维护。如何高效维护API文档就很重要了。以下是一些常见的API管理工具:Swagger:Swag…...

RabbitMQ快速入门

文章目录 1、RabbitMQ的概述1.1、什么是消息队列?1.2、为什么要使用消息队列?1.3、RabbitMQ的特点: 2、RabbitMQ的安装2.1 下载与安装2.2 常用命令 3、RabbitMQ消息发送和接受3.1 消息发送和接受机制3.2 AMQP的消息路由3.3 Exchange(交换机)的…...

使用Git在GitHub上部署静态页面

在GitHub中,我们可以将自己的静态页面部署到GitHub中,它会给我们提供一个地址使得我们的页面变成一个真正的网站,可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…...

SQL-每日一题【1084. 销售分析III】

题目 Table: Product Table: Sales 编写一个SQL查询,报告2019年春季才售出的产品。即仅在2019-01-01至2019-03-31(含)之间出售的商品。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 between and between…...

Redis 软件包,在 CentOS 7 中安装 Redis

Download | Redis 1. 解压 Redis 软件包。假设你的 Redis 软件包名为 redis.tar.gz,进入redis.tar.gz所在目录下 ,可以使用以下命令进行解压: tar xzf redis.tar.gz 2. 切换到 Redis 软件包的解压目录。假设解压后的目录名为 redis&#xf…...

01.Redis实现发送验证码保存功能

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis来实现发送验证码功能 学习产出&#xff1a; 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…...

C++STL——deque容器详解

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.deque容器的基本概念二.deque容器常用操作①deque构造函数②deque元素操作③deque赋值操作④deque交换操作⑤deque大小操作⑥deque插入和删除…...

docker 哨兵模式和集群模式安装Redis7.0.12

docker 哨兵模式和集群模式安装Redis7.0.12 1.下载镜像 1.1 配置阿里云加速源 墙外能访问https://hub.docker.com/_/redis 的可跳过 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后选择左侧的镜像工具>镜像加速器&#xff0c;获取加速器地址&#…...

go nil 与零值

go nil 与零值 区别描述&#xff1a; 在Go语言中&#xff0c;nil和零值是两个不同的概念&#xff0c;它们在处理空值或未初始化值时有不同的应用场景。 nil&#xff1a; 在Go语言中&#xff0c;nil表示指针类型的零值或者interface、function、map、slice、channel、error类…...

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…...

kubernetes之Ingress

一、背景 Ingress是k8s中实现7层负载的实现方式&#xff0c;是公开集群外部流量到集群内服务的HTTP和HTTPS路由 二、Ingress基础 通常Ingress实现由Ingress 控制器和Ingress组成&#xff0c;Ingress控制器负责具体实现反向代理及负载均衡&#xff0c;Ingress负责定义匹配规则和…...

前端实现打印1 - 使用 iframe 实现 并 分页打印

目录 打印代码对话框预览打印预览 打印代码 <!-- 打印 --> <template><el-dialogtitle"打印":visible.sync"dialogVisible"width"50%"top"7vh"append-to-bodyclose"handleClose"><div ref"print…...

MIAOYUN获评“2023年度一云多芯稳定安全运行优秀案例”

2023年7月25日至26日&#xff0c;由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;、中国通信标准化协会主办的以“云领创新&#xff0c;算启新篇”为主题的“2023可信云大会”在北京成功举办。会上公布了多项前瞻领域的评估结果和2023年度最佳实践案例&#x…...

论文代码学习—HiFi-GAN(4)——模型训练函数train文件具体解析

文章目录 引言正文模型训练代码整体训练过程具体训练细节具体运行流程 多GPU编程main函数&#xff08;通用代码&#xff09;完整代码 总结引用 引言 这里翻译了HiFi-GAN这篇论文的具体内容&#xff0c;具体链接。这篇文章还是学到了很多东西&#xff0c;从整体上说&#xff0c…...

安防视频综合管理合平台EasyCVR可支持的视频播放协议有哪些?

EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。 视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...