#include "FreeRTOS.h"
#include "task.h"
#include "stm32c0xx_hal.h"
#include "semphr.h"
SemaphoreHandle_t xSemaphoreLED1; // déclarer le premier sémaphore
SemaphoreHandle_t xSemaphoreLED2; // déclarer le deuxième sémaphore
void BlinkLED1_Task(void *pvParameters);
void BlinkLED2_Task(void *pvParameters);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
xSemaphoreLED1 = xSemaphoreCreateBinary(); // créer le premier sémaphore
xSemaphoreLED2 = xSemaphoreCreateBinary(); // créer le deuxième sémaphore
xTaskCreate(BlinkLED1_Task, "BlinkLED1", 128, NULL, 1, NULL);
xTaskCreate(BlinkLED2_Task, "BlinkLED2", 128, NULL, 2, NULL);
xSemaphoreGive(xSemaphoreLED1); // Initialisation du sémaphore de LED1
vTaskStartScheduler(); // Démarre le planificateur de tâches FreeRTOS
while (1); // Si le planificateur échoue, reste dans une boucle infinie
}
// Tâche pour faire clignoter la LED 1
void BlinkLED1_Task(void *pvParameters) {
// Boucle infinie pour maintenir la tâche en cours d'exécution
for (;;) {
// Tente de prendre le sémaphore pour accéder à la LED1. Si le sémaphore est déjà pris, la tâche attend jusqu'à ce qu'il soit libéré.
if (xSemaphoreTake(xSemaphoreLED1, portMAX_DELAY) == pdTRUE) {
// Allume la LED 1 (connectée sur GPIO_PIN_5)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
// La tâche attend pendant 1000 ms (1 seconde)
vTaskDelay(pdMS_TO_TICKS(1000));
// Éteint la LED 1
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
// Libère le sémaphore pour la LED 2, permettant à la tâche associée de s'exécuter
xSemaphoreGive(xSemaphoreLED2);
}
}
}
// Tâche pour faire clignoter la LED 2
void BlinkLED2_Task(void *pvParameters) {
// Boucle infinie pour maintenir la tâche en cours d'exécution
for (;;) {
// Tente de prendre le sémaphore pour accéder à la LED2. Si le sémaphore est déjà pris, la tâche attend jusqu'à ce qu'il soit libéré.
if (xSemaphoreTake(xSemaphoreLED2, portMAX_DELAY) == pdTRUE) {
// Allume la LED 2 (connectée sur GPIO_PIN_6)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
// La tâche attend pendant 500 ms (0.5 seconde)
vTaskDelay(pdMS_TO_TICKS(500)); // Convertit les millisecondes en ticks de l'OS FreeRTOS
// Éteint la LED 2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
// Libère le sémaphore pour la LED 1, permettant à la tâche associée de s'exécuter
xSemaphoreGive(xSemaphoreLED1);
}
}
}
void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE(); // Activer l'horloge pour le port GPIOA
GPIO_InitTypeDef GPIO_InitStruct = {0};
// Configurer la LED 1 (GPIO_PIN_5)
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Mode de sortie push-pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Pas de résistance de pull-up ou pull-down
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Vitesse faible
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Configurer la LED 2 (GPIO_PIN_6)
GPIO_InitStruct.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void loop(void) {
// Rien ici, car FreeRTOS gère les tâches
}
void SystemClock_Config(void) {
// Configuration d'horloge (ajuster selon votre MCU)
}