zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    docker 删除本地镜像
    hadoop 伪分布环境部署
    docker多镜像+nginx+django环境部署
    docker+django 运行环境部署
    设计数据结构-LRU缓存算法
    设计数据结构-Unionfind并查集算法
    String#intern理解
    java常见API和集合
    链表总结
    二叉树的基础总结
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709475.html
Copyright © 2011-2022 走看看