FreeRTOS源码阅读笔记4--semphr.h

 信号量是特殊的队列--无法存储消息的队列,相关的接口函数声明在semphr.h中,通过宏定义替换队列函数实现。

4.1创建二值信号量xSemaphoreCreateBinary()

4.1.1函数原型

  • queueQUEUE_TYPE_BINARY_SEMAPHORE:一个宏,表示创建队列的类型是二值信号量
4.1.2函数框架

创建二值信号量实际上是,创建了一个队列,这个队列的长度为1,存储队列消息的空间为0。

4.2创建计数信号量xSemaphoreCreateCounting()

4.2.1函数原型

  • uxMaxCount:计数信号量的最大值,当达到这个值的时候,信号量不能再被释放。
  • uxInitialCount:初始信号量的值。
4.2.2函数框架

  • ①调用xQueueGenericCreate函数创建一个长度为uxMaxCount,消息存储空间为0的队列。
  • ②使uxMessagesWaiting = uxInitialCount,表示当前可用的信号量数量为uxInitialCount。

4.3删除信号量vSemaphoreDelete()

4.3.1函数原型

4.3.2函数框架

调用vQueueDelete()函数删除。

4.4释放信号量xSemaphoreGive()

4.4.1函数原型

  • xSemaphore:信号量的句柄,指向队列控制块;
  • NULL:表示消息体为空;
  • semGIVE_BLOCK_TIME:宏,数值0,表示阻塞时间为零;
  • queueSEND_TO_BACK:一个宏,表示发送到队列尾部。
4.4.2函数框架

从函数原型可以看出,信号量释放是不会阻塞任务的,所以如果队列是满的,就不会去更新阻塞时间、检查阻塞时间是否过了、再检查队列是否还是满的等操作,直接返回err_QUEUE_FULL。

  • ①如果队列没满,uxMessageWaiting加一,表示信号量的数量加一;如果此时有任务在等待接收信号量,唤醒该任务,返回pdPASS。
  • ②如果队列满了,直接返回err_QUEUE_FULL。

4.5释放信号量xSemaphoreGiveFromISR()

4.5.1函数原型

  • xSemaphore:信号量句柄;
  • pxHigherPriorityTaskWoken:在函数里会改变*pxHigherPriorityTaskWoken的值,可根据它的值判断在中断退出后是否要进行任务切换。
4.5.2函数框架

xQueueGiveFromISR()是xQueueGenericSendFromISR()的简单版,区别是不需要处理队列消息,因为信号量没有消息存储空间。

4.6获取信号量xSemaphoreTake()

4.6.1函数原型

4.6.2函数框架

类似xQueueReceive()函数。

4.7获取信号量xSemaphoreTakeFromISR()

4.7.1函数原型

4.7.2函数框架

调用xQueueReceiveFromISR函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gitt开源项目的意义,公司为什么会对在gitt上有开源项目的人更大机会

Git是一种分布式版本控制系统,它可以帮助程序员管理代码的历史版本和协同工作。同时,Git也成为了开源项目的主要托管平台之一。Git的开源项目意义重大,因为这种开源项目托管平台可以帮助开发者将代码和项目分享给全球的开发者,并且…

node版本管理工具-nvm

1、 下载地址 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11 2、 选择安装地址不能有空格,中文 3、 使用命令

微服务学习(十二):安装Minio

微服务学习(十二):安装Minio 一、简介 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统,非常适合于存储大容量非结构化的数据,例如图片、视…

linux上的通用拍照程序

最近因为工作需要,在ubuntu上开发了一个拍照程序。 为了找到合适的功能研究了好几种实现方式,在这里记录一下。 目录 太长不看版 探索过程 v4l2 QT opencv4.2 打开摄像头 为什么不直接打开第一个视频节点 获取所有分辨率 切换摄像头 太长不看…

MySQL错误之ONLY_FULL_GROUP_BY

报错信息: 翻译: 对该报错的解释 所以,实际上该报错是由于在SQL查询语句中有group by,而这个包含group by的SQL查询写的并不规范导致的,这个ONLY_FULL_GROUP_BY模式开启之后检查就会很严格,如果select列表…

