iFLine-코딩으로 뽀샤버리기

3강. Arduino 기본 원리 ( Setup, loop )

Posted by INDIFROG on 2020-06-25
Words 293 and Reading Time 1 Minutes
Viewed Times

3강. Arduino 기본 원리 ( Setup, loop )

Hello

setup과 loop 함수

아두이노는 C/C++ 언어의 main()함수가 아닌 setup과 loop 함수로만 실행이 되는지 알아보도록 하겠습니다.

iFZero보드는 ESP32 MCU 중에서 4M Byte 플래쉬 메모리 등이 모듈화된 ESP32 PICO V3 이라고 하는 가장 최신의 MCU을 사용하고 있습니다.
이전 ESP32 PICO D4 MCU의 일부 보안 이슈를 해결한 버전​입니다

ESP32는 내부에 Core 2개를 가지고 있으며 Core0은 통신 코어라고 불리기도 하고 WiFi나 BT관련 통신 프로토콜을 제어하는 역할을 합니다.
반면에 Core1은 애플리케이션 코어라고 하며 유저 코드를 실행하는 역할을 담당합니다.

따라서 기본적으로 개발자가 코딩한 프로그램은 Core1 에서 실행이 됩니다.
기본적으로 ESP32는 FreeRTOS로 동작하는 MCU입니다. 따라서 내부 스케줄러 덕분에 Task를 병렬로 실행 즉, 멀티 태스킹으로 동작합니다.

스케줄러가 Task들을 빠르게 전환하기 때문에 여러 응용 프로그램들이 동시에 실행되는 것처럼 보이는 것입니다.
하기 코드 내용은 ESP32의 내부적으로 처리되는 app_main.cpp 코드입니다.

즉, MCU가 최초로 실행하는 main() 함수코드입니다.

내부적으로 xTaskCreateUniversal 함수 호출

코드 내용을 분석하면, 아두이노로 동작하기 위해 initArduino 초기화 함수를 호출하고 나서 xTaskCreateUniversal 태스크 생성함수를 호출합니다.

실제로 ESP32 xTaskCreateUniversal 함수 내부에서는 CPU Core1에서 실행되도록 지정하기 위해 xTaskCreate 함수가 아닌 xTaskCreatePinnedToCore 함수를 호출합니다.

xTaskCreate 함수를 호출하게 되면 무조건 Core0에서 태스크가 실행이 되기 때문이죠.

이로 인해 loopTask 가 실행이 되면서 setup 함수가 한번 호출이 되고 나서 for루프 내에서 loop함수가 무한히 돌게 되는 구조입니다.
별거 아닐거 같지만 아두이노 구조를 한눈에 파악할 수 있는 아주 귀중한 코드로 아두이노를 학습하는 매우 중요한 시작점입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"
#include "Arduino.h"

TaskHandle_t loopTaskHandle = NULL;

#if CONFIG_AUTOSTART_ARDUINO

bool loopTaskWDTEnabled;

void loopTask(void *pvParameters)
{
setup();
for(;;) {
if(loopTaskWDTEnabled){
esp_task_wdt_reset();
}
loop();
}
}

extern "C" void app_main()
{
loopTaskWDTEnabled = false;
initArduino();
xTaskCreateUniversal(loopTask, "loopTask", 8192,
NULL, 1, &loopTaskHandle, CONFIG_ARDUINO_RUNNING_CORE);
}

#endif