Tableau de constantes avec  adresses de labels en asm [Forums - HC908 et S08]
Tableau de constantes avec  adresses de labels en asm [Forums - HC908 et S08]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



« 1 2 (3) 4 »


Re: Tableau de constantes avec adresses de labels en asm
Modérateur
Inscrit:
24/09/2005 13:30
De 04110 - VACHERES- FRANCE
Messages: 1494
Hors Ligne
Si Ritchie avait du faire des "libs" asm pour tous les fabricants de CPU, il y serait encore...

Maintenant, les livres sont en C, car comme on l'a expliqué ci dessus, rare sont les rééls besoin de coder en ASM dans un projet industriels.
Stéphane l'écrivait, je l'ai fait souvent aussi, coder un tout petit bout en ASM dans un projet C. Exemple : un UART soft, pour arriver à avoir la même durée pour un bit à 0 et un bit à 1. Et encore, on peut tr^s bien ajouter des nop dans le C :
asm(" nop") ;

Chaque mnémonics sont différents d'un CPU à l'autre, la seule solution, est que le fabricant propose des fonctions.
FREESCALE ne le fait pas.
Et oui, il y a une solution : se faire ces fonctions, les mettre dans un fichier ou plusieurs et les intégrer au nouveau projet si besoin.
Mais pas possible de faire des librairies assemblées, au sens du terme C.

Yvan

Posté le : 30/01/2012 08:39
Le houblon, c'est bon pour la récupération.
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Intéressé
Inscrit:
26/10/2011 12:49
De 97420 LE PORT
Messages: 34
Hors Ligne
Merci de votre réponse intéressante.
.
Mais je crois que vous tenez cet exemple assez rare, vu la lenteur proverbiale du C, et il faudrait voir pourquoi le C a été plus fort que vous ce que j'ai peine à croire. Comment une machine "molle" qui n'a pas de temps d'exécution préétabli, autrement dit asynchrone, peut- elle battre une machine synchrone, cela n'arrive jamais dans les transmissions, on voit la peine (multiplication par 16 de la fréquence des tests) d'une SCI.
.
Bien sûr, quand on arrive, le C, qui n'est pas un langage de programmation puisqu'aucun µC ou µP ne contient dans sa mémoire les instructions du C, donc ne peut les exécuter, paraît plus facile, mais par exemple, dès que l'on approfondit un petit peu, on voit qu'il est par exemple impossible en C de faire un chronomètre au millième de seconde. Les gens sont trompés par les apparences. Il y a impossibilité en C de faire un compteur/décompteur qui marche, la société Velleman s'y est essayée, elle a fait un joli kit, N°8035 si mon souvenir est bon, je l'ai acheté croyant me gagner du temps, or c'est une lamentation, sa vitesse de comptage maxi est de l'ordre de 100 impulsions par seconde. Il faut 50.000 en industriel.
.
Ce qu'il faut par contre c'est un véritable assembleur capable de remplacer le côté pratique du C en enregistrant toutes les routines que l'on a mises au point pour les ressortir comme des instructions, c'est une question que j'ai posée pour le CW 6,3, bénéficie-t-il de ce type de possibilité?
Sinon l'assembleur perd les 9/10e de sa force.
.
Cordialement
pont

Posté le : 30/01/2012 13:45
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Modérateur
Inscrit:
24/09/2005 13:30
De 04110 - VACHERES- FRANCE
Messages: 1494
Hors Ligne
Non, non, stop, ça devient du n'importe quoi là !!!

Un chronomètre au millième de secondes, aucun soucis pour le faire en C !!! Il s'agit d'une simple IT toutes les ms, ce que n'importe quel 9S08fait les doigts dans le nez, quelque soit le langage !!! Pour les autres fabricants, je ne m'engage pas, je ne connais pas.

Derrière les compilateurs de langages évolués, il y a des gens qui ont réfléchis, travaillés, recommencés pour faire quelque chose de bien. Certains compilateurs sont mieux que d'autres, sur différents poins.

Que tu souhaites travailler en ASM, pas de problèmes, je pense que personne y verra aucun inconvénient (...).
Mais il faut arrêter de dire n'importe quoi par contre !!! Il y a des gens qui lisent ce forum et qui ont grands débutant mais avec une envie énorme d'apprendre. Il ne doivent pas lire des bêtises comme ça... En tout cas, pas sur ce site.

