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秒待つ
}