Tous les projets

Health Hub : migration d'un moniteur de santé STM32 vers FreeRTOS

Moniteur multi-capteurs sur STM32F411 (fréquence cardiaque, température, mouvement). J'ai migré le code bare-metal vers FreeRTOS, avec six tâches priorisées, des files de messages et un mutex sur le bus I²C.

Contexte

Projet de Master 1 à l'UBS Lorient. Le point de départ est un projet STM32CubeIDE fourni par l'encadrant : un code bare-metal qui lit plusieurs capteurs de santé, affiche les valeurs sur un écran OLED et les envoie en UART vers la plateforme Thingsboard, via un script Python.

Mon travail a consisté à migrer ce code vers FreeRTOS : découper le programme en tâches, choisir leurs priorités et leurs périodes, et organiser l'échange de données entre elles sans conflit sur le bus partagé.

Le matériel

RôleComposant
MicrocontrôleurSTM32F411RE (carte Nucleo)
MouvementMPU6050, accéléromètre et gyroscope 6 axes
Fréquence cardiaqueMAX30105, capteur optique
Température corporelleMAX30205 (Fever click)
AffichageÉcran OLED 1,12 pouce

Les trois capteurs sont sur le même bus I²C. C'est la contrainte qui structure toute l'architecture.

Architecture FreeRTOS

Chronogramme des six tâches FreeRTOS, périodes tirées du code, durées illustratives
Chronogramme des six tâches FreeRTOS, périodes tirées du code, durées illustratives

Le programme est découpé en six tâches, reliées par cinq files de messages. Chaque étape a sa propre tâche : acquisition, calcul, affichage.

MotionTask ──qAttitudeAlgo──▶ AttitudeTask ──qAttitudeDisplay──┐
HeartRateTask ──qBPMalgo──▶ processTaskBPM ──qBPMDisplay───────┼──▶ DisplayTask ──▶ OLED
TempTask ──qTempData───────────────────────────────────────────┘

MotionTask, HeartRateTask, TempTask : accès I²C protégés par mutexI2C
TâcheRôlePrioritéPériode
MotionTaskLit accéléromètre et gyroscopeHaute50 ms
HeartRateTaskÉchantillonne le signal infrarougeAu-dessus de normale10 ms
AttitudeTaskCalcule les normes d'accélération et de rotationAu-dessus de normale100 ms
processTaskBPMCalcule le rythme cardiaqueNormaleà chaque échantillon
TempTaskLit la températureEn dessous de normale1 s
DisplayTaskMet à jour l'écranBasse100 ms

L'affichage a la priorité la plus basse : s'il prend du retard, aucune mesure n'est perdue. À l'inverse, l'échantillonnage cardiaque tourne toutes les 10 ms, parce que le calcul du rythme a besoin d'un signal régulier.

Partager le bus I²C

Trois tâches lisent des capteurs sur le même bus. Sans protection, une tâche plus prioritaire peut interrompre une transaction I²C en cours et la corrompre. Chaque lecture est donc encadrée par un mutex :

osMutexAcquire(mutexI2CHandle, osWaitForever);
irSample = acquireHeartSampleC();
osMutexRelease(mutexI2CHandle);
osMessageQueuePut(qBPMalgoHandle, &irSample, 0, 10);
c

Dimensionner les files

La file entre l'échantillonnage cardiaque et le calcul du rythme peut contenir 10 échantillons : le calcul peut prendre un peu de retard sans en perdre. Les autres files ne contiennent qu'un seul élément, car l'écran n'a besoin que de la dernière valeur. La tâche d'affichage lit ses files sans attendre, et garde la valeur précédente si rien de nouveau n'est arrivé.

Analyse des performances

Avec les outils de STM32CubeIDE, j'ai analysé l'empreinte mémoire, la charge CPU et le respect des contraintes de temps réel de la version FreeRTOS.

Stack

CoucheTechnologie
CibleSTM32F411RE
Noyau temps réelFreeRTOS, API CMSIS-RTOS v2
LangagesC, C++ (bibliothèques capteurs via un wrapper Arduino)
BusI²C, UART
OutilsSTM32CubeIDE, STM32CubeMX (.ioc)

Projets proches

Systèmes embarquésCybersécurité

Analyse et injection sur bus CAN automobile

Reverse engineering des trames CAN d'une maquette véhicule, cartographie des bus, décodage des signaux moteur/éclairage/confort, base DBC et DLL d'injection en C simulant un système ADAS.

2026Bus CANReverse EngineeringAutomotiveMuxTrace

Systèmes embarqués

Distribution Linux embarquée avec Yocto pour une box domotique

Construction d'une distribution Linux sur mesure avec Yocto (Poky) pour la carte STM32MP135F-DK, avec une layer dédiée, une recette image systemd, un SDK et une application C qui lit un capteur I²C.

2026YoctoPokyBitBakeLinux embarqué

CybersécuritéSystèmes embarqués

Attaques sur le protocole Zigbee

Étude offensive de Zigbee sur un banc isolé : écoute passive, puis attaques actives (saturation, usurpation du coordinateur, rejeu, éjection) depuis un dongle nRF52840 piloté par WHAD, sur un banc de test reproductible.

2026ZigbeeIEEE 802.15.4WHADnRF52840