Académique Documents
Professionnel Documents
Culture Documents
ELAMARI MOUNA
Il existe un grand nombre de RTOS, libres, open Sources et propriétaires (RTX, MicroC/OS
III, FreeRTOS, VxWorks...) possédant des jeux d'avantages et d'inconvénients différents afin
de s'adapter au très grand nombre de problématiques du marché. Nous avons de notre côté
à l'école porté notre attention sur FreeRTOS, un petit scheduler temps réel offrant un
certain nombre d'avantages. La documentation de FreeRTOS est directement accessible en
ligne depuis le site internet
II. FreeRTOS
FreeRTOS est l'un des RTOS leader sur le marché de l'embarqué. FreeRTOS est libre de
droit d'utilisation et open source (sous licence). Il est officiellement supporté par 34
architectures (TI, Microchip, Atmel, NXP, Intel ...) et 18 chaînes de compilation.
FreeRTOS, comme n'importe quel autre noyau, est un outil purement logiciel, ce n'est
qu'un système de fichiers. FreeRTOS nous propose une API de programmation pour gérer un
environnement multitâches.
1. Tâche FreeRTOS
3
Task Control Block (TCB)
Task Control Block (TCB) Le TCB est une structure de données contenant les informations
nécessaires à la gestion des tâches. Une fois la tâche est créée, FreeRTOS lui assigne un
TCB.
Ordonnancement
Ordonnancement L ’ordonnanceur de FreeRTOS est basé sur la priorité des tâches. En cas
où plusieurs tâches partagent le même niveau de priorité, c’est le round-robin qui est
utilisé
Priorité
Priorité La priorité est un nombre donné à une tâche lorsqu'elle est créée ou modifiée
manuellement à l'aide de primitive os ThreadSetPriority. Le nombre maximum de priorités
est défini par CMSIS RTOS à osPriorityRealtime.
A. Round robin
Les tâches d’égale priorité sont traitées de manière égale par l’ordonnanceur ; il choisit à
chaque quantum de temps une tâche selon l’algorithme round robin.
4
Code
#include <Arduino_FreeRTOS.h >
#include<task.h>
Void Task1(void*pvparameters) ;
Void Task2(void*pvparameters) ;
Void setup()
Led_nuit =4 :
Led_temperature=6 ;
pinMode(led_nuit,OUTPUT) ;
pinMode(led_temperature,OUTPUT) ;
digitalWrite(led_nuit,LOW) ;
digitalWrite(led_temperature,LOW) ;
xTaskcreat(Task1,Task1,128,NULL, 2 ,NULL) ;
vTaskStartScheduler() :
Void Task1(void*pvparameters)
While(1) {
VLDR=analogRead(entreePhotoResistance)*5/1023 ;
If((VLDR)<1.71)
digitalWrite(led_nuit,HIGH) ;
Else
digitalWrite(led_nuit,LOW) ;
}}
Void Task2(void*pvParameters){
6
While(1){
Vtemp=(analogRead(entreecapTemp)*5.0)/(1023*100) ;
DigitalWrite(led_temp,HIGH) ;
vTaskDelay(200/portTICK_PERIOD_MS) ;
digitalWrite(led_temp,LOW) ;
vTaskDelay(200/portTICK_PERIOD_MS) ;
Else{
digitalWrite(led_temp,LOW) ;
Void loop()
}
7