#include <STM32FreeRTOS.h>
#include <Servo.h>
#define LED_PIN PA15
#define SERVO_PIN PA0
// --- DEVICE DRIVER LAYER ---
typedef struct {
int (*open)(int pin);
int (*write)(int angle);
} Servo_Driver_t;
Servo myServo;
int SERVO_open(int pin) {
myServo.attach(pin);
return 0;
}
int SERVO_write(int angle) {
if (angle < 0 || angle > 180) return -1;
myServo.write(angle);
return 0;
}
// POSIX Benzeri Sürücü Objemiz
Servo_Driver_t MyDriver = { .open = SERVO_open, .write = SERVO_write };
// --- FREERTOS ---
SemaphoreHandle_t xMutex;
void Task_Sweep(void *pvParameters) {
for (;;) {
for (int pos = 0; pos <= 180; pos += 20) {
// Resource Protection (Ortak kaynağa erişim izni)
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdPASS) {
MyDriver.write(pos);
Serial.print("Servo Acisi: "); Serial.println(pos);
xSemaphoreGive(xMutex); // İşi bitince kaynağı bırak
}
vTaskDelay(pdMS_TO_TICKS(200));
}
}
}
void Task_Monitor(void *pvParameters) {
pinMode(LED_PIN, OUTPUT);
for (;;) {
// Güvenlik ve sistemin yaşadığını gösteren sinyal
digitalWrite(LED_PIN, HIGH);
vTaskDelay(pdMS_TO_TICKS(500));
digitalWrite(LED_PIN, LOW);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void setup() {
Serial.begin(115200);
delay(1000); // Sistemin uyanması için küçük bekleme
Serial.println("Sistem Hazirlaniyor...");
xMutex = xSemaphoreCreateMutex();
MyDriver.open(SERVO_PIN);
if (xMutex != NULL) {
xTaskCreate(Task_Sweep, "Sweep", 128, NULL, 1, NULL);
xTaskCreate(Task_Monitor, "Monitor", 128, NULL, 1, NULL);
Serial.println("Tasklar Olusturuldu. Zamanlayici (Scheduler) baslatiliyor...");
}
vTaskStartScheduler();
}
void loop() {
}Loading
st-nucleo-c031c6
st-nucleo-c031c6