2018년 4월 5일 목요일

ESP32에서 FreeRTOS 사용 - TASK 만들기

여기서는 ESP32에서 FreeRTOS를 사용하는 방법을 설명하겠다.

아두이노 ESP32는 기본적으로 FreeRTOS상에서 만들어졌지만 한개의 태스크만 사용한다면 FreeRTOS의 훌륭한 기능들을 활용하지 못하고 낭비하는 것이다.

예제 코드에서는 어플리케이션에 기본 아두이노 태스크 외에 하나의 태스크를 더 추가해 준다. 즉 어플리케이션은 2개의 태스크를 가지게 된다. 아두이노 태스크는 시리얼 포트로 'this is Arduino task'란 글자를 출력하고 두번째 태스크는 'this is additional task'라는 글자를 출력한다.

태스크를 만들기 위해 xTaskCreate() API 함수를 사용했다. FreeRTOS API에 대해서는 FreeRTOS ebook을 참고해라. xTaskCreate() 함수에 대한 설명은 FreeRTOS ebook의 48페이지에 있다.

ESP32 아두이노가 FreeRTOS 기반으로 만들어 졌기 때문에 따로 FreeRTOS 헤더파일을 include 하지 않아도 된다.

void setup() {
  Serial.begin(115200);
  // 새 태스크 생성
  xTaskCreate(
      additionalTask,           // Task 함수 이름
      "additional Task",        // Task 이름
      10000,                    // Task 스택 크기
      NULL,                     // Task 파라미터
      1,                        // Task 우선순위
      NULL);                    // Task handle
}

// loop() 함수는 ESP32 loopTask에 의해 무한히 호출됨

void loop() {
  Serial.println("this is Arduino Task");
  delay(1000);
}


// additionalTask 가 생성될 때 이 함수가 호출됨
void additionalTask( void * parameter )
{

  for(;;){
    Serial.println("this is additional Task");
    delay(1000);
  }
  // 종료되면 Task 삭제
  // 하지만 위의 무한루프 때문에 호출될 수 없음

  vTaskDelete( NULL );
}


보드에 업로드 해 실행한 결과는 다음과 같다.





아두이노에서 ESP32 개발환경 설정하기 (Setup ESP32 development environment in Arduino IDE)



ESP32에서 소프트웨어를 개발하는 방법으로는 ESP32 IDF를 사용하는 방법과 arduino ide를 사용하는 방법이 있다. 여기서는 우선 아두이노 환경을 사용할 수 있도록 설정하는 방법을 설명하겠다.

일단 아두이노는 설치되어 있다고 가정한다.

위의 ESP32 보드는 USB-to-Serial bridge로 Silicon Labs의 CP210x를 사용하고 있다. 그러므로 우선 CP210x 디바이스 드라이버를 설치해야 한다. 링크를 클릭하면 제조사의 다운로드 페이지로 연결되므로 자신이 사용하는 플랫폼에 맞는 드라이버를 다운받아 설치해 주면 된다.

그 다음 아두이노에 개발툴을 설치해야 하는데 다른 칩들처럼 Board Manager에서는 ESP32를 찾을 수 없고 직접 설치를 해야 한다.

여기서는 Mac OS 기준으로 설명하겠다.

터미널 창을 열어 다음의 명령들을 차례로 입력해 준다.

$ mkdir -p ~/Documents/Arduino/hardware/espressif
$ cd ~/Documents/Arduino/hardware/espressif
$ git clone https://github.com/espressif/arduino-esp32.git esp32$ cd esp32
$ git submodule update --init --recursive

$ cd tools
$ python get.py


위의 명령들이 문제 없이 실행되면 필요한 툴이 설치 완료 된 것이다.

이제 아두이노를 시작(만일 이미 시작되어 있다면 종료 했다가 다시 재시작)하면 Tools->Board 메뉴에서 'ESP32 Arduino'라는 항목이 보이고 다양한 종류의 보드들이 추가되어 있는걸 확인할 수 있을 것이다.









위의 사진에 있는 보드의 경우 WEMOS LOLIN32를 선택해주면 된다.



포트의 경우 맥애서는 '/dev/cu_SLAB_USBtoUART' 를 선택해주면 된다.

보드의 핀 배열은 다음과 같다.


이제 다른 보드와 동일하게 프로그램을 작성하고 Upload 버튼을 누르면 프로그램 업로드 후 실행되게 된다.

정상적으로 업로드가 완료 되었다면 아래 메시지 창에 이런식으로 표시될 것이다.


간단하게 WiFi 로고를 OLED화면에 출력하게 한 코드를 실행한 결과이다.


실제 보드를 보면 알겠지만 보드 폭이 애매해서 브레드보드에 꼽으면 선을 연결할 수가 없다. 그래서 편하게 여러가지를 실험하기 위해 만능기판에 핀헤더를 땜질해서 브레드보드로 점퍼선을 쉽게 연결할 수 있게 해 주었다.