#include <M5Unified.h> xSemaphoreHandle mutex; //ミューテックス(排他制御用) void withArgTask(void *pvParam) { int num = *(int*) pvParam; // 引数は、グローバル変数のアドレスをポインタで渡す BaseType_t mStatus; char* tsknm = pcTaskGetTaskName(NULL); //自タスク名を取得するならNULL、他タスク名を取得するならタスクハンドルを引数に指定する。 while (1) { mStatus = xSemaphoreTake(mutex, 500); // ミューテックスを取得 if (mStatus == pdPASS) { Serial.println("----"); Serial.printf("[%s] ", tsknm ); M5.Display.println("----"); M5.Display.printf("[%s] ", tsknm ); delay(500); for (int i = 1; i < 6; i++) { Serial.printf("%d ", i * num); M5.Display.printf("%d ", i * num); delay(300); } delay(300); Serial.printf("done \n"); M5.Display.printf("done \n"); delay(300); xSemaphoreGive(mutex); // ミューテックスを解放 vTaskDelete(NULL); // 自タスクを削除する } else { delay(random(10,100)); //ミューテックスがとれなかったらランダムに待つ } } } int arg[] = {2, 3, 5, 7, 11} ; char tskname[5]; void setup() { auto cfg = M5.config(); cfg.serial_baudrate = 115200; M5.begin(cfg); M5.Display.setRotation(3); //横向き M5.Display.setFont(&fonts::lgfxJapanGothic_16); M5.Display.println("シリアルにも出力します"); M5.Display.setTextScroll(true); mutex = xSemaphoreCreateMutex(); // ミューテックス作成 } void loop() { Serial.println("-------"); if (mutex != NULL) { // ミューテックスの作成に成功していたら for (int i = 0; i < 5; i++) { sprintf(tskname, "x%d", arg[i]); xTaskCreatePinnedToCore(withArgTask, tskname, 4096, &arg[i], 1, NULL , 1); } } M5.delay(20 * 1000); // 次のタスクの仕込みまで、20秒待つ }