요약
ESP32를 아두이노에서 Task를 여러 개 생성하여 Multi Thread 구현하는 방법에 대해서 알아보겠습니다.
Free RTOS의 개념을 이해하기 전에 익혀두면 좋습니다.
하나의 파일로 코드를 다 처리할 경우 복잡해지고 다시 볼 때 정말 힘듭니다.
이럴 때 Task 단위로 아두이노.ino 파일을 생성하면 유지보수할 때 편하게 할 수 있습니다.
wokwi에서 Multi Thread 구현하는 방법
wokwi에서 프로젝트 설정하는 방법은 ESP32 → 장치설정 → ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi에서 확인하실 수 있습니다. (아래 링크로도 확인 가능합니다.)
wokwi에 접속해서 먼저 프로젝트를 생성합니다.
바로 SAVE 하셔서 Multi Thread 이름으로 지정해 줍니다.
Public으로 저장하시면 됩니다.(유료 결제하면 Private 할 수 있으나 그냥 Public으로 진행하는 게 좋습니다.
지난 시간에 배웠던 LED와 아날로그 리딩으로 구현
LED 세팅하는 방법은 아래의 링크를 참고하시면 됩니다.
[ESP32/센서활용] - [아두이노] ESP32 LED 제어하는 방법 (디지털 ON/OFF 방식)
아날로그 신호를 읽는 코드는 아래의 링크를 참고하시면 됩니다.
[ESP32/센서활용] - [아두이노] ESP32 아날로그 값 읽는 방법 (ADC, MilliVolts)
전에 세팅하셨던 것을 참고하여 아래 그림과 같이 wokwi에서 배선해 줍니다.
처음에 가변저항의 아날로그 값이 0이라서 LED 출력 값이 엄청 빠르게 올라갈 겁니다.
가변저항을 조금 돌려서 시간을 맞추면 LED가 blink_delay 시간에 맞게 깜빡일 겁니다.
아래의 코드를 복사 붙여 넣기 해서 실행하면 됩니다.
#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif
#define ANALOG_INPUT_PIN 34
#define LED_OUTPUT_PIN 32
// 멀티 TASK 선언
void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );
uint32_t blink_delay = 1000;
void setup() {
Serial.begin(115200);
xTaskCreatePinnedToCore(
TaskBlink
, "Task Blink"
, 2048
, NULL
, 1 // 높을수록 먼저 처리
, NULL
, ARDUINO_RUNNING_CORE
);
xTaskCreatePinnedToCore(
TaskAnalogRead
, "Analog Read"
, 2048 // Stack size
, NULL
, 2 // 높을수록 먼저 처리
, NULL
, ARDUINO_RUNNING_CORE
);
Serial.printf("Basic Multi Threading Arduino Example\n");
}
void loop(){
delay(10000);
}
void TaskBlink(void *pvParameters){
(void) pvParameters;
pinMode(LED_OUTPUT_PIN, OUTPUT);
for (;;){
digitalWrite(LED_OUTPUT_PIN, HIGH);
vTaskDelay(blink_delay);
digitalWrite(LED_OUTPUT_PIN, LOW);
vTaskDelay(blink_delay);
Serial.print("TASK_BLINK RUNNING\t delaytime :: ");
Serial.println(blink_delay);
}
}
void TaskAnalogRead(void *pvParameters){
(void) pvParameters;
for (;;){
int sensorValue = analogRead(ANALOG_INPUT_PIN);
blink_delay = sensorValue;
Serial.print("TASK_ANALOG RUNNING\t ADC :: ");
Serial.println(sensorValue);
vTaskDelay(100); // 0.1s delay
}
}
xTaskCreatePinnedToCore 함수는 FreeRTOS에서 태스크를 생성하는 함수입니다.
여기에 대한 각 매개변수를 살펴보겠습니다.
TaskBlink | 생성할 태스크의 진입점인 함수의 포인터입니다. 이 경우 TaskBlink 함수가 태스크의 진입점입니다. |
"Task Blink" | 생성될 태스크의 이름입니다. 이 이름은 디버깅 목적으로 사용됩니다. |
2048 | 태스크의 스택 크기입니다. 스택은 함수에서 사용하는 지역 변수 및 함수 호출에 필요한 정보를 저장하는 데 사용됩니다. |
NULL | 태스크에 전달되는 매개변수입니다. 이 경우에는 사용하지 않으므로 NULL로 설정됩니다. |
1 | 태스크의 우선순위입니다. FreeRTOS에서 높은 숫자가 더 높은 우선순위를 나타냅니다. |
NULL | 태스크의 핸들을 저장할 포인터입니다. 이 핸들을 사용하여 태스크를 제어할 수 있습니다. 여기서는 사용하지 않으므로 NULL로 설정됩니다. |
ARDUINO_RUNNING_CORE | 태스크가 실행될 코어를 지정합니다. ARDUINO_RUNNING_CORE 매크로는 코드 맨 위에서 정의된 것으로, FreeRTOS가 UniCore에서 실행되는지에 따라 적절한 코어를 선택합니다. UniCore에서 실행되면 0을, 그렇지 않으면 1을 선택합니다. |
처음 사용하실 때에는 파란색으로 색칠된 부분만 수정하셔도 됩니다.
나머지는 좀 더 코드 작업에 익숙해지면 다루도록 하겠습니다.
테스트 핸들을 저장할 포인터는 사용할 일이 꽤 있으므로 나중에 Free RTOS 할 때 자세히 다루도록 하겠습니다.
이제 시작을 눌러서 실행하면 됩니다.
그림과 같이 두 개의 출력을 볼 수 있습니다.
- TASK_BLINK RUNNING delaytime :: 881
- TASK_ANALOG RUNNING ADC :: 881
가변저항에서 읽은 아날로그 신호 ADC 값을 blink_delay로 지정해주고 있기 때문에 ADC 시간에 맞게 LED가 깜빡입니다.
아두이노 세팅 및 코드 작성
ESP32를 아두이노 세팅하는 방법은 ESP32 → 장치설정 → ESP32 아두이노 2 설치를 찾아가셔도 되고 아래의 링크로도 확인 가능합니다.
[ESP32/장치설정] - ESP32 아두이노 2 설치
코드는 wokwi에서 사용한 코드 그대로를 복사 붙여 넣기 해주면 됩니다.
코드를 업로드하시고 시리얼 모니터 결과를 확인하면 wokwi와 똑같이 동작합니다.
실제 보드에서도 wokwi와 동일하게 구동되는 것을 확인할 수 있습니다.
이번 시간에는 Free RTOS를 배우기 전에 Multi Thread 개념을 배워보았습니다.
우리가 현재를 살아가면서 시간을 중요하게 생각하듯 시스템에서도 마찬가지입니다.
Multi Thread 사용법을 잘 익히시고 사용하다가 Free RTOS 공부와 같이 병행해 주면 좋습니다.
오늘도 긴 글 읽어주셔서 감사합니다!
'ESP32 > 장치설정' 카테고리의 다른 글
[아두이노] ESP32 deep sleep mode 전력관리 (ext0) (0) | 2024.03.08 |
---|---|
[아두이노] ESP32 deep sleep mode 전력 관리 (Timer) (0) | 2024.03.06 |
[아두이노] ESP32 MAC, CHIP ID, 고유 식별 값 읽는 방법 (3) | 2024.03.05 |
[아두이노] ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi (2) | 2024.02.18 |
[아두이노] ESP32 PIN OUT 사용 가능한 핀 (0) | 2024.02.18 |