0% ont trouvé ce document utile (0 vote)
194 vues4 pages

Résumé FREE RTOS 1

Cet exemple présente l'utilisation de FreeRTOS pour la gestion de tâches concurrentes. Il montre la création de tâches, l'utilisation de files d'attente, de mutex et de sémaphores pour la communication et la synchronisation entre tâches. Plusieurs exemples sont fournis pour illustrer ces concepts.

Transféré par

Ichrak Soumri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
194 vues4 pages

Résumé FREE RTOS 1

Cet exemple présente l'utilisation de FreeRTOS pour la gestion de tâches concurrentes. Il montre la création de tâches, l'utilisation de files d'attente, de mutex et de sémaphores pour la communication et la synchronisation entre tâches. Plusieurs exemples sont fournis pour illustrer ces concepts.

Transféré par

Ichrak Soumri
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Résumé FREE RTOS

Rappel
#define bouton_urgence GPIO_PIN_0 ;
#define bouton_marche GPIO_PIN_1 ; Definition des variable
#define bouton_montee GPIO_PIN_2 ;
Exemple 1 :créer deux taches
osThreadId blueHandle , redHandle;
void SystemClock_Config(void); Création du Handle des taches
static void MX_GPIO_Init(void);
void VLEDBLUE(void const * argument); Déclaration des fonctions des taches
void VLEDRED(void const * argument);
-----------------------------------------------------------------
xTaskCreate( VLEDBLUE, "LED BLUE",128,NULL,1,blueHandle); Création des taches dans le main
xTaskCreate( VLEDRED, "LED RED",128,NULL,1,redHandle);
-----------------------------------------------------------------
void VLEDBLUE(void const * argument)
{ for(;;)
{ HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_15);
HAL_Delay(500); }} Corps des fonctions
-----------------------------------------------------------------
void VLEDRED(void const * argument)
{ for(;;)
{ HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_14);
HAL_Delay(250); }}
Exemple 2 :Deux taches utilisent la même fonction
typedef struct Tache nécessite plusieurs variables ==> structure
{ uint16_t pin; Définition de la structure
TickType_t tick;
} toggle ;
toggle Blue, Red;
void ftoggle(void const * argument); Déclaration de la fonction des taches
-----------------------------------------------------------------
Blue.pin=GPIO_PIN_14;
Blue.tick=500; Dans le main
Red.pin=GPIO_PIN_15;
Red.tick=300;
xTaskCreate( ftoggle, "LED BLUE",128,&Blue,1,blueHandle);
xTaskCreate( ftoggle, "LED RED",128,&Red,1,redHandle); Création des taches
-----------------------------------------------------------------
void ftoggle(void const * argument)
{ toggle led; Corps de la fonction
led=*(toggle*)argument;
for(;;)
{HAL_GPIO_TogglePin(GPIOD, led.pin); Bloque la tache pendant 500ms :
vTaskDelay(led.tick/portTICK_PERIOD_MS); } vTaskDelay( 500 / portTICK_PERIOD_MS);

Exemple 3 : Communication entre deux taches


osThreadId lireHandle , ecrireHandle; Création du Handle des taches
xQueueHandle queue; Création du Handle de la queue
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void lireB(void const * argument); Déclaration des fonctions des taches
void ecrireL (void const * argument);
----------------------------------------------------------------- Main
queue =xQueueCreate( 1,sizeof (char)); //char ou bien Création de la queue
xTaskCreate( (void*)lireB, "lire",128,NULL,1,lireHandle); Création des taches
xTaskCreate((void*) ecrireL, "ecrire",128,NULL,1,ecrireHandle);
----------------------------------------------------------------- Corps des fonctions

1
void lireB(void const * argument)
{ unsigned char A;
for(;;)
{ A=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
xQueueSendToBack(queue,&A,0); } } Ecrire une valeur dans la queue
-----------------------------------------------------------------
void ecrireL(void const * argument)
{ unsigned char B;
for(;;)
{ xQueueReceive(queue,&B,0); Lire une valeur de la queue
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,B); } }
Exemple 4 : Compteur : Mutex & Semaphore
osThreadId TA1,TA2,vTcount; Création du Handle des taches
xSemaphoreHandle mutex; Création du Handle du mutex (Jeton)
xQueueHandle unite , dizaine; Création du Handle des queues
void t1_tache(void const * argument);
void t2_tache(void const * argument); Déclaration des fonctions des taches
void Tcount_tache (void const * argument);
unsigned char Dec2Bcd (unsigned short DEC);
----------------------------------------------------------------- Main
xTaskCreate(t1_tache,"tache1",128,NULL,1,TA1); Création des taches
xTaskCreate(t2_tache,"tache2",128,NULL,1,TA2);
xTaskCreate(Tcount_tache,"tache_count",128,NULL,1,vTcount);
mutex= xSemaphoreCreateMutex(); Création du Mutex
unite =xQueueCreate(1,sizeof(unsigned short)); Création des queues
dizaine =xQueueCreate(1,sizeof(unsigned short));
osKernelStart(); osKernelStart annance le depart des taches.
-----------------------------------------------------------------
unsigned char Dec2Bcd (unsigned short DEC) Corps des fonctions
{uint16_t BCD[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
return BCD[DEC]; }

void t1_tache(void const * argument)


{unsigned short D;
for(;;) Lire une valeur de la queue dizaine
{ xQueueReceive(dizaine,&D,0); Prendre le jeton du mutex
xSemaphoreTake(mutex,portMAX_DELAY);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,0);
GPIOA->ODR= Dec2Bcd(D);
xSemaphoreGive(mutex); Rendre le jeton
osDelay(2); } } Attendre 2ms
void t2_tache(void const * argument)
{unsigned short U;
for(;;)
{ xQueueReceive(unite,&U,0);
xSemaphoreTake(mutex,portMAX_DELAY); Lire une valeur de la queue unite
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,1); Prendre le jeton du mutex
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);
GPIOA->ODR= Dec2Bcd(U);
xSemaphoreGive(mutex);
osDelay(2); } } Rendre le jeton
Attendre 2ms
void Tcount_tache (void const * argument)
{ unsigned short U,D;
for(;;)
{for(D=0;D<10;D++)
{for(U=0;U<10;U++)
{ xQueueSendToBack(unite,&U,portMAX_DELAY); Ecrire des valeurs dans les queues
xQueueSendToBack(dizaine,&D,portMAX_DELAY);
osDelay(1000); }}}} Attendre 1s

