Vous êtes sur la page 1sur 7

freeRTOS

ELAMARI MOUNA

2eme année master de


recherche électronique
embarquée
2
FreeRTOS
I. Système d’exploitation temps réel

Le système d'exploitation présent à l'intérieur des périphériques embarqués est appelé un


RTOS (Real-Time Operating System) . Dans les appareils embarqués, les tâches en temps
réel sont essentielles où la synchronisation joue un rôle très important. Les tâches en
temps réel sont déterministes dans le temps, ce qui signifie que le temps de réponse à
tout événement est toujours constant afin qu'il puisse être garanti qu'un événement
particulier se produira à un moment donné. RTOS est conçu pour exécuter des applications
avec un timing très précis et un haut degré de fiabilité. RTOS aide également au
multitâche avec un seul cœur.

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

2. Contrôle des tâches


 vTaskDelay

vTaskDelay Spécifie le nombre de top d'horloge (Ticks) de l'ordonnanceur pendant lequel


la tâche reste bloquer, ce nombre est passé comme paramètre. Si on veut comptabiliser le
temps de blocage en ms, il suffit de diviser le nombre de Ticks par la constance
portTICK_RATE_MS. Syntaxe : void vTaskDelay(const TickType_t xTicksToDelay );

Code
#include <Arduino_FreeRTOS.h >

#include<task.h>

Void Task1(void*pvparameters) ;

Void Task2(void*pvparameters) ;

Float VLDR ; //variables de valeur de photoresistance

Float Vtemp ;//variables de valeur de capteur de temperature

Int entree photoresistance=A1 ;//photoresistance sur A1

Int entreecapTem=A2 ;//capteur de temperature sur A2


Int led_nuit ;
5
Int led_temperature ;

Void setup()

Serial begin(9600) ;//monoteur serie

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) ;

xTaskcreat(Task2,Task2, 128 ,NULL, 1 ,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) ;

If((Vtemp)==10)//si la temperature egamle 10 degre La LED clignote sur la broche


numerique avec frequence 200ms

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

Vous aimerez peut-être aussi