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

  • 相关阅读:
    Delphi下遍历文件夹下所有文件的递归算法
    mysql + unidac 使用事务例子
    新建DataSnap REST Application
    ClientDataSet中的错误处理
    TSQLConnection的事务处理
    ClientDataSet的查找和过滤功能
    TField中的GetText和SetText
    ClientDataSet中撤消与恢复操作及执行细节
    ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus
    ClientDataSet中动态添加计算字段
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709475.html
Copyright © 2011-2022 走看看