IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Routine ISR vs function


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut Routine ISR vs function
    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)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ancienne_interruption = (void*(*)())getvect(8, 0x00);
    Je met ma sauce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setvect(0x08,routine_ISR);  // ou bien 0x09
    Tout fonctionne, si dans routine_ISR(), je met une variable qui s'incrémente, elle s'incrémente!

    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 :
    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");
    }
    ça fonctionne pas :
    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");
    }
    Je les ai toutes faites!
    J'ai également essayé les prototypes suivants :
    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);
    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...


    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
    Images attachées Images attachées   
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  2. #2
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut
    Je fais encore plus court :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static void toto()
    {
    	printf(" ca va ?\n");
    }
     
    static void *routine_ISR()
    {
    	printf(" Coucou!\n");
    }
    Résultat :
    ca va ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void toto()
    {
    	printf(" ca va ?\n");
    }
     
    static void *routine_ISR()
    {
    	printf(" Coucou!\n");
    	toto()
    }
    Résultat : ABSOLUMENT RIEN
    Même en activant/désactivant les interruptions.. une explication que printf() fonctionne et pas toto() ?
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  3. #3
    Membre chevronné
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 588
    Points : 1 770
    Points
    1 770
    Billets dans le blog
    1
    Par défaut
    Problème résolu sur une machine physique, c'est la faute de NTVDM de notre bon vieux Windows XP...
    j'ai oublié que ça aime pas initialiser la GDT, IVT en plus des IRQ..

    Bonne soirée
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modéliser une ISR (Interrupt Service Routine)
    Par perplex dans le forum UML
    Réponses: 8
    Dernier message: 21/05/2014, 18h37
  2. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15
  3. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo