• freertos信号量之互斥信号量


    freertos信号量之互斥信号量

    简介

    互斥信号量(Mutex Semaphore)用于保护临界区资源,确保同一时间只有一个任务可以访问共享资源。以下是互斥信号量的常用函数及其说明:

    1)xSemaphoreCreateMutex()
    创建一个互斥信号量。该函数没有参数,返回一个互斥信号量的句柄,用于后续操作。

    2)xSemaphoreTake(SemaphoreHandle_t xMutex, portTickType xBlockTime)
    获取互斥信号量。xMutex参数是互斥信号量的句柄,xBlockTime参数指定等待时间。如果等待时间超过0,则任务会阻塞等待,直到获取到互斥信号量为止;如果等待时间为0,则任务不会阻塞,直接返回获取结果。

    3)xSemaphoreGive(SemaphoreHandle_t xMutex)
    释放互斥信号量。xMutex参数是互斥信号量的句柄。只有已持有互斥信号量所有权的任务才能释放它。
    4)xSemaphoreDelete(SemaphoreHandle_t xMutex)

    删除一个互斥信号量。xMutex参数是互斥信号量的句柄。删除后,其他任务将无法再使用该互斥信号量。

    使用注意点:

    互斥信号量只有一个任务可以使用,其他任务必须等待该任务释放互斥信号量后才能继续访问共享资源。
    互斥信号量可以在任务间同步,保证同一时间只有一个任务可以访问共享资源,避免了资源竞争和数据不一致的问题。
    互斥信号量也可以用于实现优先级翻转的控制。

    例程

    #include   
    #include   
    #include   
      
    // 定义互斥信号量的初始状态为0  
    static MutexHandle_t mutex = 0;  
      
    void vATask( void * pvParameters )  
    {  
     portTickType xDelay;  
      
     for( ;; )  
     {  
     // 任务进入临界区,获取互斥信号量并加锁  
     xMutexTake( mutex, portMAX_DELAY ); // 等待信号量变为0,阻塞状态最长时间为portMAX_DELAY  
     //临界区代码,访问共享资源  
     // ...  
     // 释放互斥信号量并解锁  
     xMutexGive( mutex );  
      
     // 延时一定时间后再次进入临界区  
     xDelay = pdMS_TO_TICKS( 1000 ); // 延时1秒  
     portYIELD_WITHIN( xDelay );  
     }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在上述示例中,任务vATask首先进入临界区并尝试获取互斥信号量。如果互斥信号量的值为零,任务会阻塞等待。一旦任务获取到互斥信号量,就可以访问共享资源。当任务完成对共享资源的访问后,释放互斥信号量,允许其他任务获取该资源。同时,任务进入临界区的代码执行完成后,会释放互斥信号量,以便其他任务可以获取该资源。

  • 相关阅读:
    处理多对一映射关系的三种方法
    Vue学习之样式汇总
    springboot集成rabbitmq:fanout、topic
    Elasticsearch:wildcard - 通配符搜索
    做音视频开发要掌握哪些知识?
    wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】
    细胞凋亡通路 | MedChemExpress
    基于Node.js 和 FFmpeg构建自动化脚本用来转码视频
    【即将开源】⽤于3D激光雷达SLAM闭环检测的词袋模型BoW3D
    树中的拓扑排序
  • 原文地址:https://blog.csdn.net/techenliu/article/details/133637913