Planificateur de Taches simplifié - Ressources > Systèmes d'exploitation - Articles et téléchargements
Planificateur de Taches simplifié - Ressources > Systèmes d'exploitation - Articles et téléchargements
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
proposer
 
   
             
 
Catégories
 
   
             
 
Recherche
 
   
 
Articles-et-telechargements > Ressources > Systèmes d'exploitation > Planificateur de Taches simplifié

Planificateur de Taches simplifié

Publié par maverick59 le 28/06/2011 (2874 lectures)

Voici un petit code permettant à un µC de réaliser plusieurs taches à des périodes différentes.
Pour cela, il suffit d'ajouter à votre projet, les 2 fichiers joints à cet article.

Afin de faciliter la compréhension, nous utiliserons un exemple simple de mise en place.

Admettons que l'on désire exécuter la tache « Fonction_1 » toutes les 50ms, ainsi que la « Fonction_2 » toutes les 100ms en lui passant un pointeur vers la structure « Mes_donnees ».

Commençons par déclarer ces deux fonctions:

/*******************************************************/
/* Déclaration de la première fonction à exécuter toutes les 50ms" */
/* Input: NULL                                                                            */
/* Output : NULL                                                                         */
/*******************************************************/                                                           
void Fonction_1(void)
{
  //Ecrire ici ce que doit faire cette Fonction
}
/*******************************************************/

/*********************************************************/
/* Déclaration de la seconde fonction à exécuter toutes les 100ms"   */
/* Input: Pointeur sur la structure de donnée de type "Ma_Structure" */
/* Output : NULL                                                                            */
/*********************************************************/                                                           
void Fonction_2(struct Ma_Structure *s)
{
  //Ecrire ici ce que doit faire cette Fonction
}
/*******************************************************/ 
La définition et la déclaration de la structure ayant bien sur été faites en amont.

Une solution simple serait de faire une boucle d’attente et d’appeler les fonctions lorsqu’une tempo se termine, mais du coup, beaucoup de temps de perdu, et pas évident à faire évoluer… D’où l’écriture de ce petit planificateur de tâches facile d’emploi.

Il fonctionne, par interruptions, et nécessite donc l’appel de la fonction « Execution_Planificateur », soit par une RTI, soit par un timer, etc…C’est eux qui vont cadencer l’ensemble.
Dans notre exemple, nous supposerons un timer réglé pour générer une interruption toute les 10ms et, dans la fonction appelée par cette interruption, hormis l’effacement du flag, il y a l’exécution de la fonction « Execution_Planificateur ».
Donc en résumé, toutes les 10ms, le µC va traiter le code contenu dans cette interruption, y compris « Execution_Planificateur » et si il estime qu’il est temps d’exécuter une des fonctions ayant été ajouté au planificateur nécessitant de l’être.

Dans le fichier « Scheduler_Light.h » se trouvent 2 macro :

#define PERIODE_EXECUTION_PLANIF 10
#define SCHEDULER_NB_MAX_EVENT 3

La première sert à définir la période à laquelle le planificateur va être appelé ici nos 10ms, la seconde est le nombre maximum de tâches qu’il peut contenir, ici 3, il sera à faire évoluer en fonction de l’application et du nombre de tâches que vous aurez besoin d’ajouter.

Troisième étape, l’ajout des tâches :
Pour cela, une fonction existe : « Add_Periodical_Event ».

Pour ajouter la fonction « Fonction_1 », il suffit d’écrire :
(void)Add_Periodical_Event (Fonction_1, NULL, 50 / PERIODE_EXECUTION_PLANIF) ;
En détaillant : Une tâche va être ajoutée, elle s’exécutera toutes les « 50 / PERIODE_EXECUTION_PLANIF » périodes, c'est-à-dire, ici 50 / 10 = 5 périodes de 10ms = 50ms. Elle appellera la fonction « Fonction_1 » et ne lui passera aucun paramètre.

Pour ajouter la fonction « Fonction_2 », il suffit d’écrire :
(void)Add_Periodical_Event (Fonction_2, &Mes_donnees, 100 / PERIODE_EXECUTION_PLANIF) ;
Ici, ajout d’une tâche appelant la fonction « Fonction_2 » toutes les 100ms, et avec comme paramètre, un pointeur vers la structure «Mes_donnees ».

Il est préférable de s’assurer qu’aucune fonction appelée ne dure plus longtemps que la période d’exécution, ici les fonctions ne doivent pas prendre plus de 10ms.

Elles sont exécutées dans l’ordre dans lequel elles sont ajoutées, si 2 tâches doivent s’exécuter en même temps, celle qui sera placée en premier, sera exécutée avant l’autre (oui, c’est un planificateur simplifié, pas de messages, de sémaphores, de répartitions de temps….).

Il est assez facile de le modifier pour ajouter une notion de priorité aux tâches, je ne l’ai pas fait, car justement, je trouvais qu’il perdait un peu de sa simplicité, et nécessitait plus de temps pour décider de l’exécution d’une tâche.

La fonction « Add_Periodical_Event » renvoie l’index auquel a été ajouté la fonction dans le tableau des tâches à exécuter, il n’est pas obligatoire de l’utiliser (d’où le (void) ci-dessus), mais il est nécessaire si l’on désire supprimer une tâche :

Supposons que l’on souhaite supprimer la première tâche ajoutée au début de l’exemple :
(void) Delete_Periodical_Event(0) ;
La tâche se trouvant à l’index 0 sera supprimée, et son emplacement sera considéré comme libre pour l’ajout d’une nouvelle tâche…

J'espère avoir été suffisement clair, en cas de problème, questions, n'hésitez pas...

Tags: sequenceur   Planificateur-de-taches  


Fichiers liés à cet article
Nom de fichier Publié le Hits
Télécharger ce fichier Les fichiers .c et .h
.
28/06/2011 305

Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.
Auteur Commentaire en débat
Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Planificateur de Taches simplifié - Ressources > Systèmes d'exploitation - Articles et téléchargements