freertos通讯---信号量与队列

2023-05-16

哈喽,又见面了.

一.信号量

1.1创建二进制信号量

#define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )

上篇队列已经提到,信号量也是用队列实现的.这里semSEMAPHORE_QUEUE_ITEM_LENGTH是0,最后一个参数queueQUEUE_TYPE_BINARY_SEMAPHORE其实没有使用.

1.2创建计数信号量

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

计数信号量和二进制其实一样

 

1.3创建互斥锁

#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )

互斥锁创建稍有不同.其中uxQueueType是一个宏定义,本质上是pchead.用NULL指针来区分信号量和互斥锁.

亲爱的观众朋友们,是不是特别眼熟,不是脸盲(美女我还是认得清楚,哈哈)

这不是就是队列发送的套路吗?

为什么要在这里释放一次了?秘密就在prvCopyDataToQueue函数,来再看一眼

这里我截取了互斥锁的操作.

优先级反转恢复.

互斥锁只能用于任务,中断中不能使用.互斥锁必须获取后再释放.必须形成一个闭环的操作.而信号量不需要,信号量只是单身狗,

注定是要孤独一辈子的.

 

2.1信号量释放

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

熟悉吗?互斥锁创建时也释放了一次,因为uxMessagesWaiting是0,任务要获取锁成功,所以创建时必须主动释放.

 

3.2信号量获取

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

哈哈,脸熟,脸盲.

就是多了互斥锁的一些操作,其他和队列的获取基本一致.

来看看互斥锁多了哪些操作

1.首先当前任务pxCurrentTCB->uxMutexesHeld加1.表明当前任务在使用互斥锁了

2.如果阻塞等待,判断是否需要优先级继承.函数xTaskPriorityInherit处理这部分

3.如果获取到互斥锁的任务发生了优先级继承,此时另外一个任务等待超时后,仍然没有获取到锁,那么恢复获取到互斥锁任务的优先级到初始的优先级.

以上就是继承和反继承的代码.逻辑还是很清晰的

 

4.思考与总结

信号量和互斥量作为任务通讯的方式,由于使用队列实现,效率不高

所以作者推荐使用任务通知的方式实现简单信号量和互斥锁的功能

下一章讲解任务的通知

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freertos通讯---信号量与队列 的相关文章

  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect

