#include <Arduino.h>
#include <STM32FreeRTOS.h>
#define LED_BLINK D10
#define LED_BUTTON D11
#define LED_FIBO D12
#define BUTTON_PIN A3
volatile int fibIndex = 1;
// =====================================================
// FUNGSI FIBONACCI
// =====================================================
unsigned long fibonacci(int n) {
if (n <= 1)
return n;
unsigned long a = 0;
unsigned long b = 1;
unsigned long c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
// =====================================================
// TASK BLINK
// =====================================================
void blinkTask(void *pvParameters) {
pinMode(LED_BLINK, OUTPUT);
while (1) {
digitalWrite(LED_BLINK, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(LED_BLINK, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
// =====================================================
// TASK BUTTON
// =====================================================
void buttonTask(void *pvParameters) {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_BUTTON, OUTPUT);
while (1) {
if (digitalRead(BUTTON_PIN) == LOW) {
digitalWrite(LED_BUTTON, HIGH);
} else {
digitalWrite(LED_BUTTON, LOW);
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
// =====================================================
// TASK FIBONACCI
// =====================================================
void fibonacciTask(void *pvParameters) {
pinMode(LED_FIBO, OUTPUT);
while (1) {
digitalWrite(LED_FIBO, LOW);
unsigned long startTime = micros();
unsigned long result = fibonacci(fibIndex);
unsigned long endTime = micros();
digitalWrite(LED_FIBO, HIGH);
Serial.print("Fib(");
Serial.print(fibIndex);
Serial.print(") = ");
Serial.print(result);
Serial.print(" | Time = ");
Serial.print(endTime - startTime);
Serial.println(" us");
fibIndex++;
if (fibIndex > 45)
fibIndex = 1;
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// =====================================================
// SETUP
// =====================================================
void setup() {
Serial.begin(115200);
xTaskCreate(
blinkTask,
"Blink",
128,
NULL,
1,
NULL
);
xTaskCreate(
buttonTask,
"Button",
128,
NULL,
1,
NULL
);
xTaskCreate(
fibonacciTask,
"Fibo",
256,
NULL,
1,
NULL
);
vTaskStartScheduler();
}
void loop() {
}