2
Exemple 5 : Deux leds : Interruption taches
TaskHandle_t ledh,irqh; Dans le main.c
xSemaphoreHandle binary_mutex=NULL; Création du Handle du mutex
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void led(void const * argument); Déclaration des fonctions des taches
void irq(void const * argument);
static void MX_NVIC_Init(void);
----------------------------------------------------------------- Main
binary_mutex=xSemaphoreCreateBinary(); Création du Mutex
xTaskCreate(led,"led1",128,NULL,1,ledh); Création des taches
xTaskCreate(irq,"lediqr",128,NULL,1,irqh);
----------------------------------------------------------------- Les fonctions
void led(void const * argument)
{ for(;;)
{ HAL_GPIO_TogglePin( GPIOD, GPIO_PIN_12); Fonction de la tâche principale
HAL_Delay(1000); } }

void irq(void const * argument)


{ for(;;) Fonction de la tache commander par l’interruption
{ xSemaphoreTake(binary_mutex,portMAX_DELAY); Prendre le jeton
HAL_GPIO_TogglePin( GPIOD, GPIO_PIN_13); } }
---------------------------------------------------------------------------- Dans le stm32f4xx_it.c
extern xSemaphoreHandle binary_mutex; Variable extern, defini dans le main.c
------------------------------------
void EXTI0_IRQHandler(void) Fonction de l’interruption
{ BaseType_t *pxHigherPriorityTaskWoken;
xSemaphoreGiveFromISR(binary_mutex,pxHigherPriorityTaskWoken); Donner le jeton
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); }
Exemple 6 : pause sur les taches
osThreadId LEDThread1Handle, LEDThread2Handle; Création du Handle des taches
xSemaphoreHandle mutex; Création du Handle du mutex
-----------------------------------------------------------------
osThreadDef(TH1_name, LED_Thread1, osPriorityNormal + 1, 0, Main
configMINIMAL_STACK_SIZE); Définir les taches
osThreadDef(TH2_name, LED_Thread2, osPriorityNormal, 0,
configMINIMAL_STACK_SIZE);
LEDThread1Handle = osThreadCreate (osThread(TH1_name), NULL); Création des taches
LEDThread2Handle = osThreadCreate (osThread(TH2_name), NULL);
mutex= xSemaphoreCreateMutex(); Création du Mutex
osKernelStart(); osKernelStart annance le depart des taches.
-----------------------------------------------------------------
static void LED_Thread1(void const *argument) Corps des fonctions
{uint32_t count = 0;
(void) argument;
for(;;)
{ xSemaphoreTake(mutex,portMAX_DELAY); Prendre le jeton du mutex
count = osKernelSysTick() + 5000; osKernelSysTick() : temporisateur, il se
while (count >= osKernelSysTick()) déclenche a l’exécution de osKernelStart
{ BSP_LED_Toggle(LED5);
osDelay(200); } Attendre 200ms
BSP_LED_Off(LED5);
xSemaphoreGive(mutex); Rendre le jeton
osThreadResume(LEDThread2Handle); Réactiver la tache 2
osThreadSuspend(NULL); } } Suspendre la tache 1

static void LED_Thread2(void const *argument)


{ uint32_t count;
(void) argument;
for(;;)

3
{ xSemaphoreTake(mutex,portMAX_DELAY); Prendre le jeton du mutex
count = osKernelSysTick() + 10000;
while (count >= osKernelSysTick())
{ BSP_LED_Toggle(LED6); Attendre 500ms
osDelay(500); }
BSP_LED_Off(LED6);
xSemaphoreGive(mutex); Rendre le jeton
osThreadResume(LEDThread1Handle); Reactiver la tache 1
osThreadSuspend(NULL); }} Suspendre la tache 2

Vous aimerez peut-être aussi