FREERTOS_信号量_创建和使用

STM32 FreeRTOS 信号量 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的(只能取0或1)也可以是计数型的(可以是任意正整数)。信号量的基本操作包括“获取”和“释放”。比如动车上的卫生间,一个卫生间同时只能容纳一个人,由指示灯来表示是否有人在使用。当我们想使用卫生间的时候,有如下过程:1、判断卫生间是否有人使用(判断信号量是否有资源)2、卫生间空闲(信号量有资源),那么就可以直接进入卫生间(获取信号量成功) 阅读详情

一、信号量的创建

二进制信号量和计数型信号量使用的函数,核心操作函数(xSemaphoreGive()/xSemaphoreTake())是通用的,但创建函数不同,

// 释放信号量(二进制/计数型通用)
xSemaphoreGive(xSemaphore);

// 获取信号量(二进制/计数型通用)
xSemaphoreTake(xSemaphore, xTicksToWait);
1、包含头文件
#include "semphr.h" // 信号量核心头文件
2、定义信号量句柄
SemaphoreHandle_t xMySemaphore; // 信号量句柄
3、调用创建函数
信号量类型创建函数说明
二进制信号量xSemaphoreCreateBinary()初始为空,用于任务同步
计数型信号量xSemaphoreCreateCounting(uxMaxCount, uxInitialCount)初始计数值可配置,用于资源计数
互斥量(特殊二值信号量)xSemaphoreCreateMutex()用于资源互斥访问,支持优先级继承

二进制信号量创建:

xMySemaphore = xSemaphoreCreateBinary();

计数型信号量创建

// 最大计数值5,初始计数值0
xMySemaphore = xSemaphoreCreateCounting(5, 0);
4、检查创建结果
if(xMySemaphore == NULL) {
  // 创建失败(如内存不足),需错误处理
}

二、信号量的基本使用 释放(Give)和获取(Take)

1、释放信号量(Give)

通过xSemaphoreGive()释放信号量(二进制信号量置为 “满”,计数型信号量计数值 + 1):

BaseType_t xStatus;

// 释放信号量(成功返回pdPASS,失败返回errQUEUE_FULL)
xStatus = xSemaphoreGive(xMySemaphore);

if(xStatus == pdPASS) {
  // 信号量释放成功
}
2、获取信号量(Take)

通过xSemaphoreTake()获取信号量(二进制信号量置为 “空”,计数型信号量计数值 - 1):

BaseType_t xStatus;

// 获取信号量:阻塞10个tick,超时返回失败
xStatus = xSemaphoreTake(
  xMySemaphore,    // 目标信号量句柄
  10               // 阻塞超时时间(portMAX_DELAY为永久阻塞)
);

if(xStatus == pdPASS) {
  // 获取成功,执行需要同步/保护的操作
} else {
  // 超时未获取到信号量
}

三、注意

二进制信号量:任务同步(如按键触发 LED 动作)

释放方:事件发生时(按键按下)调用xSemaphoreGive();

获取方:等待事件时调用xSemaphoreTake(),获取到后执行动作。

计数型信号量:资源计数(如空闲缓冲区数量、可用打印机数量)

资源可用时:释放信号量(计数值 + 1);

申请资源时:获取信号量(计数值 - 1),计数值为 0 时阻塞等待。

【复习笔记】FreeRTOS(七) 二值信号量和计数信号量 本文是FreeRTOS复习笔记的第七节,信号量。 阅读详情

相关推荐

【FreeRTOS 教程 六】二进制信号量与计数信号量

队列数据可用时,任务将取消阻塞,从队列中检索数据,然后执行必要的数据处理。阻塞时间表示在尝试“获取”信号量时,如果信号量不足立即可用,任务应进入阻塞状态的。中断始终“提供”信号量(将写入队列使其为满),但从不获取信号量。在许多情况下,任务通知可以提供二进制信号量的轻量级替代方案。创建一个计数信号量,并返回一个可以引用该新建信号量的句柄。创建一个计数信号量,并返回一个可以引用该新建信号量的句柄。创建一个二进制信号量,并返回一个可以引用该信号量的句柄。创建一个二进制信号量,并返回一个可以引用该信号量的句柄。

The_xz的博客 1316

详解FreeRTOS中的信号量(semaphore)

