IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRTOS信号量 & ESP32实战 -> 正文阅读

[嵌入式]FreeRTOS信号量 & ESP32实战

FreeRTOS信号量 & ESP32实战

阅读建议:有一定操作系统基础知识。

FreeRTOS信号量

1. 二值信号量

??二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。因此二值信号另更适合用于同步(任务与任务或任务与中断的同步),而互斥信号量适合用于简单的互斥访问。

API:

1. xSemaphoreCreateBinary()
请添加图片描述

??此函数是**vSemaphoreCreateBinary()**的新版本,新版本的FreeRTOS中统一用此函数来创建二值信号量。使用此函数创建二值信号量的话信号量所需要的RAM是由FreeRTOS 的内存管理部分来动态分配的。此函数创建好的二值信号量默认是空的,需要先释放一次信号量才能正常运行,此函数也是个宏,具体创建过程是由函数xQueueGenericCreate()来完成的,函数原型如下:

#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
	#define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )
#endif

??可以看到实际上 xSemaphoreCreateBinary() 宏定义是 xQueueGenericCreate() 这个就是我另一篇文章分析的队列的创建,所以本质上 xSemaphoreCreateBinary() 就是队列,

2. xSemaphoreGive()
请添加图片描述
??此函数用于释放二值信号量、计数型信号量或互斥信号量,此函数是一个宏,真正释放信号量的过程是由函数 xQueueGenericSend() 来完成的,函数原型如下:

#define xSemaphoreGive( xSemaphore )		xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

??可以看到实际上也是使用***xQueueGenericSend***队列的发送函数实现的。

3. xSemaphoreTake()
请添加图片描述
??此函数用于获取二值信号量、计数型信号量或互斥信号量,此函数是一个宏,真正释放信号量的过程是由函数***xQueueGenericSend()***来完成的,函数原型如下:

#define xSemaphoreTake( xSemaphore, xBlockTime )		xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )

2. 计数信号量

??二值信号量相当于长度为1的队列,那么计数型信号量就是长度大于1的队列。同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关心队列是否为空即可。计数型信号量通常用于如下两个场合:
1、事件计数
??在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减一,信号量值就是队列结构体成员变量uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始计数值为О。
2、资源管理
??在这个场合中,信号量值代表当前资源的可用数量,比如停车场当前剩余的停车位数量。一个任务要想获得资源的使用权,首先必须获取信号量,信号量获取成功以后信号量值就会减一。当信号量值为0的时候说明没有资源了。当一个任务使用完资源以后一定要释放信号量,释放信号量以后信号量值会加一。在这个场合中创建的计数型信号量初始值应该是资源的数量,比如停车场一共有100个停车位,那么创建信号量的时候信号量值就应该初始化为100。

API:
请添加图片描述

1. xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )
参数:uxMaxCount最大计数量
???uxInitialCount初始数量

函数原型:

#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

跳转到 xQueueCreateCountingSemaphore

QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
	{
	QueueHandle_t xHandle;

		configASSERT( uxMaxCount != 0 );
		configASSERT( uxInitialCount <= uxMaxCount );

		xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );
		创建一个队列,队列长度uxMaxCount,元素大小为queueSEMAPHORE_QUEUE_ITEM_LENGTH。queueSEMAPHORE_QUEUE_ITEM_LENGTH实际上为0,因为不需要拷贝元素,只传状态。

		if( xHandle != NULL )
		{
			( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;

			traceCREATE_COUNTING_SEMAPHORE();
		}
		else
		{
			traceCREATE_COUNTING_SEMAPHORE_FAILED();
		}

		return xHandle;
	}

可以看到实际上,就是调用了xQueueGenericCreate来实现计数信号量。
关于 xQueueGenericCreate 可以参考一下这个FreeRTOS消息队列 & ESP32使用
2. xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount )
??二者除了创建方法不同并没有本质区别。这里不再赘述。

3. 信号量实验

??创建一个二值信号量,一个计数信号量,二值信号量用来提示完成初始化,计数信号量创建时初始值设为10,创建一个线程,每一秒获取一次计数信号量,一共获取10次,每一次获取都会动态刷新,最后屏幕显示计数信号量为1,并且不再变化。

程序框架如图:
请添加图片描述
效果演示:
请添加图片描述
项目源代码地址:GITEE

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:26:44  更:2021-10-09 16:28:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:41:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码