J'essaie d'écrire un commutateur de contexte dans un gestionnaire d'interruption de minuterie. Actuellement, le commutateur de contexte est capable de basculer entre les contextes sur commande (coopérative). Dans le gestionnaire d'interruption, je tentais de:ARM v6 Interrupteur de contexte IRQ
- Enregistrez le compteur de programme actuel comme le lieu le vieux fil doit continuer d'exécuter
- Passer en mode SVC pour effectuer réellement le changement de contexte
- Repassez en le mode IRQ et modifier le registre de lien pour être le PC sauvé du nouveau thread
- Retour du gestionnaire IRQ au lien IRQ registre
Je crois que je peux faire les deux premiers correctement, mais je me demandais: comment puis-je revenir en mode interruption, ou au moins modifier le SVC R13 et R15 à partir du gestionnaire d'interruption? J'utilise un processeur ARM v6; Merci beaucoup pour l'aide!
Edit: voici en gros ce que mon commutateur est:
void interrupt_yield() {
unsigned int old_mode;
__asm__("mrs %0, cpsr" : "=r" (old_mode));
__asm__("msr cpsr_c, %0" : : "r" (MODE_SVC));
PUSH_ALL; // Macro for push {r0-r12, lr}
__asm__("mov %0, sp" : "=r"(sp));
manager->threads[manager->current_thread].sp = sp;
unsigned nt = (manager->current_thread + 1) % manager->thread_counter;
if (CURRENT_THREAD.status == ACTIVE) {
CURRENT_THREAD.status = INACTIVE;
}
manager->current_thread = nt;
CURRENT_THREAD.status = ACTIVE;
SET_SP(CURRENT_THREAD.sp);
POP_ALL;
__asm__("msr cpsr, %0" : : "r" (old_mode));
}
void timer_vector() { // This is called by assembly in interrupt mode
armtimer_clear_interrupt(); // clear timer interrupt
interrupt_yield(); // Calls above function
}
L'objectif est de modifier le registre de lien IRQ pour revenir à la nouvelle fonction. Cependant, je ne peux pas sembler revenir en mode d'interruption pour ce faire.
1 édition de plus: Je ne change jamais réellement le registre de liaison IRQ; Je me rends compte de cela, mais je ne suis même pas revenir en mode IRQ donc c'est un problème plus tard à réparer.
Pouvez-vous partager ce que vous avez fait/essayé jusqu'à présent? Cela aiderait à répondre à votre question. – PhilDulac
Pourquoi auriez-vous besoin de basculer vers le gestionnaire SVC pour effectuer le changement de contexte? Il n'a pas plus de privilège. – Dric512
@ Dric512 Je veux le faire en mode SVC afin de changer le pointeur de la pile en mode SVC, pas celui de l'IRQ. Je ne peux pas simplement basculer en mode SVC et me connecter au registre de liaison, car, lorsqu'une interruption se produit, je veux sauvegarder r15 du thread en cours d'exécution et passer au compteur de programme stocké. –