在这种情况下,事件处理程序将在每次事件发生时“give”一个信号量——导致信号量的计数值在每次“give”时增加。可以将延迟处理任务的优先级设置最高,然后,在ISR中调用portYIELD_FROM_ISR(),ISR结束后会运行延迟处理的任务(因为它优先级最高)。当一个任务完成对资源的处理后,它将信号量的计数值向后递增“give”信号量。t1时Task1运行,Task2阻塞等待信号量,t2时发生中断,ISR执行,give一个信号量解除Task2的阻塞态,t3时Task2运行,结束后继续等待下一个信号量。

闪耀大叔的博客 4695

无人驾驶汽车系统入门(三十二)——FEC算法:点云快速欧几里得聚类实战解析

本文深入解析了FEC算法在无人驾驶点云聚类中的高效应用,通过逐点处理策略和体素栅格预分割技术,实现了比传统欧几里得聚类快百倍的速度。文章详细介绍了算法原理、Python实现及参数调优指南,并对比了FEC与传统算法的性能差异,为无人驾驶系统开发提供了实用解决方案。

weixin_29065015的博客 486

【FreeRTOS】信号量

目录 一、信号量 二、二值信号量 1、创建二值信号量 (1)动态创建 (2)静态创建 2、释放信号量 (1)任务级 (2)中断级 2、获取信号量 (1)任务级 (2)中断级 三、计数型信号量 1、创建计数型信号量 (1)动态方法 (2)静态方法 2、释放和获取计数信号量 四、互斥信号量 1、创建互斥信号量 (1)动态方法 (2)静态方法 2、释放和获取互斥信号量 五、递归互斥信号量 1、创建递归互斥信号量 (1)动态方法 (2)静态方法 2、释放递归互

chengzhou 1728

工业自动化进阶:西门子 S7-1200 PLC 调度 AGV 实现精确定点移动

本文介绍了基于西门子S7-1200PLC的AGV调度控制系统设计,包括系统架构、硬件选型和PLC程序设计。系统通过PROFINET通信实现PLC与AGV的数据交互,采用状态机控制逻辑实现任务管理、运动控制和闭环位置校正。重点阐述了通信协议实现、梯形图核心逻辑及系统调试优化方法。实际应用案例显示,该系统定位精度达±3mm,显著提升了物料配送效率。该方案为工业自动化升级提供了可靠的技术支持。

qq_52407556的博客 1889

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

操作系统---FreeRTOS(信号量)

二值信号量本质上是队列长度为1的队列,该队列只有空和满的情况,这就是二值。二值信号量常用于互斥访问与任务同步,与互斥信号量类似,但是很可能造成优先级翻转问题,所以二值信号量更适用于任务的同步。优先级翻转:高优先级的任务因等待低优先级的任务而被阻塞的情况。计数型信号量相当于队列大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候就确定的。

2301_76762351的博客 1557

AUTOSAR AP——SM模块

对AUTOSAR AP中状态管理模块SM,从模块定义、总结等多方面进行了介绍。

weixin_43627682的博客 284

freeRtos学习笔记 (7)信号量

freeRtos学习笔记 freeRtos信号量 优先级翻转 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值信号量是一种特殊的计数信号量,和事件组类似,相当于裸机中的标志位,常用于任务之间的同步;互斥信号量和二值信号量类似,相比二值信号量避免了任务优先级翻转问题,因此常用来保护临界资源,但是互斥信号量不可以在中断中使用,只能在任务中使用;递归互斥信号量是一种特殊的互斥信号量,如果任务获取到递归互斥信号量后,该任务中

不咸不要钱 2032

开放平台实现安全的身份认证与授权原理与实战:使用OAuth 2.0实现授权码模式

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的飞速发展,各种网站、App、小程序等都将逐渐向用户提供了丰富的功能和服务。在这些应用中,用户通常需要登录才能使用这些服务,这就涉及到用户信息的安全问题。如果用户的信息被泄露或篡改,那么可能造成严重后果。因此,为这些应用提供安全且健壮的身份验

AI天才研究院 494

定位教程7---旋转中心标定之方法二

手算相机相对机器人关系

Quintin 6230

FreeRTOS二值信号量的创建与使用

信号量:信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆...

小小小栋的博客 7504

Python爬虫实战:美团商家数据采集系统

本文将详细介绍如何使用Python最新技术栈构建高效的美团商家信息采集系统。内容涵盖异步爬虫、反爬对抗、数据存储、可视化分析等完整流程,提供可落地的代码方案和工程实践。

2201_76125261的博客 2660

ESP32 入门 (九) 使用FreeRtos创建任务并使用信号量和互斥量通信

