lundi 4 mars 2013

Configurer mspgcc pour code::blocks


J'imagine qu'un titre pareil vous met l'eau à la bouche. Le but de ce billet est à la base de partager comment j'ai tenté d'intégrer au mieux le compilateur mspgcc dans Code::Blocks pour utiliser mon TI launchpad (j'en ai perdu la moitié là non ?). L'objectif est double : d'une part, faire découvrir une plate-forme d'initiation à l'embarqué (monde dans lequel je mets récemment les pieds), et d'autre part montrer comment on peut paramétrer l'IDE Code::Blocks afin d'intégrer au mieux différents outils. En fait, je pense que la partie Code::Blocks peut être intéressante pour les personnes cherchant à prendre en main cet IDE, même sans travailler sur des technos embarquées. Avant toute chose, je précise que je n'ai rien d'un expert dans le domaine, je suis même plutôt l'inverse. L'idée est simplement de partager mes récentes découvertes conformément à la philosophie du blog.

Pour ceux qui connaissent déjà le compilateur mspgcc, vous pouvez aller directement à la fin pour voir ma configuration. Pour les autres, je vais profiter de ce billet pour présenter vite fait le TI launchpad et peut être vous donner envie de vous mettre à l'embarqué.

Le TI launchpad pour les poires

Pour faire simple, le TI launchpad est une petite plate-forme d'expérimentation sur les circuits intégrés de Texas Instrument (de la gamme M430G2xx pour dire des gros mots). J'ai découvert cette petite bête dans un linux magazine hors série dédié à l'embarqué. Si vous êtes intéressé par le sujet et que vous êtes néophyte, jetez y un coup d'oeil. La mise en route de l'engin y est plutôt bien décrite.

L'intérêt de ce genre de produit c'est qu'il permet de s'initier pour peu de frais à la programmation sur des micro-contrôleurs. La plate-forme ne coûte que 5 euros (prévoyez tout de même d'avoir également un fer sous la main pour souder le quartz fourni avec le Launchpad). Les circuits inclus dans le Launchpad sont relativement peu puissants mais ils contiennent ce qu'il faut pour aborder un certain nombre de concepts inhérents à l'embarqué comme les watchdogs, les timers et autres réjouissances.

Ça change quoi de coder là dessus ?

vue de haut du TI Launchpad
Le TI Launchpad
Déjà, désolé pour les javateux, mais il va falloir se mettre au C pour ce genre de machine. Et pour cause, la programmation sur systèmes embarqués a pour caractéristique de cibler des circuits peu consommateurs en énergie et disposant de ressources limitées. En l'occurence, le circuit intégré le plus puissant inclus dans le TI launchpad (le MSP430G2553, Maurice de son prénom) dispose de  512 octets (!) de RAM. Il s'agit au passage de la version 1.5 du launchpad, la version 1.4 est fournie avec un autre circuit moins puissant. Le code C est compilé grâce à un compilateur propre à la plate forme. En l'occurence, je vais parler ici de mspgcc.

Les outils

logo de code blocks
le dernier logo de C::B envoie du lourd
Je vais ici parler de Code::Blocks, mais rapidement vu que ce n'est pas vraiment l'objet de ce billet. Pour ceux qui ne connaissent pas, il s'agit d'un IDE libre pour coder en C/C++. Je le trouve relativement simple, peut être un peu trop diront certains, mais il se révèle plutôt souple dans sa configuration en fouillant un minimum. On peut notamment bien paramétrer ses compilateurs et en plus, il en supporte un certain nombre de base, dont notamment celui qui nous intéresse, mspgcc ! Cependant, ça ne compile pas pour autant sans erreur en un clin d'oeil, d'où l'idée de ce billet. Je vous conseille fortement si vous souhaitez l'utiliser de prendre les nightly builds (les dernières versions même pas encore release). Pourquoi ? Parce que les releases de Code::Blocks ont lieu... quand elles ont lieu, au bon vouloir des développeurs, ce qui fait qu'avant la dernière release (toute récente d'ailleurs), C::B était relativement limité.