L'assembleur ne sait pas faire de lui même des lib, tout dépend de l'environnement de développement (IDE) utilisé.
CW ne le fait pas, mais avec un tout petit peu de rigueur, c'est super simple. Il suffit de faire des fonctions regroupées dans des fichiers qui portent le nom de ce qu'il contient : math.s, lcd.s, etc...
Et ensuite, lors d'un nouveau projet, les ajouter au fichier principal de l'application.
Ce n'est que de l'organisation de la part du développeur, du temps passé à coder ces "drivers" ou "fonctions évoluées", rien de plus.

Et pour finir, il n'y a pas de "lenteur du C" ou alors, c'est un compilateur pourrit !!! Car en effet, le compilateur ne fait que traduire d'un langage vers un autre, comme le ferait le développeur ASM.

Yvan, pas content

Posté le : 30/01/2012 13:57
Le houblon, c'est bon pour la récupération.
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1162
Hors Ligne
Bonjour,

Le C n'est point du tout un langage lent du moment où il est compilé et non pas interprété ! (ce qui est parfois le cas sur un PC)

Ce qui peut ralentir un programme en C c'est lorsque l'on utilise des librairies de fonctions qui couvrent tous les cas d'utilisation alors que l'on souhaite utiliser un cas particulier. C'est par exemple le cas d'un simple printf qui en float peut prendre des lustres avant d'arriver au bout ou d'une simple division 64/32 ... En C la librairie est grosse et donc lente mais couvre tous les cas définis par ANSI alors que souvent dans un soft embarqué on a besoin que d'un cas particulier et on réécrit sa routine. C'est ce que j'ai fais par exemple pour formater l'affichage d'un 'long' comme je le voulais ou pour recoder une division 64/32 avec des entiers positifs uniquement...

