[RESOLU] Eclipse et embompoint avec Serial.begin

Merci Skywood
Tu ne sais pas encore pourquoi mais tu vas vite comprendre. :grin:

Cette discussion :http://arduino.cc/forum/index.php/topic,108208.30.html et particulièrement

CFLAGS -> arguments pour le compilateur (avr-gcc)
LDFLAGS -> arguments pour le linker (ld)
(C'est la syntaxe classique pour les makefiles, tout coller à la suite dans la ligne de commande avr-gcc ça marche aussi normalement)

m'a mis sur la voie.

Je ne savais pas que le configurateur "-Wl,--gc-sections" était lié au linker, ni réellement à quoi il servait. Je faisais comme il est indiqué partout : je le plaçais dans la ligne avr-gcc et avr-g++.
A la suite de ton intervention je me suis dis qu'il serait peut-être intéressant de le déplacer dans la rubrique avr-C++ linker.
Et cela fonctionne même en retirant toutes traces de "Wl,--gc-sections" des configurations des compilateurs avr-gcc et avr-g++.

Conclusion : Pour qu'Eclipse prenne ce configurateur en compte il faut absolument qu'il soit placé dans la configuration propre au linker.

Ce qu'il faut faire :

Dans les configurations des compilateurs C et C++ il faut ajouter "-ffunction-sections et -fdata-sections"
Ne pas mettre "Wl,--gc-sections" à la suite comme il est écrit partout : cela n'est pas pris en compte.

Dans la configuration du Linker
Avr-C++ Linker --> General --> Other argument il faut ajouter "-Wl,--gc-sections"

J'approfondi encore le sujet et dès que j'ai le temps je fais un tuto "Comment développer avec les Librairies Arduino avec Eclipse sur toutes les plateformes (Windows, Linux, MacOSX) pour concurencer (amicalement bien sûr :grin:) Jean-Marie qui à privilégié les seuls utilisateurs de Windows.

68tjs:
Merci Skywood
Tu ne sais pas encore pourquoi mais tu vas vite comprendre. :grin:

Heu ... pas de quoi :grin:

68tjs:
Conclusion : Pour qu'Eclipse prenne ce configurateur en compte il faut absolument qu'il soit placé dans la configuration propre au linker.[/b]

Je me permet une petite quote de la doc officiel de avr-gcc :
http://nongnu.org/avr-libc/user-manual/using_tools.html

-Wa,assembler-options
-Wl,linker-options

Pass the listed options to the assembler, or linker, respectively.

-Wa,xxxx passe l'argument xxxx à avr-as (l'assembleur pour avr)
-Wl,xxxx passe l'argument xxxx à avr-ld (l'éditeur de lien)
Ce sont donc des arguments pour le compilateur avr-gcc ou avr-g++.
Normalement en passant des arguments via ces deux switch à avr-gcc ou avr-g++ ce ci sont transmit par la suite à avr-as et avr-ld.

Ma théorie sur le sujet (je doit pas être loin de la vérité) :
Eclipse compilent les fichiers elf, les assemblent, puis les link par lui même via le makefile crée pour le projet.
Ces switch ne sont donc jamais passé à avr-as / avr-ld comme il devrait l'être vu que ces deux utilitaires ne sont pas appelé.
Si on ne spécifie pas les arguments de linker / assembleur à eclipse ce ci ne sont pas ajouté au makefile -> ignoré.
(ça doit être une histoire dans le genre à mon avis)

Entre ce qui devrait être fait si toutes les règles étaient respectées et ce qui est fait réellement il y a souvent un monde.

Je pense que le sujet est plus général parce que les "symptômes" étaient les mêmes avec Eclipse et Code::Blocks.
Je n'ai pas encore vérifié avec Code::Blocks, je le ferais plus tard.

En plus d'un meilleur éditeur et d'un détecteur d'erreurs bien plus compréhensible, très utile pour quelqu'un qui n'est pas très à l'aise en programmation, Eclipse m'a apporté une information non prévue : les remarques TODO et XXX apparaissent dans un onglet ce qui permet de voir qu'un certain nombre de fonctions du core arduino sont identifiées comme devant être améliorées pour lever des limitations.

Yep!

Même si le vocabulaire ici employé m'est familier, je suis trés loin d'en connaitre les arcanes.

Tout çà pour dire qu'un tuto sur code::blocks, je suis preneur...

@+

Zoroastre.

zoroastre:
Tout çà pour dire qu'un tuto sur code::blocks, je suis preneur...

Tu devrais t'intéresser un peu à eclipse :wink:
Code::blocks c'est sympa, simple et tout, mais niveau fonctionnalité "utile" c'est un peu (beaucoup) léger.

Et en plus il ya un support trés actif de eclipse pour le "core arduino" :grin:
http://arduino.cc/playground/Code/Eclipse

Sauf que le tuto officiel arduino il marche pas --> pb de linker Wl,--gc-sections.
Et le lien pour le plug-in "avr-eclipse" pointe sur une version qui n'est pas à jour, comme dab avec le playground ]:D.

La meilleure info que j'ai trouvé c'est sur :

Il faut naviger un peu dans le site.

A l'exception près du cas du linker ]:D.

