/*********************************************************
*Copyright (C), 2018, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名:  main.c
*作  者:  Jiayc
*版  本:  V1.00
*日  期:  2020/8/24
*描  述:  FreeRTOS_Notify演示程序
          MCU：ES8P5088
          FreeRTOS版本：v10.2.1
          分别创建通知信号发送和接收任务，模拟二值信号量实现任务同步
          硬件管脚：LED:PA14  UART_TX:PA15 UART_RX:PA16
*备  注:  本软件仅供学习和演示使用，对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "ES8P508x.h"
#include "bsp.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"


static void vLED_Task(void *pvParameters);
static void vNotifyTake_Task(void *pvParameters);
static void vNotifyGive_Task(void *pvParameters);

TaskHandle_t NotifyTake_Handler;
TaskHandle_t NotifyGive_Handler;

int main()
{
    LED_init();
    UARTInit();

    taskENTER_CRITICAL();                   //进入临界保护

    xTaskCreate(vLED_Task,                  //创建任务
                "LED",
                128,
                NULL,
                5,
                NULL);

    xTaskCreate(vNotifyTake_Task,
                "NotifyTake",
                128,
                NULL,
                3,
                &NotifyTake_Handler);
    xTaskCreate(vNotifyGive_Task,
                "NotifyGive",
                128,
                NULL,
                4,
                &NotifyGive_Handler);

    taskEXIT_CRITICAL();                    //退出临界保护

    vTaskStartScheduler();                  //开始任务调度

    for (;;)
    {

    }
}

static void vLED_Task(void *pvParameters)
{
    for (;;)
    {
        GPIO->PADATABRR.Word = 1U << 14;
        vTaskDelay(500);
    }
}

static void vNotifyTake_Task(void *pvParameters)
{
    for (;;)
    {
        if (ulTaskNotifyTake(pdTRUE, portMAX_DELAY) == pdTRUE)  //获取通知信号
        {
            UART_SendString("NotifyTake_Task takes notify.\r\n");
            UART_SendString("\r\n");
        }
    }
}

static void vNotifyGive_Task(void *pvParameters)
{
    for (;;)
    {
        xTaskNotifyGive(NotifyTake_Handler);                    //发送通知信号
        UART_SendString("NotifyGive_Task gives notify.\r\n");
        vTaskDelay(1000);
    }
}