La raison pour laquelle un compilateur C est plus performant qu'un humain pour faire de l'ASM réside dans le fait que le compilateur (s'il est bien écrit) va utiliser toutes les ressources du CPU les plus optimisées comme par exemple passer une variable dans un registre plutôt que par la RAM, va utiliser une combinaison de plusieurs instructions dont le nombre de cycles sera inférieur à celui de la routine écrite par l'humain, simplement car il connait tous les modes d'adressage, tous les nombres de cycles des instructions ainsi que leur empreinte mémoire et les utilisent de manière optimisée selon les paramètres qu'on lui a indiqué alors qu'en général un codeur humain ne les maîtrise pas tous... surtout s'il travaille sur plusieurs plateformes différentes ce qui est je pense courant.
Personnellement j'ai programmé des années en ASM sur du 6809, 68000, Z86, 8051, 68HC11, avant de passer au C sur du 8051, 68HC11, s08, Coldfire, C166, ARM7 ! Et bien personnellement je ne suis pas capable de connaitre toutes les instructions de chaque CPU, tous les modes d'adressage, ni même de faire une routine optimisée qui va utiliser un adressage indirect short au lieu de long car la localisation mémoire a été choisie pour cela...
Si on ajoute au fait que l'on réalise des fonctions de plus en plus complexes et nombreuses dans les CPU pour réduire les coût du hardware, cela devient difficile de contourner l'utilisation d'un langage évolué comme le C.

Faire un chronomètre au millième de seconde n'est pas compliqué... J'ai déjà fais des compteurs bien plus précis que ça (milliardième voir plus).... Un simple compteur de fréquence qui monte à 1 Ghz sait faire ça... Comment ? Nul besoin d'écrire en ASM. Cela utilise des routines HW du CPU (timer) dont la précision est celle de l'horloge qui le pilote et la résolution est en général de 16-bits sur les petits CPU et 32 bits au dessus... Afin de compter avec des fréquences plus hautes, on utilise alors des prescalers pour prédiviser le signal d'une part puis un algo qui compte les impulsions manquantes au dela de la fenêtre de gate pour arriver à la prochaine valeur entière du timer, ce qui permet d'avoir une résolution importante. La précision reste celle de la base de temps utilisée (un quartz c'est 10-30ppm, un TCXO c'est 0.5-2ppm, un OCXO c'est 1.10-11, un rubidium c'est 1.10-12 voire -13....). J'ai déjà réalisé des compteurs à plusieurs GHz dont la précision était de l'ordre du Hz (< 1.10-9).... donc le millième (1.10-3) ne parait pas compliqué à atteindre....

Bref, le débat ASM vs C est stérile. Il n'y a pas de mieux ou moins bien. Chacun a des avantages et inconvénients en fonction des contraintes et applications. Comme Yvan et moi même l'avons suggéré , on peut recourir aux deux dans certains cas spécifiques. Cela m'arrive souvent encore.

Dans l'origine du message de Bobly02, ce qui était étonnant est qu'il annoncait avoir codé intégralement en ASM pour des raisons de taille mémoire et c'est sur cet aspect que nous avons réagit en dénotant que c'était inhabituel car le compilateur C, bien paramétré et utilisé par quelqu'un qui sait ce qui se passe derrière, est en général plus performant pour diminuer l'empreinte mémoire ou le nombre de cycle (les deux étant en général des contraintes qui ne vont pas dans le même sens ! ).

L'un des troubles amené par le C dans les applications embarquées est que cela ouvre l'accès au soft embarqué à des non électroniciens. Ils n'ont donc pas la connaissance de ce qu'il se passe dans un CPU lorsque l'on fait un simple printf en C et pondent des softs en effet pas toujours optimisés d'un point de vue rapidité ou empreinte mémoire. Mais ce n'est donc pas un problème de compilateur, mais plutôt d'utilisateur....

Cordialement
Stéphane

Posté le : 30/01/2012 14:47
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Intéressé
Inscrit:
26/10/2011 12:49
De 97420 LE PORT
Messages: 34
Hors Ligne
Bonjour Stéphane. Bravo pour vos performances!

Les choses sont simples.
Pour faire un comptage, c'est à dire avec seulement le µC, en gérant astucieusement l'affichage, donc en n'utilisant pas la méthode habituelle, il faut un peu moins de 100 cycles, il n'est pas possible de descendre dessous. (par exemple 10 cycles) et on complète à 100 cycles par des nop.
Donc si on a un quartz 4MHz, qui donne un cycle de 1µS (6802 par exemple) le calcul montre que vous ne pouvez pas faire mieux que compter jusqu'à une fréquence de 10kHz.
.......
On est bien loin des GHz.
Maintenant un compteur-décompteur qui doit aussi faire le décodage (comme sur machine-outil) est forcément plus lent, car il faut plus de 100 cycles, il y a des tests et des branchements. En asm on peut prévoir le résultat.
...
Donc c'est tout simple pour savoir exactement la fréquence maxi en simple compteur que peut mesurer un µC, il suffit de diviser une seconde par la durée de 100 cycles. C'est bien lent.
.
Cordialement
pont

Posté le : 31/01/2012 13:44
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1918
Hors Ligne
Bonjour

Pont, les choses ne sont pas simples du tout à vous lire car vous écrivez avec conviction un ramassis de bêtises, contre vérités voir grosses erreurs à chaque message ! Faites attention s'il vous plait pour les débutants qui nous lisent afin de ne pas les induire en erreur !
Stéphane ne vous à pas parlé de ses performances, il vous a expliqué que l'ASM, le C ou un quelconque code n'a rien a voir avec la vitesse ou la précision d'un compteur avec un µc comme les Freescale dont il est l'objet ici. Pour faire un tel compteur nous allons utiliser les capacités HARDWARE du µc, avec les timers, qui donneront sans le moindre code un résultat à la fois précis et beaucoup beaucoup beaucoup beaucoup beaucoup plus rapide que ce que vous dites être la limite absolue !

Vous dites "en utilisant la méthode habituelle", qui prend un peu moins de 100 cycles, affirmation très précise de votre part. Mais CA N'A PAS DE SENS !
Vous n'avez pas de méthode, vous n'avez à ce jour pas idée de comment faire un compteur précis et rapide avec un µc.

Je vous invite à bien relire ce que Stephane vous a expliqué.


Posté le : 31/01/2012 14:03
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Modérateur
Inscrit:
24/09/2005 13:30
De 04110 - VACHERES- FRANCE
Messages: 1494
Hors Ligne
Bon, je recommence : quand on ne sait pas, on ne dit rien (pour être poli..) !!!

Il faut arrêter de débiner n'importe quoi sur ce forum, sinon, je ferme la discussion et la supprime.

Pont, tu racontes n'importe quoi, un quartz à "4MHz ne donne pas 1µs", les CPU actuels ont de PLL ou FLL qui permettent de monter la fréquence.
Ensuite, même à 1µs de temps de cycle, Stéphane a parlé de timer interne HARD et pas de compteur soft.
On peut ne pas comprendre, mais dans ce cas, on pose des questions pour essayé de comprendre, pour apprendre, et surtout, on raconte pas n'importe quoi en contredisant des personnes dont c'est le métier depuis plusieurs dizaines d'années pour certains.

Pour revenir à l'ASM, ok, fais en, mais arrête de nous gonfler avec ce débat ASM vs C qui ne veut rien dire et surtout, qui n'est pas justifié par les "explications" erronées que tu avances.

Yvan, toujours énervé qui va pas tarder à faire sauter les posts de cette discussion...

Posté le : 31/01/2012 14:04
Le houblon, c'est bon pour la récupération.
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1162
Hors Ligne
Oula.... calmez vous camarades !

@Pont

Pont, il me semble que vous avez une culture des CPU qui n'est plus réactualisée. Nos simples petits MCU (microcontrolleurs et non pas microprocesseurs), embarquent des périphériques matériels tels que des timers ce que vous n'avez pas dans un simple microprocesseur.
Je vous confirme que l'on peut mesurer plusieurs MHz avec un CPU tout seul et plusieurs GHz en rajoutant un peu de logique externe au CPU et avec la précision de la base de temps employée (quartz ou autre)

Afin de faire une mesure de fréquence, la méthode consiste à utiliser le périphérique Timer du CPU. Ce timer est purement hardware. C'est à dire qu'il fonctionne tout seul sans intervention de lignes de code ce qui explique que les performances ne sont pas liées au code, mais à la base de temps utilisée (quartz ou autre). Le fonctionnement de ce timer est décrit dans le datasheet du CPU
On peut choisir un sous multiple de la fréquence de bus du CPU pour cadencer ce timer. Si on veut aller vite, alors il faut choisir un sous multiple de 1, et le compteur sera cadencé à la fréquence du bus du CPU (20 MHz pour la plupart des petits S08)


La méthode est de :

- définir une période d'intégration (sur un fréquencemètre commercial c'est généralement paramétrable genre 100ms, 1s, 10s, mais on peut la choisir fixe) et d'initialiser et lancer un timer qui génère une interruption logicielle lorsque cette période est arrivée à terme.
Comme les compteurs sont 16-bits (65536) on voit que s'il est cadencé à 20 MHz, il va durer (1/20e6)*65536 = 3.2768ms. nous sommes donc loin de 1s !