随机推荐

  • Bluez去掉绝对音量支持

    修改bluez 5 37中 profiles audio avrcp c 去掉改支持AVRCP EVENT VOLUME CHANGED 3816 session gt supported events 61 3817 1 lt lt AV
  • 为何每次用完 ThreadLocal 都要调用 remove()?——内存泄漏

    什么是内存泄漏 内存泄漏指的是 xff0c 当某一个对象不再有用的时候 xff0c 占用的内存却不能被回收 xff0c 这就叫作内存泄漏 因为通常情况下 xff0c 如果一个对象不再有用 xff0c 那么我们的垃圾回收器 GC xff0c
  • CountDownLatch 是如何安排线程执行顺序的?

    CountDownLatch xff0c 它是 JDK 提供的并发流程控制的工具类 xff0c 它是在 java util concurrent 包下 xff0c 在 JDK1 5 以后加入的 比如我们去游乐园坐激流勇进 xff0c 有的时
  • 发生死锁必须满足哪 4 个条件?

    要想发生死锁有 4 个缺一不可的必要条件 第 1 个叫互斥条件 xff0c 它的意思是每个资源每次只能被一个线程 xff08 或进程 xff0c 下同 xff09 使用 xff0c 为什么资源不能同时被多个线程或进程使用呢 xff1f 这是
  • 红黑树和二叉树有什么区别?

    红黑树和二叉树有什么区别 xff1f 什么是二叉树 xff1f 什么是红黑树 xff1f 二叉树 xff08 Binary Tree xff09 是指每个节点最多只有两个分支的树结构 xff0c 即不存在分支大于 2 的节点 xff0c 二
  • 什么是TCC?

    假设现在有一个电商系统 xff0c 里面有一个支付订单的场景 xff0c 那对一个订单支付之后 xff0c 我们需要做下面的步骤 更改订单的状态为 已支付 扣减商品库存 给会员增加积分 创建销售出库单通知仓库发货 业务场景有了 xff0c
  • Java 泛型机制介绍

    Java泛型这个特性是从JDK 1 5才开始加入的 xff0c 因此为了兼容之前的版本 xff0c Java泛型的实现采取了 伪泛型 的策略 xff0c 即Java在语法上支持泛型 xff0c 但是在编译阶段会进行所谓的 类型擦除 xff0
  • 云计算服务三层架构-IaaS-PaaS-SaaS解析

    IaaS 基础设施即服务 Infrastructure as a service 通即虚拟的硬件资源 xff0c 如虚拟的主机 存储 网络 安全等资源 用户无需购买服务器 网络设备和存储设备 xff0c 只需要通过网络租赁即可搭建自己的应用
  • Spring事务的传播属性和隔离级别

    事务传播行为 如果在开始当前事务之前 xff0c 一个事务上下文已经存在 xff0c 此时有若干选项可以指定一个事务性方法的执行行为 64 Transactional propagation 61 Propagation REQUIRED
  • MySQL有多少种常用的日志,有什么作用

    redo 重做日志 作用 xff1a 确保事务的持久性 xff0c 防止在发生故障 xff0c 脏读未写回磁盘 重启数据库会进入 redo log 执行 重做 xff0c 到达事务一致性 undo 回滚日志 作用 xff1a 保证数据的原子
  • 自动控制算法的学习笔记

    1 PID调试步骤 没有一种控制算法比PID调节规律更有效 更方便的了 现在一些时髦点的调节器基本源自PID 甚至可以这样说 xff1a PID调节器是其它控制调节算法的基础 为什么PID应用如此广泛 又长久不衰 xff1f 因为PID解决
  • stm32 应用实例—— USART 串口通讯

    stm32 应用实例 USART 串口通讯 1 基于寄存器 固件库编程的差异性2 完成STM32的USART窗口通讯程序4 重温C语言程序里全局变量 局部变量 堆 栈等概念 xff0c 并验证3 归纳出stm32的堆 栈 全局变量的分配地址
  • windows BDA driver (abstract)

    AVStream is a Microsoft provided multimedia class driver that supports video only streaming and integrated audio video s
  • 详细解读Python豆瓣电影Top250网页爬取(主要对re的运用&excel保存数据)//包括对库的简介

    python里面有很多操作都类似于c语言 xff0c 这里在爬取时主要需要注意用到的是for循环语句和各种库 个人认为python中主要还是对库的运用比较占大比例 xff08 这里的软件版本是PyCharm 2020 3 2 x64 xff
  • Unity3D 委托和事件的优点(一)

    上周接触到了委托 这周终于在自己的项目中用到了 现在准备用委托和事件的方案 替换掉之前的一些使用不足的解决方案 在此感谢前辈们的优秀文章 我是根据在网上阅读的文章 通过自己的见解 并在自己的项目中进行实践 得出了一些结论与大家分享 我认为这
  • 我的保研经历——中国科学院计算技术研究所

    忙碌了大半年的保研事情已经尘埃落定了 xff0c 心理也踏实下来了 xff0c 总想着把自己的这段保研经历记录下来 xff0c 希望能对小伙伴们有所帮助 能来到ZZ并且读软件工程这个专业并且阴差阳错的进了卓越班也算是老天注定吧 xff08
  • 无限循环:while True+if...break(打破循环) 用法

    span class token keyword while span True span class token punctuation span p span class token operator 61 span span clas
  • freertos的核心---线程与调度

    一 划重点 划重点 划重点 线程就是freertos运行管理的最小单位 一个线程有自己的生命周期 可以是一段时间也可以是forever 具体看开发人员对于线程的规划 几个线程 每个线程处理什么事情 先来看看线程长啥样 xff1f xff08
  • freertos通信---信号量与队列

    嘿嘿 又见面了 到这里 任务的调度和切换 你已经有了深刻的理解 接下来 自然而然就是任务间的通讯咯 把相关的任务串联起来 就形成了程序的基本架构 一 队列 为什么要先讲解队列了 因为信号量就是利用队列来实现的 走 一起瞅瞅 1 1队列的创建
  • freertos通讯---信号量与队列

    哈喽 又见面了 一 信号量 1 1创建二进制信号量 define xSemaphoreCreateBinary xQueueGenericCreate UBaseType t 1 semSEMAPHORE QUEUE ITEM LENGTH