SemaphoreHandle_t mutex;
TaskHandle_t task1Handle, task2Handle;
void task1(void *parameter) {
while (1) {
// Menetapkan prioritas tinggi saat mengambil mutex
vTaskPrioritySet(NULL, tskIDLE_PRIORITY + 2);
if (xSemaphoreTakeRecursive(mutex, portMAX_DELAY) == pdPASS) {
// Kembalikan prioritas ke aslinya saat selesai
vTaskPrioritySet(NULL, tskIDLE_PRIORITY);
Serial.println("Task 1 mengakses resource dari mutex");
vTaskDelay(200 / portTICK_PERIOD_MS); // Simulasi proses
xSemaphoreGiveRecursive(mutex);
}else {
Serial.println("Task 1 Timeout saat mengakses mutex");
}
}
}
void task2(void *parameter) {
while (1) {
// Menetapkan prioritas tinggi saat mengambil mutex
vTaskPrioritySet(NULL, tskIDLE_PRIORITY + 2);
if (xSemaphoreTakeRecursive(mutex, portMAX_DELAY) == pdPASS) {
// Kembalikan prioritas ke aslinya saat selesai
vTaskPrioritySet(NULL, tskIDLE_PRIORITY);
Serial.println("Task 2 mengakses resource dari mutex");
vTaskDelay(200 / portTICK_PERIOD_MS); // Simulasi proses
xSemaphoreGiveRecursive(mutex);
}else {
Serial.println("Task 2 Timeout saat mengakses mutex");
}
}
}
void setup() {
Serial.begin(9600);
mutex = xSemaphoreCreateRecursiveMutex();
// Membuat tugas dengan prioritas yang lebih rendah
xTaskCreate(task1, "Task 1", 10000, NULL, 1, &task1Handle);
xTaskCreate(task2, "Task 2", 10000, NULL, 1, &task2Handle);
// Menetapkan prioritas awal
vTaskPrioritySet(task1Handle, tskIDLE_PRIORITY);
vTaskPrioritySet(task2Handle, tskIDLE_PRIORITY);
// Menjalankan tugas
vTaskResume(task1Handle);
vTaskResume(task2Handle);
}
void loop() {
}