[FreeRTOS] vTaskDelay : Task Blocking API
# vTaskDelay()를 호출하는 Task를 고정된 수의 Tick 인터럽트에 대해 'Blocked' 상태로 설정 함.
# 0 Tick의 지연 기간을 지정하면 Task가 'Blocked' 상태가 되지 않지만 Task가 우선 순위를 공유하는 'Ready' 상태 로 전환 된다. 즉, vTaskDelay( 0 ) 를 호출하는 것은 taskYIELD( ) 을 호출하는 것과 동일 하다.

# Example : 1초 마다 변수값을 1씩 늘려가며 로그를 찍음.
# vTaskDelay 함수의 인자는 Tick 값을 받아야 하므로, ms 단위를 Tick 단위로 변경하기 위해 다음 매크로를 사용한다.
1000ms (1초) : pdMS_TO_TICKS(1000)
#include "main.h"
#include "cmsis_os.h"
#include <stdio.h>
#define TASK_MAIN_PRIO 20
#define TASK_1_PRIO 10
static void TaskMain(void const *pvParameters);
static void Task1(void const *pvParameters);
TaskHandle_t xHandleMain, xHandle1;
void MAIN_THREAD(void)
{
xTaskCreate((TaskFunction_t)TaskMain, "TaskMain" , 256, NULL, TASK_MAIN_PRIO, &xHandleMain);
}
static void TaskMain(void const *pvParameters)
{
const char *pcTaskName = "TaskMain";
UNUSED(pvParameters);
printf("[%s] is running\n", pcTaskName);
xTaskCreate((TaskFunction_t)Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, TASK_1_PRIO, &xHandle1);
vTaskDelete(xHandleMain);
}
static void Task1(void const *pvParameters)
{
const char *pcTaskName = "Task1";
unsigned int i = 0U;
UNUSED(pvParameters);
printf("[%s] is running\n", pcTaskName);
while(1)
{
vTaskDelay(pdMS_TO_TICKS(1000));
i++;
printf("%u\n", i);
}
}
