• freertos信号量之二值信号量


    freertos信号量之二值信号量

    简介

    FreeRTOS的二值信号量(Binary Semaphore)是用于实现进程间同步和临界资源保护的重要工具。以下是一些二值信号量的常用函数及其说明:

    1)xSemaphoreCreateBinary()
    创建一个二值信号量。该函数接受一个无符号整型参数,用于指定信号量的初始值。如果初始值为0,则表示信号量未被占用;否则,表示信号量已被占用。

    2)xSemaphoreTake(SemaphoreHandle_t xSemaphore, portTickType xBlockTime)
    获取二值信号量。该函数会尝试获取信号量,如果信号量可用,则获取成功并立即返回;否则,如果信号量不可用,函数会阻塞调用任务,直到信号量可用或超时。xBlockTime参数指定阻塞时间,单位为系统时钟节拍数。

    3)xSemaphoreGive(SemaphoreHandle_t xSemaphore)
    释放二值信号量。该函数会将信号量的值置为1,表示信号量可用。如果有任务正在等待该信号量,则其中一个任务将被唤醒并继续执行。

    4)xSemaphoreGetCount(SemaphoreHandle_t xSemaphore)
    获取二值信号量的当前值。该函数返回信号量的当前值,即0或1。

    5)xSemaphoreDelete(SemaphoreHandle_t xSemaphore)
    删除一个二值信号量。该函数会释放与信号量关联的资源,并使信号量无效。

    使用注意点
    二值信号量只有两个状态,0和1,因此只能用于简单的同步和资源保护场景。
    二值信号量不支持优先级继承,因此不会出现优先级反转的问题。
    在释放信号量时,需要注意保证调用xSemaphoreGive()函数的代码能够正确执行,否则可能导致信号量无法释放而引起死锁。

    例程

    #include   
    #include   
      
    // 定义二值信号量的初始状态为0  
    static SemaphoreHandle_t binarySemaphore = 0;  
      
    void vATask( void * pvParameters )  
    {  
     portTickType xDelay;  
      
     for( ;; )  
     {  
     // 任务进入临界区,保护临界资源  
     xSemaphoreTake( binarySemaphore, ( portTickType ) 0 ); // 等待信号量变为1  
     // 临界区代码,保护临界资源  
     // ...  
     // 释放信号量,使信号量状态变为0,允许其他任务或中断服务程序进入临界区  
     xSemaphoreGive( binarySemaphore );  
      
     // 延时一定时间后再次进入临界区  
     xDelay = pdMS_TO_TICKS( 1000 ); // 延时1秒  
     portYIELD_WITHIN( xDelay );  
     }  
    }  
      
    void vAnInterruptServiceRoutine( void )  
    {  
    // 中断服务程序中获取二值信号量,保护中断服务程序的代码不被打断  
    xSemaphoreTakeFromISR( binarySemaphore, &xHigherPriorityTaskWoken );  
    // 中断服务程序代码,保护中断服务程序的代码不被打断  
    // ...  
    // 中断服务程序释放二值信号量,允许任务进入临界区  
    xSemaphoreGiveFromISR( binarySemaphore, &xHigherPriorityTaskWoken );  
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在上述示例中,任务vATask首先进入临界区并等待二值信号量。当二值信号量的状态为0时,任务会阻塞等待。一旦任务进入临界区,就可以执行保护临界资源的代码。当任务完成临界区代码后,释放二值信号量,使其状态变为0,允许其他任务或中断服务程序进入临界区。

    在中断服务程序中,也可以使用二值信号量来保护中断服务程序的代码不被打断。当低优先级的中断发生时,中断服务程序会获取二值信号量并快速处理少部分工作。一旦中断服务程序完成工作,就会释放二值信号量,允许高优先级的中断或任务进入临界区。

  • 相关阅读:
    JZ19 正则表达式匹配
    基于有限内存BFGS方法的优化研究
    面试高潮季来临,Android 程序猿该如何斩获大厂offer?
    【零基础微信小程序】证件照换底色小程序实战开发
    gcc中动态库和静态库的链接顺序
    Flink 物理执行图
    【无标题】算法不能盲目刷!!算法修炼手册(持续更新)
    基于JavaSwing开发聊天系统设计(群聊+服务器+客户端+MYSQL数据库) 毕业设计
    DPDK代码目录结构
    分享物流跟踪提醒的设置方法
  • 原文地址:https://blog.csdn.net/techenliu/article/details/133637610