[Résolu] Intégration du langage Arduino dans AVR Studio 5

Oui et aussi -ffunction-sections et -fdata-sections.
Il y a un truc que je ne vois absolument pas et si ça se trouve c'est ENORME visible comme le nez au milieu du visage mais je.....ne.....vois......rien.

C'est pour cela que je cherche à avoir la confirmation que quelqu'un a réussit. Si j'ai cette confirmation ce sera la preuve que c'est possible et que c'est moi qui me débrouille comme un pied.

Désolé, je viens de rentrer d'une semaine au soleil du midi.

Demain, j'essayerai une comparaison de taille du fichier hex avec l'ide et avec Studio.

Merci à Mitchbzh pour le rapport de l'essai avec l'IDE 1.0

Voici la comparaison de la compilation d'un programme avec Studio 5 (à gauche) et l'IDE Arduino (à droite). Le programme utilise la librairie OneWire et la transmission série pour afficher dans le terminal la T° d'une sonde DS18b20.

On voit donc (si on a des yeux comme des loupes) que le programme fait 5760 bytes dans Studio et 5838 bytes dans l'IDE.
Conclusion:

  • 1° pas de grosse différence entre l'IDE et Studio
  • 2° le Serial.begin n'entraîne pas d'augmentation de 10K

J'imagine qu'une telle augmentation signifie que toutes les fonctions de la librairie sont compilées en fichier .hex

En supprimant tous les appels à Serial, la compilation dans Studio donne 2344 bytes. Autrement dit, les appels à Serial me coûtent 5760 - 2344 = 3416 bytes.

Hi,
with the AVR Studio release 5.1, Atmel has corrected the problem of the linker. No longer required changing the makefile to move the options -Wl,-lcore -Wl,-lm after $(LIBS).

greetings
QP

QuercusPetraea:
Hi,
with the AVR Studio release 5.1, Atmel has corrected the problem of the linker. No longer required changing the makefile to move the options -Wl,-lcore -Wl,-lm after $(LIBS).

greetings
QP

Thank you so much, QuercusPetraea.
That's a great news.

I translate your message in French.

Pour les francophones: QuercusPetraea nous avertit qu'avec la nouvelle version de Studio 5.1, Atmel a corrigé le problème du LINKER. Il n'est désormais plus nécessaire de changer le makefile pour déplacer les options -Wl,-lcore -Wl,-lm à la fin de la ligne.

Une belle épine hors du pied.

Jean-Marie:
Pour les francophones: QuercusPetraea nous avertit qu'avec la nouvelle version de Studio 5.1, Atmel a corrigé le problème du LINKER. Il n'est désormais plus nécessaire de changer le makefile pour déplacer les options -Wl,-lcore -Wl,-lm à la fin de la ligne.

Une belle épine hors du pied.

Avr studio 5.1 ... arg! Je vais devoir encore télécharger +350Mo :stuck_out_tongue_closed_eyes:
Il faut vraiment qu'ils ajoutent une fonction de mise à jour auto dans avr studio !
Le truc "check for update" qui redirige sur la page de téléchargement c'est ch*ant ...

Tu as raison, Skywodd, j'ai refait deux fois "check for update" car je ne trouvais pas à lancer un upgrade. Finalement, je me suis résolu à recharger tout. Mais il faut se réenregistrer. Ensuite, ils disent qu'ils envoient un mail... Je l'attend toujours depuis hier soir....

Salut à tous,
Merci particulièrement à Jean-Marie et Skywood...

Je viens de suivre la discussion et les explications pour développer mes sketch Arduino dans avrstudio 5.1 avec une base Arduino IDE 1.0.

Pour la procédure de compilation, pas de problème. (pour l'instant, je n'ai fait que des test simples sans librairies externes, mais je suis confiant...).
Par contre, j'ai eu du mal à programmer la carte Arduino par avrdude. Là, par contre, ça n'a pas marché.
J'ai édité la ligne d'upload via avrdude utillisée par l'IDE 1.0, que j'ai appliqué avec succès à mon installation.

L'outils externe permettant l'upload doit être paramétré comme suit :
Remarque : chez moi,

  • l'IDE Arduino 1.0 est installé dans le dossier : D:\electronique\arduino\arduino1.0 . Il faudra donc remplacer ce chemin par celui de votre installation - à noter que le fait que les chemins ne contiennent pas d'espace est une source de problème en moins :grin:
  • le port série utilisé par l'arduino est COM5

