FreeRTOS 任务通知-3. 任务通知模拟信号量实验

时间:2024-03-26 20:30:56

实验目的:学习使用 FreeRTOS 中的任务通知功能模拟二值信号量和计数型信号量
实验设计:将设计三个任务:start_task、task1、task2

三个任务的功能如下:
start_task:用来创建task1和task2任务
task1:用于按键扫描,当检测到按键KEY0被按下时,将发送任务通知
task2:用于接收任务通知,并打印相关提示信息

3.1 模拟二值信号量

任务函数实现

#include "event_groups.h"

/* 任务一,发送任务通知值 */
void task1( void * pvParameters )
{
    uint8_t key = 0;
    
    while(1) 
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            printf("任务通知模拟二值信号量释放!\r\n");
            xTaskNotifyGive(task2_handler);						/* 发送任务通知(通知值++) */
        }
        vTaskDelay(10);
    }
}

/* 任务二,接收任务通知值 */
void task2( void * pvParameters )
{
    uint32_t rev = 0;
    while(1)
    {
        rev = ulTaskNotifyTake(pdTRUE , portMAX_DELAY);			/* 接收任务通知(通知值清零) */
        if(rev != 0)
        {
            printf("接收任务通知成功,模拟获取二值信号量!\r\n");
        }
    }
}

3.2 模拟计数型信号量

任务函数实现

#include "event_groups.h"

/* 任务一,发送任务通知值 */
void task1( void * pvParameters )
{
    uint8_t key = 0;
    
    while(1) 
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            printf("任务通知模拟计数型信号量释放!\r\n");
            xTaskNotifyGive(task2_handler);						/* 发送任务通知(通知值++) */
        }
        vTaskDelay(10);
    }
}

/* 任务二,接收任务通知值 */
void task2( void * pvParameters )
{
    uint32_t rev = 0;
    while(1)
    {
        rev = ulTaskNotifyTake(pdFALSE , portMAX_DELAY);		/* 接收任务通知(通知值--) */
        if(rev != 0)
        {
            printf("rev:%d\r\n",rev);
        }
        vTaskDelay(1000);
    }
}