Atmega32

From Eric

(Difference between revisions)
Jump to: navigation, search
Line 3: Line 3:
===Edition, compilation et édition de liens===
===Edition, compilation et édition de liens===
 +
==== Utilisation des flottants ====
-
=== Utilisation des flottants ===
+
L'utilisation du format "%f" nécessite l'utilisation d'une bibliothèque particulière, <code>printf_flt.a</code> qui contient le code de la fonction <code>vfprintf</code> supportant les conversions flottantes. Ceci est expliqué en détail dans la description de la bibliothèque "std_lib" de la libc d'AVR ([http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html ici], dont voici un extrait :
-
L'utilisation du format "%f" nécessite l'utilisation d'une bibliothèque particulière, "printf_flt.a" qui contient le code de la fonction "vfprintf" supportant les conversions flottantes. Ceci est expliqué en détail dans la description de la bibliothèque "std_lib" de la libc d'AVR ([[http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html ici]], dont voici un extrait :
+
''Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). [...]''
-
Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). [...]
+
En effet, la fonction <code>vfprintf</code> standard (qui constitue le coeur des fonctions <code>printf</code>) est simplifiée de façon à occuper le moins de place possible. Aussi, si on ne substitue pas la version complète de <code>vfprintf</code> à la version minimaliste, l'affichage d'une valeur flottante se résume à un "?" !
-
 
+
-
 
+
-
En effet, la fonction "vfprintf" standard (qui constitue le coeur des fonctions "printf") est simplifiée de façon à occuper le moins de place possible. Aussi, si on ne substitue pas la version complète de "vfprintf" à la version minimaliste, l'affichage d'une valeur flottante se résume à un "?" !
+
Pour effectuer cette substitution, il faut modifier les options de compilation de façon à ce que :
Pour effectuer cette substitution, il faut modifier les options de compilation de façon à ce que :
-
* la bibliothèque "printf_flt.a" résolve le symbole "vfprintf" en lieu et place de la bibliothèque standard ;
+
* la bibliothèque <code>printf_flt.a</code> résolve le symbole <code>vfprintf</code> en lieu et place de la bibliothèque standard ;
* la bibliothèque mathématique soit chargée.
* la bibliothèque mathématique soit chargée.
-
Les options à utiliser au niveau du Makefile sont les suivantes : "LDFLAGS +=  '''-uvfprintf -lprintf_flt'''  -lm  -Wl,-Map=CtrlRobot.map"
+
Les options à utiliser au niveau du Makefile sont les suivantes :  
-
Ici, l'option importante est "-uvfprintf" qui supprime la résolution de "vfprintf" de façon à ce qu'il soit résolu par la version contenue dans la bibliothèque "printf_flt".
+
<code>LDFLAGS +=  '''-uvfprintf -lprintf_flt'''  -lm  -Wl,-Map=CtrlRobot.map</code>
 +
 
 +
Ici, l'option importante est <code>-uvfprintf</code> qui supprime la résolution de <code>vfprintf</code> de façon à ce qu'il soit résolu par la version contenue dans la bibliothèque <code>printf_flt</code>.
Ces options peuvent normalement être modifiées directement sous l'environnement AVR, mais je n'y suis pas parvenu...
Ces options peuvent normalement être modifiées directement sous l'environnement AVR, mais je n'y suis pas parvenu...
-
Nota : on vérifiera dans le fichier "map" que le symbole "vfprintf" est bien résolu. Ainsi, dans le cas de l'application pour laquelle j'ai eu le besoin de réaliser des entrées / sorties flottante, on trouve les lignes suivantes :
+
Nota : on vérifiera dans le fichier "map" que le symbole <code>vfprintf</code> est bien résolu. Ainsi, dans le cas de l'application pour laquelle j'ai eu le besoin de réaliser des entrées / sorties flottante, on trouve les lignes suivantes :
-
 
+
-
c:/bin/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libprintf_flt.a(vfprintf_flt.o)
+
-
                              (vfprintf)
+
 +
<code>
 +
c:/bin/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libprintf_flt.a(vfprintf_flt.o)
 +
                              (vfprintf)
 +
</code>

Revision as of 14:57, 6 February 2011

Contents

Programmation de l'Atmega 32

Edition, compilation et édition de liens

Utilisation des flottants

L'utilisation du format "%f" nécessite l'utilisation d'une bibliothèque particulière, printf_flt.a qui contient le code de la fonction vfprintf supportant les conversions flottantes. Ceci est expliqué en détail dans la description de la bibliothèque "std_lib" de la libc d'AVR (ici, dont voici un extrait :

Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). [...]

En effet, la fonction vfprintf standard (qui constitue le coeur des fonctions printf) est simplifiée de façon à occuper le moins de place possible. Aussi, si on ne substitue pas la version complète de vfprintf à la version minimaliste, l'affichage d'une valeur flottante se résume à un "?" !

Pour effectuer cette substitution, il faut modifier les options de compilation de façon à ce que :

  • la bibliothèque printf_flt.a résolve le symbole vfprintf en lieu et place de la bibliothèque standard ;
  • la bibliothèque mathématique soit chargée.

Les options à utiliser au niveau du Makefile sont les suivantes :

LDFLAGS += -uvfprintf -lprintf_flt -lm -Wl,-Map=CtrlRobot.map

Ici, l'option importante est -uvfprintf qui supprime la résolution de vfprintf de façon à ce qu'il soit résolu par la version contenue dans la bibliothèque printf_flt.

Ces options peuvent normalement être modifiées directement sous l'environnement AVR, mais je n'y suis pas parvenu...

Nota : on vérifiera dans le fichier "map" que le symbole vfprintf est bien résolu. Ainsi, dans le cas de l'application pour laquelle j'ai eu le besoin de réaliser des entrées / sorties flottante, on trouve les lignes suivantes :

c:/bin/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libprintf_flt.a(vfprintf_flt.o)
                              (vfprintf)


Transfert du programme

Le transfert du programme se fait in-situ à l'aide du programmateur USBASP et du programme Avrdude.

Personal tools