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

freertos信号量之二值信号量

freertos信号量之二值信号量

    • 简介
    • 例程

简介

FreeRTOS的二值信号量(Binary Semaphore)是用于实现进程间同步和临界资源保护的重要工具。以下是一些二值信号量的常用函数及其说明:

1)xSemaphoreCreateBinary()
创建一个二值信号量。该函数接受一个无符号整型参数,用于指定信号量的初始值。如果初始值为0,则表示信号量未被占用;否则,表示信号量已被占用。

2)xSemaphoreTake(SemaphoreHandle_t xSemaphore, portTickType xBlockTime)
获取二值信号量。该函数会尝试获取信号量,如果信号量可用,则获取成功并立即返回;否则,如果信号量不可用,函数会阻塞调用任务,直到信号量可用或超时。xBlockTime参数指定阻塞时间,单位为系统时钟节拍数。

3)xSemaphoreGive(SemaphoreHandle_t xSemaphore)
释放二值信号量。该函数会将信号量的值置为1,表示信号量可用。如果有任务正在等待该信号量,则其中一个任务将被唤醒并继续执行。

4)xSemaphoreGetCount(SemaphoreHandle_t xSemaphore)
获取二值信号量的当前值。该函数返回信号量的当前值,即0或1。

5)xSemaphoreDelete(SemaphoreHandle_t xSemaphore)
删除一个二值信号量。该函数会释放与信号量关联的资源,并使信号量无效。

使用注意点
二值信号量只有两个状态,0和1,因此只能用于简单的同步和资源保护场景。
二值信号量不支持优先级继承,因此不会出现优先级反转的问题。
在释放信号量时,需要注意保证调用xSemaphoreGive()函数的代码能够正确执行,否则可能导致信号量无法释放而引起死锁。

例程

#include <FreeRTOS.h>  
#include <task.h>  
  
// 定义二值信号量的初始状态为0  
static SemaphoreHandle_t binarySemaphore = 0;  
  
void vATask( void * pvParameters )  
{  
 portTickType xDelay;  
  
 for( ;; )  
 {  
 // 任务进入临界区,保护临界资源  
 xSemaphoreTake( binarySemaphore, ( portTickType ) 0 ); // 等待信号量变为1  
 // 临界区代码,保护临界资源  
 // ...  
 // 释放信号量,使信号量状态变为0,允许其他任务或中断服务程序进入临界区  
 xSemaphoreGive( binarySemaphore );  
  
 // 延时一定时间后再次进入临界区  
 xDelay = pdMS_TO_TICKS( 1000 ); // 延时1秒  
 portYIELD_WITHIN( xDelay );  
 }  
}  
  
void vAnInterruptServiceRoutine( void )  
{  
// 中断服务程序中获取二值信号量,保护中断服务程序的代码不被打断  
xSemaphoreTakeFromISR( binarySemaphore, &xHigherPriorityTaskWoken );  
// 中断服务程序代码,保护中断服务程序的代码不被打断  
// ...  
// 中断服务程序释放二值信号量,允许任务进入临界区  
xSemaphoreGiveFromISR( binarySemaphore, &xHigherPriorityTaskWoken );  
}

在上述示例中,任务vATask首先进入临界区并等待二值信号量。当二值信号量的状态为0时,任务会阻塞等待。一旦任务进入临界区,就可以执行保护临界资源的代码。当任务完成临界区代码后,释放二值信号量,使其状态变为0,允许其他任务或中断服务程序进入临界区。

在中断服务程序中,也可以使用二值信号量来保护中断服务程序的代码不被打断。当低优先级的中断发生时,中断服务程序会获取二值信号量并快速处理少部分工作。一旦中断服务程序完成工作,就会释放二值信号量,允许高优先级的中断或任务进入临界区。


文章转载自:
http://chappow.hfytgp.cn
http://acritical.hfytgp.cn
http://boo.hfytgp.cn
http://ablare.hfytgp.cn
http://aluminography.hfytgp.cn
http://aesthetism.hfytgp.cn
http://bacterial.hfytgp.cn
http://cesspool.hfytgp.cn
http://banffshire.hfytgp.cn
http://arthropathy.hfytgp.cn
http://bistort.hfytgp.cn
http://californite.hfytgp.cn
http://bargainor.hfytgp.cn
http://affricate.hfytgp.cn
http://aweather.hfytgp.cn
http://atabal.hfytgp.cn
http://bismuthous.hfytgp.cn
http://ackey.hfytgp.cn
http://atmospherical.hfytgp.cn
http://astaticism.hfytgp.cn
http://belled.hfytgp.cn
http://amplitudinous.hfytgp.cn
http://achelous.hfytgp.cn
http://chaldaea.hfytgp.cn
http://answerable.hfytgp.cn
http://baddie.hfytgp.cn
http://butene.hfytgp.cn
http://castilian.hfytgp.cn
http://asbestine.hfytgp.cn
http://aerodyne.hfytgp.cn
http://www.dtcms.com/a/2117.html

相关文章:

  • C++ - 右值引用 和 移动拷贝
  • NPM 常用命令(九)
  • Java中栈实现怎么选?Stack、Deque、ArrayDeque、LinkedList(含常用Api积累)
  • Docker 日志管理 - ELK
  • C++用hiredis访问redis
  • 目标检测YOLO实战应用案例100讲-基于无人机航拍图像的目标检测
  • 第1次 更多的bash shell命令
  • Matrix卡顿优化之IdleHandlerLagTracer源码分析
  • C#上位机——根据命令发送
  • 专业PDF编辑阅读工具PDF Expert mac中文特点介绍
  • 浅析如何在抖音快速通过新手期并积累粉丝
  • 【Vue3】定义全局变量和全局函数
  • leetcode 886. 可能的二分法
  • Go Gin Gorm Casbin权限管理实现 - 3. 实现Gin鉴权中间件
  • 大语言模型之十四-PEFT的LoRA
  • 基于安卓android微信小程序的旅游app系统
  • 网络和系统操作命令
  • 线程的概念及使用
  • 学习css 伪类:has
  • 【论文极速读】EMT——评估多模态LLM中的灾难性遗忘问题
  • 11.2 基本电路和基本分析方法
  • 从抽象类和普通类的区别中体会设计模式
  • 软件测试面试大全(2023版,答案+文档)
  • Docker项目部署
  • 零基础转行网络工程师,过来人给的一些建议
  • 如何自学(黑客)网络安全技术————(详细分析学习思路)方法
  • CUDA+cuDNN+TensorRT 配置避坑指南
  • Git远程仓库
  • java 将字符串转为Base64格式与将Base64内容解析出来
  • 如何让FileBeat支持http的output插件