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 ); delay(500); for (int i = 1; i < 6; i++) { Serial.printf("%d ", i * num); delay(300); } delay(300); Serial.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() { Serial.begin(115200); 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); } } delay(20 * 1000); // 次のタスクの仕込みまで、20秒待つ }