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

  • 相关阅读:
    day8--socket文件传输
    day8--socket网络编程进阶
    day5模块学习--re正则模块
    day6作业--游戏人生完善
    day1作业--登录接口
    expect自动化工具
    day17--JQuery实例
    day17--JQuery
    day--16页面布局
    day16--HTML、CSS、JavaScript总结
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709475.html
Copyright © 2011-2022 走看看