다음은 2개의 Task를 이용한 예제이다.
--- Contents ---
1. [ESP32] VS Code 개발환경 구성 : https://makeutil.tistory.com/303
2. [ESP32] 첫 프로젝트 생성하기 : https://makeutil.tistory.com/304
3. [ESP32] 멀티 테스크 예제 (2 Task) : 현재글
ESP32가 사용하는 FreeRTOS는 멀티태스크를 지원하는 운영체제이다. 따라서 둘 이상의 태스크를 실행할 수 있다.
펌웨어 개발할 때 Task라는 이야기를 자주 듣게 되는데, 보통 MCU 펌웨어 또는 RTOS에서 지정한 기능을 실행해야 되는 하나의 단위라고 해두겠다. 일반적으로 프로그래밍을 하던 독자들은 프로세스라 불리는 역할과 비슷하다고 볼수 있다. 물론, 더 자세히 보게되면 프로세스는 여러 Task 단위의 업무처리를 한번에 묶어 둘수 있다는 점이 다소 틀린점으로 볼 수도 있다. 어쨋든 내부적으로 이런저런 차이는 있지만 유사하다 정도로 지금은 정리해 두자.
이건 업계에서 주로 이야기 하는 내용인데... 나이 많으신분들 그리고 그분들과 같이 일하는 대부분의 펌웨어 개발자들인 Task를 타스크로 읽는다. 예전부터 궁금했는데.. 지금까지도 그러려니 하고 있다.
소스준비는 앞서 첫 프로젝트 구성을 참고로 하자.
1. 소스코드
아래의 소스코드는 2개의 태스크인 task1과 2를 생성한다. 그리고 카운트를 출력한다. 그리고 각각 제한 카운트에되면 0으로 초기화 하도록 하였다. Task1은 1초간 지연되고, Task2는 2초간 지연된다.
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void task1(void *pvParameters)
{
int count=0;
while (1)
{
count++;
printf("[%d] Task1\n", count);
vTaskDelay(1000 / portTICK_PERIOD_MS);
if(count==100000)
count=0;
}
}
void task2(void *pvParameters)
{
int count=0;
while (1)
{
count++;
printf("[%d] Task2\n", count);
vTaskDelay(2000 / portTICK_PERIOD_MS);
if(count==50000)
count=0;
}
}
int app_main(void)
{
xTaskCreate(task1, "Task1", 2048, NULL, 1, NULL);
xTaskCreate(task2, "Task2", 2048, NULL, 1, NULL);
return 0;
}
2. 빌드 및 실행 결과
실행되면 당연히 터미널 화면에 Task가 출력이 되는데, Task1이 두번 실행되고 Task2가 한번 실행되는 것을 확ㅇ니할 수 있다. 앞의 카운트를 이용해서 실행횟수를 비교해볼 수 있다.

3. 추가설명
3.1. vTaskDelay
vTaskDelay(1000 / portTICK_PERIOD_MS);
portTICK_PERIOD_MS는 1틱의 시간을 미리초로 나타내는 매크로이며, 특정 시스템에 맞춘 포팅시 다른값으로 설정될 수 있지만 통싱 1ms 에 해당된다. 따라서, 1000/1(ms)이므로 1000ms = 1Sec가 된다.
3.2. xTaskCreate
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth,
void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );
xTaskCreate는 FreeRTOS에서 Task를 생성하는 함수로 독립적으로 실행되며 OS의 Task 스케쥴러에 의해서 관리된다.
- pvTaskCode : 실행할 태스크의 함수포인터
- pcName : 테스크 이름
- usStackDepth : 태스크가 사용할 스택의 크기
- pvParameters : 태스크가 실행할 함수로 전달할 파라미터
- uxPriority : 태스크의 우선순위 (0~31, 클수록 우선순위가 높음)
- pxCreatedTask : 태스크의 핸들을 저장하는 변수, Task의 관리 및 삭제등에 사용 (선택적 사용)
간단하게 Task를 알아보았다. 이렇게 여러 Task를 나누고 적당한 방식으로 구분하면, 기능별로 Task를 구분하여 필요에 의해서 호출해서 사용할 수 있는 펌웨어를 작성할 수 있다. 특히 웹 서비스를 제공하고, 해당의 설정에 따라서 여러 동작을 달리한다거나 하는 기능을 할 때 여러 태스크를 이용해서 구현할 수 있을 것 같다. 이는 차차 해보도록 하자.
최근댓글