[M5Stack] 멀티스레드에서 병렬 처리 수행

1. 소개



M5Stack의 MPU ESP32는 병렬 처리를 수행하기 위해 멀티 스레드라는 메커니즘을 제공합니다.
자신의 공부용을 위해, M5Stack의 Example의 코드를, 그 내용을 씹어, 정리해 갑니다.

2. 프로그램의 구조



2.1. Arduino 프로그램의 기본 구조



Arduino의 프로그램은 void setup()과 void main()의 두 가지 함수에 의한 프로그램 구조입니다.
우선 void setup()로, 초기화 처리를 실시합니다. 예를 들어, 변수, 정수의 선언, 통신 부분의 설정등이 이 void setup() 함수에 의해 행해집니다.
그리고, 실행하고 싶은 메인의 태스크 내용은, void loop()안에 기술합니다. 예를 들어, 압력 센서의 값을 모니터에 표시하는 작업을 생각해 봅시다. (1) 압력 센서로부터 측정 데이터를 취득한다. (2) 단위 변환 등의 데이터 처리를 행한다. (3) LCD나 Serial 모니터에 출력하는, (4) 일정한 시간 간격으로 이러한 처리를 반복하여 실행합니다. 등의 일련의 처리 부분을 이 void loop()에 써 둡니다.


2.2. 멀티 스레드 처리 프로그램의 구조



다중 스레드 프로그램은 위의 Arduino의 기본 프로그램과 구조가 약간 다릅니다.
먼저 void setup()에 xTaskCreatePinnedCore()를 사용하여 병렬 처리를 수행하려는 작업을 선언합니다. 태스크 수는 단수, 복수의 어느 쪽이라도 OK입니다만, 병렬 처리가 목적이므로, 기본적으로 복수의 태스크를 선언하게 됩니다.

그리고 void loop() 에는 멀티스레드용의 내용을 기술하지 않습니다. (멀티태스크가 아닌 태스크는 기술해도 상관없습니다.) 대신에, void task0(), void task1()와 같은 병렬 처리하는 태스크를 함수로서 기술해, 각각의 함수안에는 while 문장을 이용한 루프 구조로 합니다. 그 루프안에 병렬 처리되는 태스크의 처리 내용을 기술합니다.


멀티스레드를 이용하는 함수



멀티스레드는 xTaskCreatePinnedToCore()를 사용하며 인수 규칙은 다음과 같습니다.
ESP32의 경우 Core 수가 2이므로 인수 Core ID는 0 또는 1입니다.
xTaskCreatePinnedToCore(タスクの関数名, "タスク名", スタックメモリサイズ, NULL, タスク優先順位, タスクハンドリングポインタ, Core ID)

예를 들어 두 개의 태스크를 두 번째 코어(Core ID=1)에 멀티스레드로 병렬 처리를 하고 싶은 경우는 아래와 같은 코드가 됩니다.
xTaskCreatePinnedToCore(task0, "Task_0", 4096, NULL, 1, NULL, 1)
xTaskCreatePinnedToCore(task1, "Task_1", 4096, NULL, 2, NULL, 1)

프로그램 코드



M5Stack Example의 Multithread 예제 코드입니다.
// Copyright (c) 2020 aNoken

#include <M5Stack.h>

/* task0のループ関数 */
void task0(void* arg) {
  static int cnt = 0;
  //カウントアップしてシリアルとLCDに表示する
  while (1) {
    Serial.printf("task0 thread_cnt=%ld\n", cnt);
    M5.Lcd.printf("task0 thread_cnt=%ld\n", cnt);
    cnt++;
    vTaskDelay(1000);
  }
}

/* task1のループ関数 */
void task1(void* arg) {
  static int cnt = 0;
  //カウントアップしてシリアルとLCDに表示する
  while (1) {
    Serial.printf("task1 thread_cnt=%ld\n", cnt);
    M5.Lcd.printf("task1 thread_cnt=%ld\n", cnt);
    cnt++;
    vTaskDelay(1500);
  }
}

void setup() {
  M5.begin();                       //M5Stackを初期化
  M5.Power.begin();                 //M5Stackのバッテリ初期化
  M5.Lcd.clear(BLACK);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(0, 0);

  //task0のループ関数を起動
  xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 1);

  //task1のループ関数を起動
  xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 2, NULL, 1);
}

void loop() {  //Arduinoのメインのループ関数はここで実行
  static int cnt = 0;

  //カウントアップしてシリアルとLCDに表示する
  M5.Lcd.clear(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("Maintask thread_cnt=%ld\n", cnt);
  Serial.printf("Maintask thread_cnt=%ld\n", cnt);
  cnt++;
  vTaskDelay(1200);
}

요약



M5Stack(ESP32)의 멀티스레드로 병렬 처리를 실시하는 방법을 정리했습니다.

참고 자료


  • htps : // 그 싸움. 지 m도 f 예. 코m/
  • htps : // 기주 b. 코 m/아노켄/
  • htps : // / cs. 예 sp. f. 이 m/p 로지ぇcts/에 sp-이 df/엔/ㄴ테 st/에 sp32/아피-레페렌세/sys m/f레에 r과 s. HTML
  • 좋은 웹페이지 즐겨찾기