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

freertos信号量之计数信号量

freertos信号量之计数信号量

    • 简介
    • 例程

简介

计数信号量(Counting Semaphore)用于管理共享资源的访问。以下是计数信号量的常用函数及其说明:

1)xSemaphoreCreateCounting(unsignedportBASE_TYPE uxMaxCount, unsignedportBASE_TYPE uxInitialCount)
创建一个计数信号量。uxMaxCount参数指定计数信号量的最大值,即共享资源的数量;uxInitialCount参数指定计数信号量的初始值,即共享资源的可用数量。

2)xQueueCreateCountingSemaphore(unsignedportBASE_TYPE uxCountValue, unsignedportBASE_TYPE uxInitialCount):创建一个计数信号量。该函数与xSemaphoreCreateCounting()功能类似,但参数略有不同。

3)xSemaphoreTake(SemaphoreHandle_t xSemaphore, portTickType xBlockTime)
获取计数信号量。该函数会尝试获取计数信号量,如果计数信号量可用,则获取成功并立即返回;否则,如果计数信号量不可用,函数会阻塞调用任务,直到计数信号量可用或超时。

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

5)xSemaphoreGetCount(SemaphoreHandle_t xSemaphore)
获取计数信号量的当前值。该函数返回计数信号量的当前值,即0到uxMaxCount之间的一个整数值。

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

使用注意点:

计数信号量的值表示共享资源的可用数量。任务在使用完共享资源后,必须释放相应的计数信号量,以使其他任务可以继续使用共享资源。
计数信号量的最大值由uxMaxCount参数指定。当计数信号量的值达到最大值时,表示没有空闲共享资源可用。
可以通过xSemaphoreGetCount()函数获取当前可用的共享资源数量,以便任务根据实际情况做出相应处理。

例程

#include <FreeRTOS.h>  
#include <task.h>  // 定义计数信号量的初始状态为0  
static SemaphoreHandle_t countingSemaphore = 0;  void vATask( void * pvParameters )  
{  portTickType xDelay;  for( ;; )  {  // 任务进入临界区,获取计数信号量  xSemaphoreTake( countingSemaphore, ( portTickType ) 0 ); // 等待信号量大于0  // 临界区代码,访问共享资源  // ...  // 释放计数信号量,允许其他任务访问共享资源  xSemaphoreGive( countingSemaphore );  // 延时一定时间后再次进入临界区  xDelay = pdMS_TO_TICKS( 1000 ); // 延时1秒  portYIELD_WITHIN( xDelay );  }  
}

在上述示例中,任务vATask首先进入临界区并尝试获取计数信号量。如果计数信号量的值为零,任务会阻塞等待。一旦任务获取到计数信号量,就可以访问共享资源。当任务完成对共享资源的访问后,释放计数信号量,允许其他任务获取该资源。同时,任务进入临界区的代码执行完成后,会释放计数信号量,以便其他任务可以获取该资源。

http://www.lryc.cn/news/185162.html

相关文章:

  • wc命令使用指南 | 教你如何高效统计文件字数、行数和字符数
  • 网络安全:发起一次CSRF攻击!
  • java上传文件到指定服务器
  • 揭秘 Go 中的 new() 和 make() 函数
  • 【Spring Cloud】深入探索统一网关 Gateway 的搭建,断言工厂,过滤器工厂,全局过滤器以及跨域问题
  • 计算机竞赛 题目:基于卷积神经网络的手写字符识别 - 深度学习
  • 关于flink重新提交任务,重复消费kafka的坑
  • Win11右键恢复Win10老版本
  • ur机械臂30003端口socket通信踩坑(double类型数据怎么解析)
  • 代理IP与Socks5代理的技术奇妙之旅
  • 自动化测试定位不到元素?可能是 frame 在搞鬼
  • uni-app 开发中,监听 input 键盘事件获取不到按下按键值怎么办?
  • 【juc】countdownlatch实现并发网络请求
  • 在供应链管理中,如何做好库存分析?库存分析有哪些监控指标?
  • 黑豹程序员-架构师学习路线图-百科:Database数据库
  • 你相信光吗?黑灯工厂重新相信“光”
  • Ubuntu 20.04使用源码安装nginx 1.14.0
  • springboot框架拦截器中HttpServletRequest 请求如何区分是图片上传流还是普通的字符流?
  • 简单聊聊 TCP 协议
  • 钡铼BL124PN:简单快速转换Profinet到Ethernet/IP
  • 【golang】go 空结构体 详解 空结构体内容占用及大小
  • 身为产品经理该如何向客户推广API商品数据接口
  • 【数据结构】460. LFU 缓存
  • 文字转语音播报模块(一):阿里云nls服务使用示例
  • Vscode配置C#编程环境(win10)
  • python:xlrd 读取 Excel文件,显示在 tkinterTable 表格中
  • 深度学习——深度学习计算一
  • yolov5及yolov7实战之剪枝
  • 力扣第257题 二叉树的所有路径 c++ 树 深度优先搜索 字符串 回溯 二叉树
  • 保研之旅·终