Eclipse s'est bien mais ça fait tout (Java, C/C++, PHP, etc....) et ce n'est pas simple de s'y retrouver.
Code::Blocks lui ne fait que du C/C++ et est donc simple. Perso je préfère mais comme je venais de trouver le lien arrizza je suis repassé à Eclipse, maintenant je vais re-essayer Code::Blocks en appliquant les mêmes réglages.

Autre point :
Avec Code::Blocks j'ai découvert qu'il y a plusieurs présentation pour le fichier *.lss
a) liste sans commentaires
b) dans le listing les blocs correspondant aux fonctions sont repérés par des commentaires, le fichier est plus gros mais plus comprenhensible (enfin moi je me limite à compter les cycles d'horloge parce que le reste je n'y comprends rien)

Reprise des tests avec Code::blocks
Plutôt que de récupérer le "core.a" créé par l'IDE arduino j'ai voulu le compliler moi-même comme je l'avais fait avec Eclipse, hélas j'obtients ces messages d'erreurs avec les mêmes chemins pour les fichiers inclus :

-------------- Build: Debug in ard101_328CB ---------------

Compiling: ../../../../../usr/share/arduino/hardware/arduino/cores/arduino/CDC.cpp
In file included from ../../../../../usr/share/arduino/hardware/arduino/cores/arduino/Platform.h:6:0,
                 from ../../../../../usr/share/arduino/hardware/arduino/cores/arduino/CDC.cpp:19:
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1067:26: error: ‘uint_farptr_t’ was not declared in this scope
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1068:27: error: ‘uint_farptr_t’ was not declared in this scope
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1068:53: error: expected primary-expression before ‘len’
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1068:58: error: expression list treated as compound expression in initializer [-fpermissive]
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1069:37: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1070:37: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1071:38: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1072:37: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1073:38: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1074:38: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1075:39: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1076:40: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1077:43: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1078:44: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1079:41: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1080:38: error: ‘uint_farptr_t’ has not been declared
/usr/lib/gcc/avr/4.7.0/../../../avr/include/avr/pgmspace.h:1081:36: error: ‘uint_farptr_t’ has not been declared
Process terminated with status 1 (0 minutes, 0 seconds)
17 errors, 0 warnings

Là je cale.

PS Avec Eclipse j'ai observé une différence de taille impressionnante entre le core.a créé par IDE1.01 et la librairie statique obtenue avec eclipse -> fichier joint

Comparaison_librairie_statique_arduino_eclipse.pdf (214 KB)

68tjs:
PS Avec Eclipse j'ai observé une différence de taille impressionnante entre le core.a créé par IDE1.01 et la librairie statique obtenue avec eclipse -> fichier joint

Tu as utilisé gc-sections, donc seul les morceaux de code que tu utilise vraiment sont conservé -> réduction de taille impressionnante.

Je ne suis pas sur qu'on se comprenne : c'est une librairie statique, il n'y a pas de main.cpp dans le projet.
Eclipse fait :

  • compilation de tous les fichiers *.c et *.cpp -> donc on obtient que des fichiers objets *.o
  • ensuite création de la librairie statique avec "avr-ar -r" comme le fait l'IDE Ard1.01.

Il n'y a pas de programme, donc il n'y a pas d'édition de liens et donc aucune possibilité de savoir ce qui sera utilisé ou pas.
De plus avec Eclipse certains fichiers objets sont plus volumineux qu'avec IDE Ard1.01 !

68tjs:
De plus avec Eclipse certains fichiers objets sont plus volumineux qu'avec IDE Ard1.01 !

C'est probablement parce qu'il n'utilise pas le même niveau d'optimisation lors de la compilation.

Perso j'utilise AVRStudio avec "optimise for size" coché. Je ne me souviens plus à quelle option de gcc ça correspond.
(j'utilise aussi d'autres options de compilation pour optimiser la taille du code final, dont -Wl et –gc-sections, mais ce sont plus des options du linker que du compilateur proprement dit).

-Os est coché.
Les options pour avr-gcc :
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -I"/hc/IDE/Eclipse/W_328/ard101_328" -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -v -mmcu=atmega328p -DF_CPU=16000000UL

Celles pour avr-g++ :
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -I"/hc/IDE/Eclipse/W_328/ard101_328" -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -funsigned-char -funsigned-bitfields -fno-exceptions -v -mmcu=atmega328p

Je reviens à ma remarque de départ :
Comment peut bien faire Eclipse (ou mal faire Arduino) pour avoir une librairie statique de 70KO alors qu'arduino en fait une de 280KO de plus avec la plus-part des fichiers objets légèrement plus petit ?

Le doute caché dessous cette remarque est : est-ce que la lib statique eclipse est bien complète ?

J'ai du mal à comprendre les arcanes du fichier lss, je le met en PJ pour le cas où il intéressera quelqu'un.

@patg_
Avec AVR-Studio as tu régénéré la lib statique arduino ? Si oui quel est son poids ?
comme je n'ai pas windows je ne peut pas essayé.

libard101_328.lss (248 KB)

68tjs:
@patg_
Avec AVR-Studio as tu régénéré la lib statique arduino ? Si oui quel est son poids ?
comme je n'ai pas windows je ne peut pas essayé.

Non je ne l'ai pas régénérée.
J'ai fait simple en suivant le tutoriel orginel de Engblaze (compil dans l'IDE Arduino puis copie et renommage de la lib Arduino).
J'essaierai peut-être quand j'aurai terminé mon projet en cours mais pour l'instant ça me convient comme ça.