/* ================================================
DEMO RTOS CONCEPT - STM32 Bluepill
Tanpa library tambahan - pakai millis()
Konsep: Cooperative Multitasking
Mirip FreeRTOS tapi tanpa overhead kernel
================================================ */
// Pin definitions
#define LED_TASK1 PA0 // LED Merah - Task 1 (500ms)
#define LED_TASK2 PA1 // LED Biru - Task 2 (1000ms)
#define LED_BOARD PC13 // LED Onboard (2000ms)
// Task state variables
unsigned long task1_lastTime = 0;
unsigned long task2_lastTime = 0;
unsigned long task3_lastTime = 0;
unsigned long monitor_lastTime = 0;
bool task1_state = false;
bool task2_state = false;
bool task3_state = false;
uint32_t task1_count = 0;
uint32_t task2_count = 0;
uint32_t task3_count = 0;
void vTask1_LED() {
unsigned long now = millis();
if (now - task1_lastTime >= 500) {
task1_lastTime = now;
task1_state = !task1_state;
digitalWrite(LED_TASK1, task1_state);
task1_count++;
}
}
void vTask2_LED() {
unsigned long now = millis();
if (now - task2_lastTime >= 1000) {
task2_lastTime = now;
task2_state = !task2_state;
digitalWrite(LED_TASK2, task2_state);
task2_count++;
}
}
void vTask3_LED() {
unsigned long now = millis();
if (now - task3_lastTime >= 2000) {
task3_lastTime = now;
task3_state = !task3_state;
digitalWrite(LED_BOARD, task3_state);
task3_count++;
}
}
void vTaskMonitor() {
unsigned long now = millis();
if (now - monitor_lastTime >= 2000) {
monitor_lastTime = now;
// Mulai dari sini adalah kode yang baru (pengganti print lama)
char buffer[150];
sprintf(buffer, "================================\n[%lu ms] Scheduler Running\nTask1 (500ms) cycles: %lu\nTask2 (1000ms) cycles: %lu\nTask3 (2000ms) cycles: %lu",
now, task1_count, task2_count, task3_count);
Serial.println(buffer);
Serial.flush();
// Sampai sini
}
}
void setup() {
Serial.begin(115200);
delay(500);
pinMode(LED_TASK1, OUTPUT);
pinMode(LED_TASK2, OUTPUT);
pinMode(LED_BOARD, OUTPUT);
Serial.println("================================");
Serial.println(" DEMO RTOS CONCEPT - BLUEPILL");
Serial.println("================================");
Serial.println("Task1: LED PA0 - period 500ms");
Serial.println("Task2: LED PA1 - period 1000ms");
Serial.println("Task3: LED PC13 - period 2000ms");
Serial.println("Scheduler started!");
Serial.println("================================");
}
// loop() = RTOS SCHEDULER (Round Robin)
void loop() {
vTask1_LED(); // Task 1: cek apakah sudah 500ms
vTask2_LED(); // Task 2: cek apakah sudah 1000ms
vTask3_LED(); // Task 3: cek apakah sudah 2000ms
vTaskMonitor(); // Monitor: print status setiap 2s
}