sauvegarde d'un contexte, plus precisément d'une adresse a exécuter
Bonjour, me revoila sur le forum avec un nouveau problème, voila je code un OS temps réel et j'ai un petit soucis pour sauvegarder un "contexte"
j'explique mon cas:
je suis en train d'exécuter une tache i, cette tache requiert a un moment donner un événement qui n'est pas encore arrivé. Donc la tache s'arrète de s'exécuter en plein milieu pour attendre cet événement.
En attendant je réalise d'autre opération ..... lorsque que l'événement arrive pour débloquer la tache 1, je doit retourner précisément à l'endroit ou je me suis arrété.
Comment faire pour enregistrer cette adresse? Assembleur ou C
Je travaille sur PIC32
cordialement
Sauvegarde d'un contexte, plus precisément d'une adresse a exécuter
Bonsoir
Juste une suggestion, si c'est vraiment une restauration de contexte que tu veux en langage C système, pourquoi ne pas utiliser les primitives existant sous UNIX cela te faciliterait la tâche :calim2:
en utilisant les primitives suivantes setjmp & longjmp dont l'un sauvegarde le contexte actuel et l'autre la restaures tu pourrais très bien réaliser ce que tu veux avec ça ? plus d'avis serait la bienvenue
Exemple plus courant détection d'une division par 0
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#define ALR 1
#define MIN 50
#define MAX 100
int i;
int ret;
jmp_buf rest_Context;
struct sigaction s_Event;
/***
* Handler
***/
void h_Sig( void ){
printf("#Dectection division par Zéro à la tâche %d\n ", i);
longjmp( rest_Context, ALR );
}
/***
* Fonctyion divisition
***/
int f_Calcul( int iArg ){
return ( MIN / ( ( iArg * iArg) - MAX ) );
}
/***
* Fonction principale
***/
int main( void ){
int iRet = 0;
(&s_Event)->sa_handler = h_Sig;
sigaction( SIGFPE, &s_Event, NULL );
for( i = 0; i < MIN/3; i++ ){
iRet = setjmp( rest_Context );
if( iRet == 0 ){
ret = f_Calcul( i );
printf("Loop (%d) =\t%d\n", i, ret );
}
continue;
}
return ( 0 );
} |
à bientôt