#include <Arduino.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
// Define pins
#define TASK1_PIN 19
#define TASK2_PIN 18
#define TASK3_PIN 5
int sharedVar = 0; // Variabel global yang digunakan bersama
void unsafeIncrement() {
for (int i = 0; i < 100; i++) {
sharedVar++; // Ini tidak aman jika dipanggil dari beberapa tugas
}
}
SemaphoreHandle_t xSemaphore;
void Task1(void *pvParameters) {
while (1) {
// Wait until semaphore is available
vTaskDelay(1400 / portTICK_PERIOD_MS);
if (xSemaphoreTake(xSemaphore, portMAX_DELAY)) {
Serial.print(millis());
Serial.print(" ");
Serial.println("Task1 acquired semaphore");
// Perform some task
unsafeIncrement();
digitalWrite(TASK1_PIN, HIGH);
digitalWrite(TASK2_PIN, LOW);
digitalWrite(TASK3_PIN, LOW);
vTaskDelay(1400 / portTICK_PERIOD_MS);
// Release semaphore
xSemaphoreGive(xSemaphore);
Serial.print(millis());
Serial.print(" ");
Serial.println("Task1 released semaphore");
}
}
}
void Task2(void *pvParameters) {
while (1) {
Serial.print(millis());
Serial.print(" ");
Serial.println("Task2 perform delay task");
// Perform some task
digitalWrite(TASK1_PIN, LOW);
digitalWrite(TASK2_PIN, HIGH);
digitalWrite(TASK3_PIN, LOW);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void Task3(void *pvParameters) {
while (1) {
// Wait until semaphore is available
if (xSemaphoreTake(xSemaphore, portMAX_DELAY)) {
Serial.print(millis());
Serial.print(" ");
Serial.println("Task3 acquired semaphore");
// Perform some task
unsafeIncrement();
digitalWrite(TASK1_PIN, LOW);
digitalWrite(TASK2_PIN, LOW);
digitalWrite(TASK3_PIN, HIGH);
vTaskDelay(3300 / portTICK_PERIOD_MS); // Delay selama 500 ms
// Release semaphore
xSemaphoreGive(xSemaphore);
Serial.print(millis());
Serial.print(" ");
Serial.println("Task3 released semaphore");
}
vTaskDelay(3300 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
// Initialize LED pins
pinMode(TASK1_PIN, OUTPUT);
pinMode(TASK2_PIN, OUTPUT);
pinMode(TASK3_PIN, OUTPUT);
// Create the semaphore
xSemaphore = xSemaphoreCreateMutex();
// Initially, give the semaphore so tasks can take it
xSemaphoreGive(xSemaphore);
// Create the tasks
xTaskCreate(Task1, "Task1", 1000, NULL, 3, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 2, NULL);
xTaskCreate(Task3, "Task3", 1000, NULL, 1, NULL);
}
void loop() {
// Main loop does nothing, tasks handle everything
delay(10);
}