Bonjour,
Dans le but de comprendre et d'utiliser un système multitâche pour µC, j'ai essayé de faire un système qui soit le plus simple, je ne pense pas que cela représente un grand intérêt d'un point de vue technique, mais d'un point de vue pédagogique oui, par la simplicité du système ça peut permettre de comprendre les bases, j'attends vos avis.
J'ai donc commencé par le système en gestion coopérative, puis je ferais le même système mais en gestion préemptive. Le système est très simple il se compose d'un ordonnanceur qui se charge d’exécuter les application les unes après les autres et d'un service de temporisation en temps réel 16 bits au pas de 1ms.
Partie 1 : gestion coopérative
Dans ce mode de gestion le système appelle les application et elles rendent "gentiment" la main au système qui appelle alors une autre application, les application sont organisés sous forme de grafcet : action 1 -> condition 1 -> action 2 -> ... l'application rends la main au système avant le test de condition et le système mémorise l'adresse de retour, par la suite quand la condition est fausse on retourne au système, si elle est vraie on passe a l'action suivante et ainsi de suite ... identiquement pour toutes les applications.
J’utilise le compilateur sdcc cible 8051, je ne pense pas que le code soit facilement portable : il y a beaucoup de chose propres a ce compilateur, mais l'idée de base est bien là et doit pouvoir se réécrire pour n'importe quel système pourvus qu'il puisse manipuler facilement les adresses de son code.
l’ordonnanceur : difficile de faire plus simple
exemple d'une application : clinotement d'une ledCode://first call app0Led(); app1Led(); //system app_counter=0; while(1) { callApp(app_counter); app_counter++; if(app_counter == APP_NUMBER){app_counter=0;} }
le coeur du système : manipulation des adressesCode:#include "os_extern.h" #include "app0_led.h" #include "system.h" void app0Led(void) { while(1) { //***************** step 1 LED0=LED_ON; //***************** test 1 app0_tempo=250; setReturnAdr(&app0_adr); if(app0_tempo > 0){return;} //***************** step 2 LED0=LED_OFF; //***************** test 2 app0_tempo=250; setReturnAdr(&app0_adr); if(app0_tempo > 0){return;} } }
en pièce jointe la totalité des fichier sources pour le système coopératif avec deux applications.Code:#include "os_extern.h" #include "system.h" void setReturnAdr(short *app_adr) { _asm pop ar2 //app msb return adr pop ar1 //app lbs return adr mov r0,dpl //save return adr in *app_adr mov @r0,ar1 inc r0 mov @r0,ar2 __endasm; } void callApp(char app_number) { _asm mov a,dpl //a=app_number mov b,#2 mul ab add a,#_app0_adr mov r0,a //r0=app(app_number)_adr mov ar1,@r0 push ar1 inc r0 mov ar1,@r0 push ar1 //stack adr to app(app_number) __endasm; }
Alors qu'en pensez vous ? toutes les critiques sont la bien venue, j'aimerais m'améliorer en programmation.
-----