// pin Config
// Mendefinisikan pin GPIO yang terhubung ke LED
const int RED_LED_PIN = 13;
const int GREEN_LED_PIN = 12;
const int BLUE_LED_PIN = 14;
// Config RedTask
const uint32_t RED_TASK_STACK_SIZE = 2048;
StackType_t redTaskStack[RED_TASK_STACK_SIZE];
StaticTask_t redTaskTCB;
// Task Handles
TaskHandle_t redTaskHandle = NULL;
TaskHandle_t greenTaskHandle = NULL;
TaskHandle_t blueTaskHandle = NULL;
// RedTask Prioritas Sedang
void redTask(void *parameter) {
(void)parameter;
pinMode(RED_LED_PIN, OUTPUT);
for (;;) {
Serial.println("Red Task (Static, Prio 1): ON");
digitalWrite(RED_LED_PIN, HIGH);
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.println("Red Task (Static, Prio 1): OFF");
digitalWrite(RED_LED_PIN, LOW);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// GreenTask Prioritas Tinggi
void greenTask(void *parameter) {
(void)parameter;
pinMode(GREEN_LED_PIN, OUTPUT);
for (;;) {
Serial.println("Green Task (Dynamic, Prio 2): ON");
digitalWrite(GREEN_LED_PIN, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
Serial.println("Green Task (Dynamic, Prio 2): OFF");
digitalWrite(GREEN_LED_PIN, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
// BlueTask Prioritas Sedang
void blueTask(void *parameter) {
(void)parameter;
pinMode(BLUE_LED_PIN, OUTPUT);
for (;;) {
Serial.println("Blue Task (Dynamic, Prio 1): ON");
digitalWrite(BLUE_LED_PIN, HIGH);
vTaskDelay(2000 / portTICK_PERIOD_MS);
Serial.println("Blue Task (Dynamic, Prio 1): OFF");
digitalWrite(BLUE_LED_PIN, LOW);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
Serial.println("--- Demo Multitasking FreeRTOS dengan Prioritas ---");
// Create RedTask Static
redTaskHandle = xTaskCreateStatic(
redTask,
"Red Task",
RED_TASK_STACK_SIZE,
NULL,
tskIDLE_PRIORITY + 1,
redTaskStack,
&redTaskTCB);
if (redTaskHandle == NULL) {
Serial.println("Gagal membuat RedTask!");
while (1);
}
Serial.println("RedTask berhasil dibuat secara statis.");
// Create GreenTask
BaseType_t greenTaskStatus = xTaskCreate(
greenTask,
"Green Task",
2048,
NULL,
tskIDLE_PRIORITY + 2,
&greenTaskHandle);
if (greenTaskStatus != pdPASS) {
Serial.println("Gagal membuat GreenTask!");
while (1);
}
Serial.println("GreenTask berhasil dibuat secara dinamis.");
// Create BlueTask
BaseType_t blueTaskStatus = xTaskCreate(
blueTask,
"Blue Task",
2048,
NULL,
tskIDLE_PRIORITY + 1,
&blueTaskHandle);
if (blueTaskStatus != pdPASS) {
Serial.println("Gagal membuat BlueTask!");
while(1);
}
Serial.println("BlueTask berhasil dibuat secara dinamis.");
Serial.println("Semua task berhasil dibuat. Penjadwal (scheduler) sedang berjalan.");
}
// Loop Function
void loop() {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}