titre: 1. Programmer Arduino (là, on met ce qu'on veut XD)
Commande: D:\electronique\arduino\arduino1.0\hardware\tools\avr\bin\avrdude.exe
Arguments: -CD:\electronique\arduino\arduino1.0\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\.\COM5 -b115200 -D -Uflash:w:"$(ProjectDir)Debug$(ItemFileName).hex":i

Utiliser la fenêtre de sortie est coché ainsi que Fermer en quittant (grisé mais coché).

Et voilà... comme ça, ça marche !

Il ne resterait plus qu'à trouver comment créer une sorte de template Arduino pour préremplir les options et les chemins du compilateur et du linker pour éviter d'avoir à le faire pour chaque projet, et on sera les rois du pétrole.

Merci encore pour ce travail complet et laborieux.

A+
Olivier

Il ne resterait plus qu'à trouver comment créer une sorte de template Arduino pour préremplir les options et les chemins du compilateur et du linker pour éviter d'avoir à le faire pour chaque projet, et on sera les rois du pétrole.

Je suis en train d'y travailler car je suis un peu fleimard et j'ai pas envie de me taper la config à chaque fois. De plus je ne souhaite pas utiliser les fonctions setup() et loop() du coup je suis en train de me faire un makefile de compilation qui compile le lib core d'arduino sans le main et je vais m'occuper de la compile des libraries afin d'obtenir des lib statique (fichier .a) afin de pouvoir les intégrer automatiquement dans un projet et de générer par la suite un template à intégrer dans AVR STUDIO. Je vais essayer de faire en sorte de pouvoir choisir au moment de la compile de toutes les lib si l'on souhaite une compile pour processeur ATMEGA328P (Uno, Nano, etc..) ou ATMEGA2560 (Arduino mega) en tenant du fichier pins_arduino.h de façon automatique.

Je vous tiens au courant de l'avancement de tout ceci.

Super, les gars. Excellentes idées.
Vous avez tous mes encouragements. Rendre Arduino et Studio transparents l'un pour l'autre ouvre sans doute des horizons insoupçonnés.

Vivement que cela soit plus simplifié.

Tu as fais un super taff Jean-Marie.

J'essaierais AVR Studio 5 un de ces 4 :slight_smile:

Bonjour

En ayant un peu marre de l'IDE Arduino qui ne sait pas gérer des libs proprement et envisageant d'investir dans un debugger AVRdragon je viens d'installer AVRStudio.

Par contre j'ai voulu choisir une approche différente, c'est à dire bénéficier à 100% de la gestion de Solutions Multi-Projets de VisualStudio avec la gestion des bibliothèques.
Ainsi ma première tentative est de vouloir regénérer la lib Core Arduino depuis AVRStudio au lieu de récupérer une version pré-compilée comme Jean-Marie le propose.

Pourquoi ? Pour plusieurs raisons :

  1. Pour pouvoir facilement re-compiler sous plusieurs configurations : ATMega128, 328, 2560, 8MHz, 16MHz, 20MHz, .... qui seront liées au projet principal
  2. Pour homogénéïté car le principe de mélanger une lib compilée avec un certain GCC et un programme avec un autre, il y a des risques.

D'ailleurs je tombe immédiatement sur un OS en recompilant la lib Core car le fichier "util/delay.h" fournit avec AVRStudio n'est pas le même que celui fournit l'Arduino.
Le premier est plus récent comme nous l'indique l'en-tête :
AVRStudio util/delay.h : /* $Id: delay.h.in 2189 2010-10-13 09:39:34Z aboyapati $ /
Arduino util/delay/h : /
$Id: delay.h,v 1.5 2007/10/28 23:25:56 joerg_wunsch Exp $ */

De même, et c'est là où le bas blesse, le premier étant plus propre fait des arrondis à partir de fabs() et ceil() que ne fait pas le 2nd.
Et la compil signale fonctions non déclarée.

J'envisage 2 approches possibles :

  1. Modifier le projet AVRStudio pour utiliser les mêmes H et Lib que Arduino
  2. Modifier les sources Arduino pour fonctionner avec AVRStudio en natif.

Qu'en pensez-vous ?
La 1ère solution a l'inconvénient de nouveau mélanger ensemble des éléments de génération différentes.
La 2nde solution me parait plus propre.
Mais qu'en est-il de la compatibilité future ?
Si je travaille sur des sketches de la communauté ou si je partage mon travail, n'y a t'il pas un risque ?

Mais j'en ai vraiment marre de cet IDE qui n'en est pas un.
Même Turbo C 1.0 sous DOS était plus évolué et savait gérer des libs proprement.

Bon j'ai réussi à refaire blink !

Etape 0 : Installation de AVRStudio 5.1 de base sans se poser plus de question

Etape 1 : Recréation de la lib Arduino Core sous AVR Studio.

  • J'ai recréé un nouveau projet ArduinoCore de type "AVRGCC C++ Static Library Project" en choissant le bon processeur (ATmega328P)
  • J'ai ajouté tous les sources de la lib core -> AVRStudio a copier tous les sources dans le répertoire du projet
  • J'ai copier manuellement le répertoire "variants" sous le répertoire du projet
  • Modif de Plateform.h pour ajouter un #include "math.h" avant #include "util/delay.h"
  • J'ai effectué les modifs suivantes dans la configuration du projet :
    AVG/GNU C Compiler
  • Symbols : définir F_CPU=16000000UL et ARDUINO=100
  • Directories : ajouter en chemin relatif le répertoire du projet (..) ainsi que le répertoire standard (../variants/standard)
  • Optimisations : size (-Os) -fdata-sections et -ffunction-sections
  • Warnings : All (-Wall)
    AVG/GNU C++ Compiler
    Idem mais en plus :
  • Miscellaneous : -fno-exceptions

Et hop ca compile et ca crée libArduinoCore.a
On ferme la solution

Etape 2 : Projet blink

  • Créer un projet Blink de type AVRGCC C++ Executable Projet
    --> crée automatiquement un fichier blink.cpp avec un main. On vire tout et on met à la place setup() et loop(). On précède le tout d'un #include "Arduino.h"
#include "Arduino.h"
#define LED		13
void setup()
{
	pinMode( LED, OUTPUT );
}
void loop()
{
	digitalWrite( LED, HIGH )	;
	delay( 500 );
	digitalWrite( LED, LOW )	;
	delay( 500 );
}
  • J'ai effectué les modifs suivantes dans la configuration du projet :
    AVG/GNU C Compiler
  • Symbols : définir F_CPU=16000000UL et ARDUINO=100
  • Directories : ajouter en chemin relatif le répertoire du projet (..) ainsi que le répertoire standard (../variants/standard)
  • Optimisations : size (-Os) -fdata-sections et -ffunction-sections
  • Warnings : All (-Wall)
    AVG/GNU C++ Compiler
    Idem mais en plus :
  • Miscellaneous : -fno-exceptions
    AVG/GNU C++ Linker
  • libraries : files : ajouter libArduinoCore.a
  • libraries : directory : ajouter le répertoire Release situé sous le projet de la lib
  • Optimization : cocher Garbage collect ... (-Wl,--gc-sections)
  • Miscellaneous : ajouter -lm

Et hop ca compile et ca génère blink.hex

Etape 3 : Upload

je me suis pas embeté, j'ai repiqué depuis l'IDE Arduino la ligne de commande avrdude que j'ai collé dans un fichier bat. Pas encore regardé si je pouvais intégrer cela à AVRStudio dans le projet

Bon ben maintenant y' plus qu'a passer aux autres libs et essayer des exemples plus complets.

Bravo Barbudor,

Je n'ai plus pour le moment de platine d'expérimentation configurée en Arduino car je suis sur un projet différent sur ATTiny2313 et en assembleur (que je mettrai à la disposition de tous dès qu'il sera finalisé), sinon j'aurais essayé de suivre tes indications dans la recompilation d'un nouveau core et des projets Arduino.

En tout cas, félicitations ! Ceci ressemble à un pas important vers l'ouverture du monde Arduino au monde plus général des AVR, tout en conservant l'avantage du travail Arduino déjà accompli.

EDIT : Je viens de rajouter la seule modif de code que j'ai du appliquer dans Plateform.h (ajout d'un include).

Jean-Marie,

Pour revenir à il y à qq posts déjà concernant l'utilisation d'AVR Studio, j'entame ma première appli avec: un cube 4X4X4

On va voir si le mode d'emploi est clair ;))
Merci pour ton travail
Gerse

Hello Gerse,

Aïe, aïe, aïe. C'est toujours un moment de vérité.
Ceci dit, si ça coince, c'est le signe qu'il y a des oublis, des imprécisions ou des erreurs à corriger. Donc, on s'y remettra.

Hello,
J'ai repris le dernier post de Barbudor car je suis d'accord avec son analyse: Autant se refaire une lib et puis basta! (voir peut etre la partager ou encore plus simple exporter le projet core)

... Et je blink aussi :wink: yes!

J'ai installé la partie avrdude dans Studio. j'ai pas mal galéré car je n'ai pas trouvé la syntaxe de la version 5.11 (Arduino-1.0)
j'ai donc repris la version 5.4 (Arduino-022)
Donc pour installer le flasheur c'est simple:

Dans AVRStudio
Tools / External Tools

->un formulaire s'affiche

Title : Au hasard AVRDude
Command: le full pathname de la commande avrdude
Arguments: Attention là j'ai fait bourrin:
-C FullPathNameDeAvrdude.conf -p leDevice -c leProgrammer -P lePortUsb -b laVitesse -D -U memtype:w:$(ProjectDir)Debug$(ItemFileName).hex":i
Ce qui donne pour moi:
-C F:\Arduino\arduino-0022\hardware\tools\avr\etc\avrdude.conf -p atmega328p -cstk500v1 -P\.\COM5 -b115200 -D -U flash:w:"$(ProjectDir)Debug$(ItemFileName).hex":i

Cocher la case Use Output Window pour voir ce qu'il dit dans le poste!
la trace du programme blink en bas de post
On n'oublie pas de sauver

Maintenant il y a un item AVRDude dans tools.

Je pense que l'on doit pouvoir faire + paramétrable en particulier pour indiquer le repertoire du .hex (mais là j'en ai marre!)
Par contre pour le port USB il faut s'astreindre à brancher l'arduino toujours sur le même port (ce qui n'est pas terrible pour moi d'autant que Arduino-1.0 le détecte automatiquement!)

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e950f
avrdude.exe: reading input file "F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\Debug\blinkblink.hex"
avrdude.exe: writing flash (1142 bytes):

Writing | ################################################## | 100% 0.20s

avrdude.exe: 1142 bytes of flash written
avrdude.exe: verifying flash memory against F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\Debug\blinkblink.hex:
avrdude.exe: load data flash data from input file F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\Debug\blinkblink.hex:
avrdude.exe: input file F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\Debug\blinkblink.hex contains 1142 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.16s

avrdude.exe: verifying ...
avrdude.exe: 1142 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

j'ai fait la (presque) même chose en utilisant un fichier bat à la racine mon repertoire arduino :

upload-uno.cmd:

set ARDUINODIR=%~dp0
set AVRTOOLSDIR=%ARDUINODIR%\hardware\tools\avr
echo Arg1=%1
%AVRTOOLSDIR%\bin\avrdude -C%AVRTOOLSDIR%/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM1 -b115200 -D "-Uflash:w:%1:i"

Ma config tools est :

Title : Upload to UNO
Command : D:\Projets\tools\arduino-1.0\upload-uno.cmd
Argument : $(TargetName)
Initial Dir : $(TargetDir)
Use Output Window coché

Et le résultat est :

C:\Program Files (x86)\Atmel\AVR Studio 5.1>set ARDUINODIR=D:\Projets\tools\arduino-1.0\ 
C:\Program Files (x86)\Atmel\AVR Studio 5.1>set AVRTOOLSDIR=D:\Projets\tools\arduino-1.0\\hardware\tools\avr 
C:\Program Files (x86)\Atmel\AVR Studio 5.1>echo Arg1= 
Arg1=
C:\Program Files (x86)\Atmel\AVR Studio 5.1>D:\Projets\tools\arduino-1.0\\hardware\tools\avr\bin\avrdude -CD:\Projets\tools\arduino-1.0\\hardware\tools\avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM1 -b115200 -D "-Uflash:w::i"

On voit que dès le début le "Current dir" visible dans le prompt n'est pas le bon.
Et que le "echo Arg1=%1" ne renvoie rien
Donc le passage de $(TargetName) et $(targetDir) ne fonctionne pas !

Zut

Effectivement toutes les variables ne sont pas enseignées en particulier les Targets.
Il doit manquer un lien entre la compilation du projet et l'execution des tools, mais je n'arrive pas à (encore^^) voir ou ca se passe.

ItemPath="F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\blinkblink.cproj"
ItemDir="F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\\"
ItemFileName="blinkblink"
ItemExt=".cproj"
BinDir=""
ProjectDir="F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\blinkblink\\"
ProjectFileName="blinkblink.cproj"
SolutionDir="F:\Program Files\Atmel\AVRStudio 5.1\blinkblink\\"
SolutionFileName="blinkblink.atsln"
TargetPath=""
TargetDir=""
TargetName=""
TargetExt=""

A noter le double / à la fin de certains path: Un bug de dev ou la variable qui ne s'initialise pas ?