#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
// Sémaphores
SemaphoreHandle_t xSemaphoreLED1;
SemaphoreHandle_t xSemaphoreLED2;
SemaphoreHandle_t xSemaphoreLED3;
// ================= LED1 =================
void vTaskLED1(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xSemaphoreLED1, portMAX_DELAY) == pdTRUE) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(500));
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
xSemaphoreGive(xSemaphoreLED2);
}
}
}
// ================= LED2 =================
void vTaskLED2(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xSemaphoreLED2, portMAX_DELAY) == pdTRUE) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(500));
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
xSemaphoreGive(xSemaphoreLED3);
}
}
}
// ================= LED3 =================
void vTaskLED3(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xSemaphoreLED3, portMAX_DELAY) == pdTRUE) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(300));
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
xSemaphoreGive(xSemaphoreLED1);
}
}
}
// ================= GPIO INIT =================
void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// LED1 -> PA5
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// LED2 -> PA6
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// LED3 -> PA0
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// ================= MAIN =================
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// Création des sémaphores
xSemaphoreLED1 = xSemaphoreCreateBinary();
xSemaphoreLED2 = xSemaphoreCreateBinary();
xSemaphoreLED3 = xSemaphoreCreateBinary();
// Démarrage de la chaîne
xSemaphoreGive(xSemaphoreLED1);
// Création des tâches
xTaskCreate(vTaskLED1, "LED1", 128, NULL, 1, NULL);
xTaskCreate(vTaskLED2, "LED2", 128, NULL, 2, NULL);
xTaskCreate(vTaskLED3, "LED3", 128, NULL, 1, NULL);
// Lancement scheduler
vTaskStartScheduler();
while (1);
}
// Obligatoire pour Wokwi
void loop() {}