Bonjour,
dans le cas d'une refonte d'un projet, je rencontre un problème atypique concernant ma routine d'interruption après une IRQ venant du vecteur 0x08 (timer) ou 0x09 (keyboard)
Je récupére l'ancienne interruption (par précautions futurement)Je met ma sauce :
Code : Sélectionner tout - Visualiser dans une fenêtre à part ancienne_interruption = (void*(*)())getvect(8, 0x00);Tout fonctionne, si dans routine_ISR(), je met une variable qui s'incrémente, elle s'incrémente!
Code : Sélectionner tout - Visualiser dans une fenêtre à part setvect(0x08,routine_ISR); // ou bien 0x09
J'ai ma fonction switch_tache() que je fais appelle depuis routine_ISR(), j'aimerai bien que ça fonctionne, sauf que si je l'ajoute dans mon code, ma routine_isr entière ne s'exécute pas mon programme se ferme sans exceptions.
Pour faire très simple voici des exemple bref et concret de mon problème :
ça fonctionne :ça fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 static void *routine_ISR() { printf(" Coucou !\n"); }ça fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 static void *routine_ISR() { printf(" Coucou !\n"); switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); }ça fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 static void *routine_ISR() { printf(" Coucou !\n"); asm("cli; pusha"); printf(" Coucou !\n"); switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); asm("popa; sti"); }ça fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 static void *routine_ISR() { printf(" Coucou !\n"); asm("cli"); printf(" Coucou !\n"); switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); asm("sti"); }ça fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 static void *routine_ISR() { disable(); switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); printf(" Coucou !\n"); enable(); printf(" Coucou !\n"); }Je les ai toutes faites!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 static void *routine_ISR() { printf(" Coucou !\n"); enable(); switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); printf(" Coucou !\n"); }
J'ai également essayé les prototypes suivants :
Je me suis bien documenté avant de poser la question, je sais qu'un ISR ne permet pas les interruptions, sauf que la fonction printf() à l'aire de fonctionner donc pour debuger, mais pas ma propre fonction.., j'ai pourtant essayé sans.. j'avais déjà à faire à ce problème sur un projet précédent. J'ai seulement testé sous NTVDM (cmd) je sais pas si c'est ça qui cause ces problèmes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 inline void switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr); static void switch_tache(&Tache_pool[prec].stack_ptr, &Tache_pool[suiv].stack_ptr);
Veuillez voir en pièce jointe mes captures. Pour tester, j'ai définit mon vecteur à 0x09 (Clavier), donc dés que je presse une touche, ça exécute ma routine_isr(). Vous constaterez que dés que je décommente ma fonction switch_tache(), plus rien ne s'exécute, ni même mon printf.. et j'ai tenté un fflush(stdout) ou avec endl; ... rien !
J'ai peut être écrasé des stack en créant des tâches je sais pas..
Si quelqu'un peut m'éclairer
Cordialement
Partager