FreeRTOS学习笔记>信号量

信号量(Semaphore)是FreeRTOS中一种常用的同步机制,用于管理多个任务之间的访问资源的控制。

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护。

信号量可以分为二进制信号量和计数信号量:

  1. 二进制信号量 :
    • 只有两个状态:有信号和无信号。
    • 常用于实现简单的任务同步和互斥锁。
  2. 计数信号量 :
    • 可以有多个信号,用于管理多个相同资源的访问。
    • 适用于资源数量有限的场景,比如一组相同类型的硬件外设。
  3. 互斥信号量:
    • 也被称为互斥锁(Mutex),用于保护共享资源,确保同一时间只有一个任务可以访问该资源。
    • 互斥信号量有优先级继承机制,避免任务优先级反转问题。
  4. 递归信号量:
    • 允许同一任务多次获得信号量,而不导致死锁。
    • 适用于需要递归访问资源的场景。

信号量的创建和使用

  • 创建信号量:

    复制代码
    //创建二值信号量
    SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();
    
    /*********
    * 创建计数信号量
    * 计数信号量的最大值
    * 创建计数信号量的初始值
    **********/
    SemaphoreHandle_t xSemaphore = xSemaphoreCreateCounting(5,5);
  • 获取信号量:

    复制代码
    if (xSemaphoreTake(xSemaphore, (TickType_t) 10) == pdTRUE) {
        // 成功获取信号量,执行相关操作
    } else {
        // 获取信号量失败,处理超时情况
    }
    
    //中断中需使用xQueueReceiveFromISR()代替
  • 释放信号量:

    复制代码
    xSemaphoreGive(xSemaphore);
  • 删除信号量

    复制代码
    vSemaphoreDelete(xSemaphore);

二进制信号量的应用场景

二进制信号量通常用于任务间的同步和资源的互斥访问。例如:

  • 任务同步: 一个任务在执行完某个操作后,通过释放信号量通知其他任务可以继续执行。
  • 互斥锁: 确保同一时刻只有一个任务可以访问某个共享资源,避免资源冲突。

计数信号量的应用场景

计数信号量适用于管理多个相同资源的访问。例如:

  • 资源池管理: 例如多个相同类型的硬件外设,计数信号量可以用来控制这些设备的访问数量。
  • 任务同步: 多个任务等待同一个事件的发生,当事件发生时,计数信号量可以同时解除多个任务的等待状态。

小结

信号量在FreeRTOS中的使用可以有效避免任务之间的资源冲突,实现任务间的有效协作和同步。无论是二进制信号量还是计数信号量,它们都为实时操作系统提供了灵活而强大的任务同步和资源管理机制。

欢迎指出博客中的错误,如果你觉得对你有用,记得点赞三连,有问题可留言,会及时回复

相关推荐
一介书生-0072 分钟前
2025-10-27 Java AI学习路线
java·人工智能·学习
superlls6 分钟前
(场景题)怎么实现数据的批量插入?
笔记·mybatis
繁花与尘埃28 分钟前
CSS引入方式(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
css·笔记·学习
Century_Dragon36 分钟前
新能源汽车故障诊断与排除虚拟实训软件:赋能职业教育利器
学习
_落纸1 小时前
《自动控制原理》第 3 章 线性控制系统的运动分析:3.6、3.7
笔记·自动化
colus_SEU2 小时前
【计算机网络笔记】第一章 计算机网络导论
笔记·计算机网络·1024程序员节
koo3643 小时前
李宏毅机器学习笔记33
人工智能·笔记·机器学习
IT伟哥3 小时前
软件设计师重点笔记-3
笔记·软考·软件设计师·软考备考
航Hang*3 小时前
第1章:初识Linux系统——第8节:查看/修改权限控制和ACL
linux·运维·服务器·笔记·操作系统
m0_626535203 小时前
数据结构学习,一些知识点
数据结构·学习