51单片机IO口的四种工作状态切换

51单片机IO口的四种工作状态切换 1.概述 这篇文章介绍单片机IO引脚的四种工作模式,每个模式都有各自的用武之地,后面在驱动外设硬件时会用它不同的模式。 2.IO口四种工作模式介绍 PnM1PnM0I/O口工作模式00准双向口:灌电流达20mA&#xff…

leetcode:合并两个有序链表

题目描述 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 题目分析 这个算法思路很简单:就是直接找小尾插 定义一个tail和head,对比两个链表结点的val,小的尾插到tail->next,如果一个链表…

ebpf实战(一)-------监控udp延迟

问题背景: 为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段. udp接收端有2个主要路径 1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区 数据接收流程 2. 应用程序调用recvmsg等a…

如何解决tinder注册失败的问题?

tinder创立在2012年,是一款海外热门的交友软件。2020年,Tinder拥有620万用户和7500万月活跃用户。截至2021年,Tinder在全球范围内的匹配记录超过650亿。已成为全球最受欢迎的约会软件之一。 目前tinder暂时未对中国大陆开发使用,…

一个最简单的工业通讯数据分析例子

1.背景 对工业设备的通讯协议进行分析可以帮助我们更好地理解其工作原理和相关技术,并且有助于以下几个方面: 1. 优化工业设备的通讯效率:了解通讯协议的细节可以帮助我们找到通讯效率低下的原因并进行优化,提高设备的通讯效率和…

vue3实现验证码校验的功能

📓最近想实现使用vue3实现一个简易的前端验证码校验的功能,就花了点时间实现了,这只是一个简易版的,但是用在项目中是没有啥问题的,废话不多说,先来看下最终实现的效果。 📓现在让我们来一步一步…

java制作简单飞翔的鸟

创建三个包,存放代码。把图片放进文件中 APP包(运行) GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主内容) Barri…

如何开发洗鞋店用的小程序

随着人们生活水平的提高,洗护行业是越来越细分化了,从最开始的干洗店包含洗护行业的所有服务到现在有专门为洗鞋开的店,如果开发一款洗鞋店用的小程序,可以实现用户在家下单直接有人上门取鞋的话,应该如何去开发呢&…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员,最近他接到了一个头疼的任务,那就是评估公司系统的安全性,因此他前来咨询,在得知SOCKS5代理IP可以帮他之后,他不禁产生疑问,这是什么原理?其实和小张一样的朋友不…

Lua脚本解决redis实现的分布式锁多条命令原子性问题

线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删除锁,但是此时他的锁到期了,那么此时线程2…

Flutter 小技巧之 3.16 升级最坑 M3 默认适配技巧

如果要说 Flutter 3.16 升级里是最坑的是什么?那我肯定要说是 Material 3 default (M3)。 倒不是说 M3 bug 多,也不是 M3 在 3.16 上使用起来多麻烦,因为虽然从 3.16 开始,MaterialApp 里的 useMaterial3 …

Shell循环:for(一)

语法结构: for 变量名 [ in 取值列表] do 循环体 done 示例1: 1、需求:自动循环创建10个用户 2、演示: [rootlocalhost ~]# vim for.sh #脚本编写 #!/bin/bash for i in {1..10} do useradd "user$…

探究Kafka原理-2.Kafka基本命令实操

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请&#x1f44…

csv文件添加文件内容和读取

append content to file import numpy as np acc_listnp.array([0.97,0.92,0.93,0.89]) # 注意这个地方添加文件不需要特别声明是什么文件 file open("result.csv", "a") print("{:.2f}, {:.2f}".format(acc_list.mean(), acc_list.std()), f…

服务器安全如何保障

主机安全是指保护计算机主机(也称为服务器、终端或主机设备)免受潜在的安全威胁和攻击的一系列措施和实践。主机安全旨在防止未经授权的访问、数据泄露、恶意软件感染和其他安全漏洞的利用,主机一旦被黑客入侵,企业会面临很多安全…