资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)
目录
一、计数信号量的定义与应用
1、计数信号量的定义
①取值只有0与1两种状态的信号量称之为二值信号量;取值大于1的信号量称之为计数信号量
②计数信号量是一种长度大于1,消息大小为0的特殊消息队列。
③计数信号量的取值也可以为1,但通常大于1,如果取值为1,相当于只有0与1两种状态,用二值信号量即可。
④创建计数信号量时,系统会为创建的计数信号量分配内存,计数信号量创建完成后的示意图如下:

2、计数信号量的应用
在嵌入式操作系统中,计数信号量是资源管理的重要手段,主要用于任务与任务间。
应用场景:
计数信号量允许多个任务对其进行操作,但限制了任务的数量。比如有一个停车场,里面只有50个车位,那么只能停50辆车,相当于我们的信号量有50 个。假如一开始停车场的车位还有50个,那么每进去一辆车就要消耗一个停车位,车位的数量就要减1,相应地,我们的信号量在使用之后也需要减 1。当停车场停满了50 辆车时,此时的停车位数量为 0,再来的车就不能停进去了,否则将没法停车了,也相当于我们的信号量为0,后面的任务对这个停车场资源的访问也无法进行。当有车从停车场离开时,车位又空余出来了,那么后面的车就能停进去了。信号量操作也是一样的,当我们释放了这个资源,后面的任务才能对这个资源进行访问。
二、计数信号量的运作机制
1、任务间计数信号量的实现
任务间信号量的实现是指各个任务之间使用信号量实现任务的同步或者资源共享功能。

①运行条件:
创建 任务 Task1 和 Task2至N。
创建计数信号量可用资源为N。
②运行过程描述如下:
任务 Task1 运行过程中调用函数 xSemaphoreTake 获取信号量资源,如果信号量大于0,Task1 将直接获取资源。如果信号量为0,任务 Task1 将由运行态转到阻塞状态,等待资源可用。一旦获取了资源并使用完毕后会通过函数 xSemaphoreGive 释放掉资源。
任务 Task2至N 运行过程中调用函数 xSemaphoreTake 获取信号量资源,如果信号量大于0,Task2至N 将直接获取资源。如果信号量为0,任务 Task2至N将由运行态转到阻塞状态,等待资源可用。一旦获取了资源并使用完毕后会通过函数 xSemaphoreGive 释放掉资源。
三、计数信号量常用的API函数
1、计数信号量典型流程与API函数
创建计数信号量 xSemaphoreCreateCounting()
释放计数信号量 xSemaphoreGive() 与 xSemaphoreGiveFromISR()
获取计数信号量 xSemaphoreTake()
删除计数信号量 vSemaphoreDelete()
2、计数信号量创建与删除
①计数信号量控制块(句柄)
如下图:计数信号量的句柄为消息队列的句柄,因为计数信号量是一种长度大于1,消息大小为0的特殊消息队列
FreeRTOS计数信号量详解:多任务间的资源管理

本文详细介绍了FreeRTOS中的计数信号量,包括其定义、应用、运作机制和常用API函数,重点展示了如何在多任务环境中管理资源,如停车场车位的模拟例子。
最低0.47元/天 解锁文章
819

被折叠的 条评论
为什么被折叠?



