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: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: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 8O 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:
1
2
3
4 static void *routine_ISR() { printf(" Coucou !\n"); }
ça fonctionne pas :Code:
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:
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:
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:
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:
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:
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