FreeRTOS之计数信号量实验

1、 介绍计数信号量
①使用计数信号要包含#include "semphr.h"头文件

2、 创建give任务和take任务,创建最大信号量为5和有效值为5的计数信号量。

void m_create_count_sem(void)
{
    CountSem_Handle = xSemaphoreCreateCounting(5,5);
//    CountSem_Handle = xQueueCreateCountingSemaphore( 5,5 );
    if(NULL != CountSem_Handle)
        LOG_BLE("create count sem task ok\r\n");

    xTaskCreate(take_task, "take_task", configMINIMAL_STACK_SIZE + 200, NULL, 2, &take_task_handle);
    xTaskCreate(give_task, "give_task", configMINIMAL_STACK_SIZE + 200, NULL, 2, &give_task_handle);
}

3、 编写内存的测试任务入口函数

#include "semphr.h"


#ifndef TAG_BLE
#define LOG_BLE(...)
#endif

static SemaphoreHandle_t CountSem_Handle =NULL;
static TaskHandle_t  take_task_handle;
static TaskHandle_t  give_task_handle;

static void take_task (void * pvParameter)
{
    BaseType_t xReturn = pdPASS;
    uint8_t button1_sta=0;
    while (true)
    {

        if (READ_BUTTON1_P11() == BUTTON_PUSH)
        {
            if (button1_sta==0)
            {
                xReturn = xSemaphoreTake(CountSem_Handle,0);
                if ( pdTRUE == xReturn )
                {
                    LOG_BLE("take count sem ok\n");
                    LOG_BLE("current left count sem:%d\n",uxSemaphoreGetCount(CountSem_Handle));
                } else
                {
                    LOG_BLE("take count sem error\n")
                }
                button1_sta = 1;
            }

        } else
        {
            button1_sta = 0;
        }

        vTaskDelay(20);
    }
}

static void give_task (void * pvParameter)
{
    BaseType_t xReturn = pdTRUE;
    uint8_t button1_sta=0;
    while (true)
    {
        if (READ_BUTTON2_P12() == BUTTON_PUSH)
        {
            if (button1_sta==0)
            {
                xReturn = xSemaphoreGive(CountSem_Handle);
                TOGGLE_LED13();
                if ( pdTRUE == xReturn )
                {
                    LOG_BLE("give count sem ok\n");
                    LOG_BLE("current left count sem:%d\n",uxSemaphoreGetCount(CountSem_Handle));
                } else
                {
                    LOG_BLE("give count sem error\n");
                }
                button1_sta = 1;
            }
        } else
        {
            button1_sta = 0;
        }
        vTaskDelay(20);
    }
}

4、实验说明和现象

①通过give任务,每按下一次按键将释放一次信号量且显示当前剩余有效信号,当有效信号量为5时释放失败。
在这里插入图片描述

②通过take任务,每按下一次按键将获取一次信号量且显示当前剩余有效信号,当有效信号量为0时获取失败。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值