FreeRTOS递归信号量的意义

递归信号量的属性:同一个任务中,可以被获取多次,且需要释放相同次数才能被其他任务获取。

1.递归信号量的创建、获取、释放:

xxMux = xSemaphoreCreateRecursiveMutex();

xSemaphoreTakeRecursive(xxMux,osWaitForever);

xSemaphoreGiveRecursive(xxMux);

2.例如有如下函数

void fun1(void)

{

  xSemaphoreTakeRecursive(xxMux,osWaitForever);

  //...code

  xSemaphoreGiveRecursive(xxMux);

}

void fun2(void)

{

  //...code

}

void fun(void)

{

  fun1();

  delay_ms(1000);

  fun2();

}

分析:fun1()是公用函数,可以被其他任何任务调用,fun2只是fun会调用。如果fun1()执行完之后,完全可能切换到了其他任务,而不能立即延时之后执行fun2(); 改成如下即可

void fun(void)

{

  xSemaphoreTakeRecursive(xxMux,osWaitForever); //......1

  fun1();

  delay_ms(1000);

  fun2();

  xSemaphoreGiveRecursive(xxMux);//........2

}

分析:如果上面1处改成普通的互斥量,则fun1执行完,切换到其他任务,其他任务也会执行fun1,但是fun2需要根据fun1的执行结果立即执行。所以必须确保fun1此时不被其他任务执行。

总结:递归信号量是为了保证在中间有公用函数的情况下,为连续执行代码段,保证公用函数不被其他任务执行,递归信号量因此而存在。

原文地址:https://www.cnblogs.com/ycpkbql/p/11770402.html

时间: 2024-11-08 19:49:52

FreeRTOS递归信号量的意义的相关文章

FreeRTOS 计数信号量

本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的源码实现是基于消息队列实现的. 信号量的概念及其作用信号量(semaphores)是 20 世纪 60 年代中期 Edgser Dijkstra 发明的. 使用信号量的最初目的是为了给共享资源建立一个标志,该标志表示该共享资源被占用情况.这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再来决定自己的行为.实际的应用中,信号量的作用又该如何体现

FreeRTOS 信号量

@(嵌入式) 简述 二进制信号量 二进制信号量使用 二进制信号量实现 创建信号量 获取信号量 释放信号量 中断中释放 任务中释放 计数信号量 互斥锁 创建互斥信号量 拿锁 放锁 递归互斥锁 获取递归信号量 释放递归信号量 参考 FreeRtos 简述 FreeRTOS 信号量和互斥锁是基于队列实现的, 队列介绍见 << FreeRTOS 消息队列 >>. 使用信号量需要在源文件中包含头文件 semphr.h , 该文件定义了信号量的 API, 实际我们使用的信号量 API 都是宏定

FreeRTOS系列第20篇---FreeRTOS信号量API函数

FreeRTOS的信号量包括二进制信号量.计数信号量.互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量).我们可以把互斥量和递归互斥量看成特殊的信号量. 信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 二进制信号量.计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的:递归互斥信号量的创建.获取和释放API函数都是独立的. 1创建二进制信号量 1.1

FreeRTOS高级篇6---FreeRTOS信号量分析

FreeRTOS的信号量包括二进制信号量.计数信号量.互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量).关于它们的区别可以参考< FreeRTOS系列第19篇---FreeRTOS信号量>一文. 信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 二进制信号量.计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的:递归互斥信号量的创建.获取和释放AP

FreeRTOS 任务计数信号量,任务二值信号量,任务事件标志组

本章节为大家讲解 FreeRTOS 计数信号量的另一种实现方式----基于任务通知(Task Notifications)的计数信号量,这里我们将这种方式实现的计数信号量称之为任务计数信号量. 任务计数信号量效率更高,需要的 RAM 空间更小.当然,缺点也是有的,它没有之前介绍的计数信号量实现的功能全面. 任务通知(Task Notifications)介绍FreeRTOS 每个已经创建的任务都有一个任务控制块(task control block),任务控制块就是一个结构体变量,用于记录任务的

FreeRTOS 二值信号量,互斥信号量

本章节讲解 FreeRTOS 任务间的同步和资源共享机制,二值信号量. 二值信号量是计数信号量的一种特殊形式,即共享资源为 1 的情况. FreeRTOS 分别提供了二值信号量和计数信号量,其中二值信号量可以理解成计数信号量的一种特殊形式,即初始化为仅有一个资源可以使用,只不过 FreeRTOS 对这两种都提供了 API函数,而像 RTX,uCOS-II 和 III 是仅提供了一个信号量功能,设置不同的初始值就可以分别实现二值信号量和计数信号量. 当然,FreeRTOS 使用计数信号量也能够实现

FreeRTOS_信号量

FreeRTOS信号量 信号量是操作系统总重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量.计数型信号量.互斥信号量和递归互斥信号量.不同的信号量其应用场景不同,但是有些场景是可以互换着使用的. 信号量简介 信号量常常用于控制对共享资源的访问和任务同步.举一个很常见的例子,某个停车场有100个停车位,这100个停车位大家都可以使用,对于大家说这100个停车位就是共享资源.假设现在这个停车场正常运行,你要把车停到这个停车场肯定要先看一下现在停了多少车了?

Linux进程间通信 -- 信号量 semget()、semop()、semctl()

这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信 -- 信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同

Linux进程间通信——使用信号量(转)

这篇文章将讲述别一种进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同