在 ESP32 开发中,随着项目复杂度的提升,多任务协同工作变得愈发普遍。为了确保任务之间的同步与共享资源的安全访问,FreeRTOS 提供了信号量(Semaphore)和互斥量(Mutex)等强大工具。本文将深入讲解如何在 ESP32 上使用 FreeRTOS 创建任务,并借助信号量和互斥量实现高效、安全的任务间通信,助力你进一步掌握 ESP32 的高级开发技巧。​。

qq_61574541的博客 1315

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3527

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用cubemx创建的freertos项目,在中断使用信号量释放操作导致卡死

使用cubemx创建的freertos项目,在中断使用信号量释放操作导致卡死

qq_72963764的博客 411

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

FreeRTOS学习笔记(4)——信号量

一、头文件 #include "FreeRTOS.h" #include "semphr.h" 二、二值信号量 2.1 运作机制 创建信号量时,系统会为创建的信号量对象分配内存,并把可用信号量初始化为用户自定义的个数, 二值信号量的最大可用信号量个数为 1。 二值信号量获取,任何任务都可以从创建的二值信号量资源中获取一个二值信号量,获取成功则返回正确,否则任务会根据用户指定的阻塞超时时间来等待其它任务/中断释放信号量。在等待这段时间,系统将任务变成阻塞态,任务将被挂到该信号量的阻塞等待列表中。 假如某个

Leung的博客 3990

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

FreeRTOS_信号量之递归互斥信号量

一个任务使用函数 xSemaphoreTakeRecursive() 成功的获取了多少次递归互斥信号量就得使用函数 xSemaphoreGiveRecursive() 释放多少次!递归互斥信号量也有优先级继承的机制,所以当任务使用完递归互斥信号量以后一定要记得释放(如果不释放那么低优先级的任务的优先级将永远和高优先级任务保持一致)。已经获取了互斥信号量的任务就不能再次获取这个互斥信号量,但是递归互斥信号量不同,已经获取了递归互斥信号量的任务可以再次获取这个递归互斥信号量,而且次数不限。

light_2025的博客 756

一文带你深度了解FreeRTOS——互斥信号量

一、FreeRTOS互斥信号量简介 二、 创建互斥信号量 1、创建互斥量的函数 (1)、动态创建互斥量的函数 (2)、静态创建互斥量的函数

m0_73931287的博客 2909

FreeRTOS笔记篇:第六章 - (二进制信号量 && 计数信号量&& 队列下)使用中断管理

整理

假如技术娶了生活... 789

FreeRTOS系列教程(四):如何使用信号量

本文主要探索了二值信号量与计数信号量的原理及其使用方法,包括信号量的原理,信号量的运行机制,信号量与消息队列的比较,信号量的相关API函数,以及信号量的使用实验等。 通过本文,我们将会知道: 如何创建和使用二值信号量? 如何创建和使用计数信号量? 信号量与消息队列有什么异同? 为什么要使用信号量? 信号量的运行机制是什么?

旭辉君的博客 4705

FreeRtos(3)-----二值信号量

freeRTOS实时操作系统移植 FreeRtos(1)-----任务创建与管理 FreeRtos(2)-----消息队列 以上是历史FreeRtos博客。FreeRtos系列我会坚持更下去 二值信号量 其实简单点二值信号量就像Linux里面的进程同步,也就是说一个进程需要另一个进程的运行结果才能运行。 二值信号量API 头文件:#include "semphr.h" 二值信号量的创建 SemaphoreHandle_t xSemaphoreCreateBinary(); 参数:无 返回值:创建成功返回一

玫瑰花店的博客 817

【FreeRTOS学习 - 计数信号量】

FreeRTOS计数信号量的介绍与使用

晨少的博客 484

FreeRTOS--信号量

FreeRTOS--计数、二进制、互斥信号量

m0_65737814的博客 2277

FreeRtos如何使用

1.创建任务 portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,const signed portCHAR * const pcName,unsigned portSHORT usStackDepth,void *pvparameters.unsigned portBASE_TYPE uxPriority,xTaskHandle *pxCreated...

bigbosszh的博客 1770

【FreeRTOS】信号量的相关函数使用及示例解释

FreeRTOS中的信号量是一种用于任务间同步的机制。它可以用来实现任务之间的互斥访问共享资源或者等待某个事件发生。

Goforyouqp的博客 4081
上一篇: FREERTOS_队列_创建和使用
下一篇: FREERTOS_互斥量_创建和使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值