/*********************************************************
*Copyright (C), 2018, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名:  main.c
*作  者:  Jiayc
*版  本:  V1.00
*日  期:  2020/8/24
*描  述:  FreeRTOS_Mutexes演示程序
          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"

SemaphoreHandle_t Semaphore = NULL;

static void vLED_Task(void *pvParameters);
static void vSemaphoreTake_Task(void *pvParameters);
static void vSemaphoreGive_Task(void *pvParameters);


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

    Semaphore = xSemaphoreCreateBinary();       //创建二值信号量

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

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

    xTaskCreate(vSemaphoreTake_Task,
                "SemaphoreTake",
                128,
                NULL,
                3,
                NULL);
    xTaskCreate(vSemaphoreGive_Task,
                "SemaphoreGive",
                128,
                NULL,
                4,
                NULL);

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

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

    for (;;)
    {

    }
}

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

static void vSemaphoreTake_Task(void *pvParameters)
{
    for (;;)
    {
        if (xSemaphoreTake(Semaphore, portMAX_DELAY) == pdTRUE)     //接收二值信号
        {
            UART_SendString("SemaphoreTake_Task takes semaphore.\r\n");
            UART_SendString("\r\n");
        }
    }
}

static void vSemaphoreGive_Task(void *pvParameters)
{
    for (;;)
    {
        xSemaphoreGive(Semaphore);                                  //发送二值信号
        UART_SendString("SemaphoreGive_Task gives semaphore.\r\n");
        vTaskDelay(1000);
    }
}

