[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);

	}
}


이 블로그의 인기 게시물