Le reste des  outils se compose d'un compilateur pour pouvoir cross compiler et d'un debugger, ainsi que diverses librairies concernant notre modèle de circuit intégré. Pour les distributions linux type debian, les outils de compilation sont déjà dans les dépôts. Un petit apt-get devrait suffire pour avoir tout ce qu'il faut pour compiler :

sudo apt-get install gcc-msp430 binutils-msp430 msp430-libc msp430mcu mspdebug gdb-msp430 build-essential 

Bref, revenons à nos moutons.

Et mon Code::Blocks dans tout ça

La configuration que je vais montrer n'a rien de bien compliquée. Il s'agit plus de quelques astuces toutes bêtes mais qui permettent de mieux intégrer notre environnement de développement dans l'IDE (ce qui est le principe d'un IDE après tout :) ).

Configurer le compilateur

Dans le menu Settings -> Compiler :
  1. Sélectionner le compilateur GNU GCC for MSP430.
  2. Sélectionner l'onglet Toolchain executables.
  3. Modifier le répertoire d'installation du compilateur : pour moi /usr (par défaut il est à /usr/local/msp430). Le bouton auto-detect est votre ami.
  4. Pour le linker, mettre msp430-gcc à la place du compilateur C++.
  5. Vous pouvez en profiter pour modifier les compilers flags dans l'onglet Compiler settings : personnellement je coche warning (-Wall) et optimisation (-Os).

Configurer son projet

Je propose ici de créer un projet type. Pour cela, on part d'un bête projet console avec le compilateur msp430 ne contenant quasiment rien, éventuellement un fichier .c avec un code minimum (personnellement j'ai juste mis un programme qui fait clignoter les LEDs du launchpad).

Tout se passe dans les propriétés du projet. Je présente ici comment configurer tout ça sans faire de makefile personnalisé.

  1. Dans  C/C++ parser option, rajouter le dossier d'include : dans mon cas /usr/msp430/include
  2. Dans build target, mettre Type a Native 
Ensuite dans les Project build options (accessibles depuis les paramètres du projet ou directement avec clic droit sur le projet). On paramètre ici le compilateur avec des caractéristiques propres à notre projet qui va se rajouter à la configuration générale faite précédemment.


  1. Dans Compiler settings -> Other option, rajouter le modèle de la puce avec l'option mmcu. Dans mon cas ça donne -mmcu=msp430g2553.
  2. une belle compilation sans douleur avec mspgcc
  3. De même dans Linker settings, rajouter l'option mmcu dans Other linker options.
Et pour terminer en beauté, cliquer sur File -> save project as template. Comme ça pas besoin de refaire toutes les manip à chaque fois ! Vous pouvez créer un projet identique depuis ce template quand vous voulez.

Le petit bonus de la fin

Tout ça c'est bien beau mais on peut toujours pas flasher notre puce pour envoyer notre programme dessus. La fonctionnalité que je vais présenter peut être utilisée de plein d'autres manières, et n'a rien à voir avec mspgcc finalement mais j'ai trouvé ça bien utile.

Aller dans le menu Tools -> Configure tools. En cliquant sur add, on arrive sur un menu tout bête qui permet de créer des commandes appelées directement depuis Code::Blocks.
Je vous laisse regarder ma configuration :

Grâce à ces quelques lignes, je peux aller dans Tools, et lancer l'upload du code directement depuis code blocks. Pas grand chose au final mais c'est le genre de détail qui permet d'intégrer au mieux les outils mspgcc dans C::B. 

Conclusion

J'ai bien conscience que ma configuration est probablement loin d'être optimale. Elle a cependant le mérite de marcher pour le (très) peu de fois où je l'ai utilisé. Si jamais un ami lecteur a une meilleure façon de faire je suis preneur. Dans tous les cas, n'hésitez pas à regarder un peu du côté du TI Launchpad ou autre plate-forme pour l'embarqué. Ça change du java habituel et ça permet de revenir aux sources du développement (notez le jeu de mot sur source :) ). Les commentaires sont bien entendus les bienvenus pour toute question qui vous viendrait à l'esprit (sur le billet ou sur les poires).

3 commentaires: