• FreeRTOS计数型信号量


    API函数

    //创建
    #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
        #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) 
                                    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )
        QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, 
                                                    const UBaseType_t uxInitialCount )
    #endif
    
    //释放
    #define xSemaphoreGive( xSemaphore )        
    xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
    BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, 
                                TickType_t xTicksToWait, const BaseType_t xCopyPosition )
    
    //获取信号量值
    #define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )
    UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue )
    
    //等待
    #define xSemaphoreTake( xSemaphore, xBlockTime )        
    xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
    BaseType_t xQueueGenericReceive( QueueHandle_t xQueue, void * const pvBuffer, 
                                    TickType_t xTicksToWait, const BaseType_t xJustPeeking )

    使用举例

    SemaphoreHandle_t semaphore;
    
    void start_task(void *pvParameters)
    {
        semaphore = xSemaphoreCreateCounting(10, 0);
    }
    
    void give_task(void *pvParameters)
    {
        UBaseType_t count;
    
        while(1)
        {
            key = KEY_Scan(0);
            if(key == WKUP_PRES)
            {
                err = xSemaphoreGive(semaphore);
    
                count = uxSemaphoreGetCount(semaphore);
    
                printf("give_task uxSemaphoreGetCount %d
    ", count);
            }
    
            vTaskDelay(10);
        }
    }
    
    void take_task(void *pvParameters)
    {
        while(1)
        {
            xSemaphoreTake(semaphore, portMAX_DELAY);
    
            count = uxSemaphoreGetCount(semaphore);
    
            printf("take_task uxSemaphoreGetCount %d
    ", count);
    
            vTaskDelay(1000);
        }
    }

    实验现象
    1

  • 相关阅读:
    web自动化框架如何设计
    如何保证元素定位的成功率(等待机制)
    验证码问题处理
    selenium元素定位
    网路知识总结(session&&Cookie&&三次握手&&请求头)
    python中方法的总结
    Twelve Day 检测大写字母
    超过5名学生的课(SQL语句)
    The Eleven Day 删除排序数组中的重复项
    删除重复的电子邮箱(SQL语句)
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709475.html
Copyright © 2020-2023  润新知