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

Autres architectures Assembleur Discussion :

[PIC 16F] Optimisation de programme


Sujet :

Autres architectures Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut [PIC 16F] Optimisation de programme
    Bonjour à tous,

    Ce que je poste aujourd'hui n'est pas un problème mais plutôt une demande sur l'optimisation du code comme expliqué dans le sujet. Je me suis mis à l'assembleur depuis peu (mais j'ai eu une formation durant mon cursus scolaire). L'optimisation que je souhaiterais faire et la suivante :

    Dans mon problème, j'utilise un timer pour setter une variable et passer à l'étape d'après de ma machine à état. Cela fait appel à plusieurs sous-routines d'interruptions :*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        BTFSS   F_Deb_Timer1        ;Test si Debordement du Timer1
        $-1                         ;Pas de Debordement, attente du debordement
        BCF     F_Deb_Timer1        ;Debordement du timer Mise a 1 du Flag_Db_Timer1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Interrupts:
        ;Interruption Timer1
        BANKSEL PIE1
        BTFSC PIE1,TMR1IE
        CALL Timer1_interrupt
        ...
     
    Timer1_interrupt:
        BANKSEL PIR1
        BTFSS   PIR1,TMR1IF             ; Interruption Timer1?
        RETURN
        BCF     PIR1,TMR1IF             ; RAZ du FLag d'interrupt Timer1
        BTFSC F_SLow_Start_State
        CALL Warmup_interrupt
        BTFSC F_Startup_State
        CALL Startup_interrupt
        RETURN
     
    Startup_interrupt:
        bsf     F_Deb_Timer1
        RETURN
    Sachant que je ne peux pas tester le flag du timer directement dans mon programme, puisqu' il passera alors dans l'interruption et remettra le flag à 0, et je resterai alors bloqué a $-1.
    Y a-t-il une autre manière de faire ?
    Je vous remercie de vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    je ne connait pas assez le pic , mais avant d vouloir faire une optimisation.

    Est que les interruption ont un cycle assez long ?
    Est que ton algo est bien pensé ? (peut être que si ton algo est repensé différaient tu gagnerai on temps de calcul).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    le programme en question est pour un contrôleur brushless. Je me suis beaucoup aidé d'une documentation de microchip (AN1305) qui explique la procédure pour le démarrage d'un brushless, sous forme de machine a état. Effectivement peut-être mon algorithme n'est pas optimisé, d’où ma question . dans tout les cas le démarrage du moteur même avec ce code est efficace.
    Ma question était justement de savoir si il n'y avait pas une manière plus "élégante" de mettre a jour une variable sur l'interruption d'un timer.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Quel genre de cpu exécute ce type d'instruction assembleur ?

    Etant donner que le langage assembleur ne sont que des mnemonic d'opcodes pour CPU, il y a plusieurs types d'assembleur.

    Je dis ça, car je ne connais pas ces instructions, à part call.

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par shaynox Voir le message
    Quel genre de cpu exécute ce type d'instruction assembleur ?

    Etant donner que le langage assembleur ne sont que des mnemonic d'opcodes pour CPU, il y a plusieurs types d'assembleur.

    Je dis ça, car je ne connais pas ces instructions, à part call.
    Je crois qu'il sait deja cela , de plus c'est écrit dans le titre de quel cpu c'est : assembleur sur pic16f

    le programme en question est pour un contrôleur brushless. Je me suis beaucoup aidé d'une documentation de microchip (AN1305) qui explique la procédure pour le démarrage d'un brushless, sous forme de machine a état. Effectivement peut-être mon algorithme n'est pas optimisé, d’où ma question . dans tout les cas le démarrage du moteur même avec ce code est efficace.
    Ma question était justement de savoir si il n'y avait pas une manière plus "élégante" de mettre a jour une variable sur l'interruption d'un timer.
    Si ton code marche l'optimisation n'est qu'un petit plus , je parlait de l'algo en général de ton programme il faut savoir qu'il y a toujours des partie d'un programme assez long et qu'on ne peut pas forcément optimisé du coup peut être qu'il faudra gratté sur d'autre partie de ton programme (en général ce qui touche le matériel on ne peut y faire grand chose).
    On peut utilisé les instructions qui a le moins cout en cycle , precalculer toutes les opérations lourde (s'il y en a) , refaire ces algo pour optimisé il y a que ces 3 méthodes je pense.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 69
    Points : 53
    Points
    53
    Par défaut
    Bonjour et désolé de répondre si tardivement. j'ai en effet pu faire quelques optimisation notamment au niveau de mon problème pour lever un flag au débordement du timer pour réaliser une action. J'ai du remodifier mon code mais au moins de gagne de la place dans la Ram partagée (accessible depuis toutes les Banks). Je traite l'action directement dans l'interruption. Pour l'instant cela ne pose pas de problème, j'avais peur d'avoir des interruptions a rallonge. De plus le programme n'étant basé que sur des interruptions j'ai du revoir les priorités. Le programme étant basé que sur la gestion des interruptions (I2C, débordements Timer1, 4 et 6, détection de fronts..), je verrai si cela est un bon choix mais pour l'instant aucun problème en vu.

    Merci a tous

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2009, 09h57
  2. [Macro] optimisation de programmes SAS
    Par bar_79 dans le forum Macro
    Réponses: 4
    Dernier message: 25/11/2008, 15h51
  3. Optimiser des programmes .net
    Par TSalm dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 06/03/2008, 12h19
  4. Optimiser un programme java
    Par piteon dans le forum Général Java
    Réponses: 27
    Dernier message: 05/08/2007, 20h01
  5. Réponses: 9
    Dernier message: 07/11/2006, 14h12

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