Afin de réaliser un compteur de 1s, il suffit dans la routine d'interruption déclenchée lorsque le timer passe en overflow (c'est à dire qu'il a compté de 0 à 65536) d'incrémenter une variable. Pendant que le code pour incrémenter la variable s'exécute, le timer matériel a reprise sa course depuis 0 sans perdre un seul cycle d'horloge (puisqu'il est matériel)

Lorsque cette variable aura atteint 1s/3.2768ms = 305.1758125, alors nous aurons compté une seconde. Cependant notre variable est entière donc on peut détecter 305 ou 306 ce qui correspond soit à un petit peu moins de 1s, soit à un petit peu plus. Afin de corriger cette imprécision, on détecte lorsque la variable a atteint 305 et on reparamètre le timer pour compter non plus jusqu'à 3.2768ms (65536), mais jusqu'à 1s - (305 * 3.2768ms) = 0.576ms ce qui à 20 MHz de fréquence CPU donne une valeur de timer de 11520.

Lorsque le l'on a atteint ce but, alors, nous avons compté une seconde au cycle près (qui à 20 MHz représente 50ns de résolution) et le tout à la précision de la base de temps (quartz, tcxo, ocxo, GPSDO, rubbidium, etc....)

Bon. C'est bien mais on fait quoi durant cette période d'intégration de 1s ???

Et bien on va paramétrer un canal de timer en 'Input Capture'. C'est à dire qu'un registre va s'incrémenter à chaque front présenté sur une des pin du CPU. Donc, un nouveau registre va s'incrémenter tout seul à chaque fois qu'un front montant sera détecté sur la pin du CPU et le tout sans avoir à dérouler une ligne de code ! Encore une fois c'est matériel.
De la même manière on peut gérer si le compteur dépasse 65536 en incrémentant une variable par soft. Je pense que la fréquence maximale que l'on peut atteindre en Input Capture est celle de la fréquence de bus (20 MHz dans notre cas), mais je ne suis plus sûr.

Maintenant la séquence est :
- lancer le compteur d'intégration qui va compter disons pendant 1s et au même moment mettre à 0 le compteur qui compte les fronts.
- lorsque l'interruption du compteur d'intégration arrive à terme au bout de 1s, dans la routine d'interruption, il suffit d'arrêter de compter les impulsions du compteur de front et de calculer le nombre d'impulsion pour avoir des Hertz directement !

Exemple :
Période d'intégration de 1s, on mesure 5624265 impulsions, et bien on a mesuré 5.624265 MHz, et le tout toujours avec une résolution de 50ns et une précision dépendant de la base de temps.


Dans le cas où l'on veut mesurer des fréquences beaucoup plus hautes (GHz par exemple), il suffit de faire précéder le compteur d'impulsions par un prescaler d'une part (composant qui divise par X) et de multiplier par X dans le calcul de fréquence. Mais un prescaler divise d'autant la résolution. (cependant on voit de suite que si on utilise un prescaler par 64 et que notre MCU peut mesurer des fréquences de 20 MHz alors notre montage pourra monter à 64x20 MHz = 1280 MHz ! La résolution aura été déteriorée par 64 mais restera de 50ns * 64 = 3.2ms soit 1/3.2ms = 312 Hz... C'est pas si mal. avec deux composants !

Après avec un peu de logique externe (des compteurs en logique TTL) il est possible de rester précis en introduisant un algorithme qui lorsque la seconde est passé, et que notre compteur d'impulsion se trouve entre deux valeurs, alors on pilote ces compteurs TTL jusqu'à générer la prochaine impulsion et cela donne la partie décimale qui nous manquait.
Bon c'est moins facile à comprendre sans faire de schéma, mais croyez moi ça marche !

D'ailleurs, c'est comme cela que sont fait tous les compteurs de fréquence commerciaux, et il y a 25 ans on n'avait pas des CPU aussi performants.

Donc dans votre cas, sur vos machines outils, si vous souhaitez mesurer les impulsions provenant de vos codeurs de position ou vitesse, qui sont généralement à basse fréquences, vous pourrez le faire avec un redoutable résolution de 50ns (inutile d'aller au dessus de 20 MHz je pense)
Et la précision de la fréquence que vous aurez lu dépendra de la précision de votre base de temps. Si vous utilisez un quartz à 10ppm (= 10 Hz/MHz) et que vous mesurez un signal de 100 KHz, alors vous aurez une précision de 1 Hz et ce avec un misérable quartz bon marché. Si maintenant vous optez pour un TCXO à 1ppm, vous aurez une précision de 0.1 Hz !
Etc etc etc...

J'espère vous avoir convaincu et donné la méthode pour garantir une mesure de fréquence très précise et avec quelques lignes de soft uniquement que vous pouvez faire en C ou en ASM indifféremment puisque leur temps d'exécution n'entre pas du tout en compte dans la mesure...

Cordialement
Stéphane




Posté le : 31/01/2012 20:38
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Accro
Inscrit:
27/09/2005 19:01
Messages: 254
Hors Ligne
Salut,

Yvan s'il te plait ne ferme pas ce post, meme, si vous n'etes pas d'accord les uns les autres, ce que je peu comprendre

mais la Stephane viens d'ecrire quelque chose qui je crois devrais resté, il repond a beaucoup de questions que me suis toujours posé a propos de timer et autre gestion du temps et, je crois d'autres aussi comme moi ce sont posé la question

bien sûr il faut que je relise encore pour comprend a fond, je comprend vite mais il faut m'expliquer longtemps, mais je crois vraiment qu'il faut garder cette portion de message

en merci Stephane, c'est vraiment super

PAT



Posté le : 31/01/2012 21:18
Transférer la contribution vers d'autres applications Transférer


Re: Tableau de constantes avec adresses de labels en asm
Intéressé
Inscrit:
26/10/2011 12:49
De 97420 LE PORT
Messages: 34
Hors Ligne
Bonsoir, pourquoi s'énerver?
On m'a conseillé de venir là.
Je programme depuis 1972, c'était le basic. j'ai fait de nombreux stages, en 82 j'ai fait la connaissance du Pascal et de l'assembleur, à la fac de Rangueil à Toulouse, section mathématiques. En projet de fin de stage, avec un copain on a fabriqué un appareil de mesures universel à 8 entrées, avec une V24 reliée au PC.
Puis études d'autres langages, un dont je ne me rappelle plus qui servait dans AUTOCAD pour créer de nouvelles fonctions, il y a eu aussi PL7-2, et quelques autres du même tabac
J'ai connu diverses machines, et programmé n'importe quoi, depuis le premier traitement de texte d'un microordinateur français, jusqu'à un programme d'évolution du développement de microbes, etc... etc...
A exposciences 96, c'est mon stand qui présentait 4 applications d'un API fait avec un MC68705P3S et a obtenu un formidable succès sur les 5 jours, il y avait souvent 3 couches de spectateurs sur les 6m de long.
J'ai été nommé formateur pour l'académie de Bordeaux pour un an, dans les lycées. à destination des profs.
J'ai encore fait d'autres stages, Lyon Ecole Centrale, Périgueux, Paris. et tout ce que j'ai programmé a marché. Pourquoi ça ne marcherait pas avec le Freescale? Attendez de voir si mes trucs marchent quand j'aurai pu matériellement les faire, là vous critiquerez.
Cordialement
pont

Posté le : 31/01/2012 23:12
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
« 1 2 (3) 4 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Tableau de constantes avec adresses de labels en asm [Forums - HC908 et S08]