/* ================================================
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;
Serial.println("================================");
Serial.print("[");
Serial.print(now);
Serial.println(" ms] Scheduler Running");
Serial.print("Task1 (500ms) cycles: ");
Serial.println(task1_count);
Serial.print("Task2 (1000ms) cycles: ");
Serial.println(task2_count);
Serial.print("Task3 (2000ms) cycles: ");
Serial.println(task3_count);
Serial.flush();
}
}
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
}