Go Down

Topic: La programmation objet est-elle plus gourmande en place (Read 4485 times) previous topic - next topic

boubil

Bonjour

Pour mon projet alarme/domotique j'ai bcp d'entrée à gérer / des scénario /... et venant du monde de l'informatique, c'est tout naturellement que j'imagine une architecture applicative objet.

Ca permet d'avoir un code bien plus facile  à écrire et à maintenir.

Mais quel est l'impact sur la taille du programme ? Est ce que c'est plus gourmand / moins rapide ? Est ce qu'il y a des choses à faire / pas faire ?
Ou puis-je trouver des infos sur les bonnes pratiques de codage pour l'arduino ?

Merci d'avance

68tjs

Note d'application sur le site Atmel ->  AVR035   Efficient C Coding for AVR


patg_

Bonjour,
Moi aussi j'ai plutôt tendance à développer en C++ qu'en C très bas niveau.
Je ne suis pas un expert de l'optimisation mais je me contente de ce genre de paramétrage du compilateur/linker d'Atmel Studio:

Compilateur C++:
Optimize for size (-Os)
Other optimization flags: -fdata-sections
Prepare functions for garbage collection (-ffunction-sections)
Pack Structure members together (-fpack-struct)
Allocate only as many bytes needed by enum types (-fshort-enums)


Linker:
Garbage Collect Unused Sections (-Wl, --gc-sections)

Mes Arduineries: http://breizhmakers.over-blog.com/

boubil

Merci pour ces infos.
J'ai oublié de préciser que je découvre c++, jusqu'à maintenant je faisais plutot du java / php / ... c'est assez bien différent.

Donc je comprends que vous utilisez Atmel Studio pour développer.
Je viens de trouver un tuto qui à l'air pas mal : http://breizhmakers.over-blog.com/pages/tutoriel-developpement-arduino-avec-avr-studio-5-1-7556975.html



68tjs

Quote
Donc je comprends que vous utilisez Atmel Studio pour développer.

Pas obligé, Eclipse, Code::blocks et Netbeans conviennent aussi et eux tournent sous OS pingouin.
Il suffit de trouver les plugins qui vont bien avec un moteur de recherche.

patg_

#5
Jul 09, 2013, 12:34 pm Last Edit: Jul 09, 2013, 12:40 pm by patg_ Reason: 1

Merci pour ces infos.
J'ai oublié de préciser que je découvre c++, jusqu'à maintenant je faisais plutot du java / php / ... c'est assez bien différent.

Donc je comprends que vous utilisez Atmel Studio pour développer.
Je viens de trouver un tuto qui à l'air pas mal : http://breizhmakers.over-blog.com/pages/tutoriel-developpement-arduino-avec-avr-studio-5-1-7556975.html


C'est le tuto que j'ai traduis  :smiley-mr-green:
J'en ai une version en cours d'adaptation pour Atmel Studio 6 mais j'ai pas encore terminé. Mais les réglages sont les mêmes.
J'utilise juste maintenant MegunoLink http://www.blueleafsoftware.com/Resources/EmbeddedSand/MegunoLink pour transférer le code dans l'Arduino car il gère mieux l'Arduino Leonardo (c'est plus simple).
J'ai un peu de mal avec l'IDE Arduino qui est très rudimentaire. J'aime bien Atmel Studio mais le choix d'un IDE c'est généralement très subjectif.
L'essentiel c'est d'activer les bonnes options de compilateur et du linker pour optimiser à la fois la phase de compilation et ne pas embarquer le code non-utilisé dans le binaire final.

Moi je suis revenu au C++ avec l'Arduino. J'en n'avais quasiment pas refait depuis ma sortie de l'école d'ingé il y a 17 ans, j'étais donc aussi assez rouillé (je pratique plutôt Java au quotidien).
Mes Arduineries: http://breizhmakers.over-blog.com/

boubil

patg_ c'est vraiment sympa de mettre ces traductions à dispo. Je maitrise bien la langue de Shakespeare mais c'est quand même plus confortable dans la langue de molière !

Se remettre au C++ pour l'arduino c'est plus motivant que pour faire des TP en école d'ingé même si c'est 20 ans plus tard ;-)

Sur Eclipse ça marche bien ? Par ce que ça m'arrangerais bien, je suis dessus tant pour java que pour PHP donc je maitrise à peu près bien.
Autant ne bouleverser une seule chose à la fois :-)

Oui l'IDE de l'arduino est rudimenaire. En même temps, c'est plutôt une bonne chose pour ceux qui démarrent, et encore plus quand ils ne viennent pas du monde de l'informatique. Configurer tout un env de dev ca peut faire peur la première fois.


68tjs

Quote
Sur Eclipse ça marche bien ?

Je suis électronicien et programmeur du dimanche et j'ai trouvé çà :
http://www.arrizza.com/cgi-bin/pub?CreateArduinoStaticLibrary
http://www.arrizza.com/cgi-bin/pub?CreateArduinoGenericProject
http://www.arrizza.com/cgi-bin/pub?CreateArduinoLedBlink
http://www.arrizza.com/cgi-bin/pub?ArduinoHowTo

Le seul "truc" c'est que "normalement parait-il" on peut passer au compilateur les options destinés au linker et il fait suivre mais là ce n'est pas le cas il faut bien mettre les options pour le compilateur avec le compilateur et celle pour le linker avec le linker.

J'ai aussi quelques soucis quand je veux utiliser une bibliothèque "à la mode arduino" j'ai bloqué sur la gestion I2C avec Wire, mais bon programmeur du dimanche.

patg_

Moi je suis informaticien et électronicien du Dimanche (et du Samedi parfois aussi)  ;)
Je passe mes journées sur Eclipse, et je ne veux surtout pas le retrouver le soir à la maison! (Je suis très partagé sur les qualités d'Eclipse).

Y'a de la doc, mais j'ai pas essayé. J'utilise aussi l'IDE Arduino pour des projets très simples, principalement pour essayer des trucs. Il lui manque des trucs essentiels pour le rendre vraiment sympa pour les néophytes, tels que le code-assist par exemple.
Pour les deux projets un peu conséquents que j'ai faits, j'ai utilisé Atmel Studio. J'ai un projet terminé, deux en cours et au moins un autre en tête. Mais je manque de temps libre et actuellement j'ai pas trop envie de me remettre à optimiser mon algorithme de pilotage de camion après une journée à débugguer du code Java.

Pour en revenir au sujet, on trouve pas mal de docs concernant les techniques d'optimisation du code, hormis les settings du compilo. J'ai plus les référence sous la main.
Mes Arduineries: http://breizhmakers.over-blog.com/

Tealcoune

le mieux pour optimiser le code c'est de repasser en bas niveau.. ^^.. (assembleur ou binaire pour ceux qui intime avec) ..
pour ma part j'ai travailler qu'avec l'ide arduino .. lol..

avec eclipse j'ai pas voulue tester.. (déjà obliger de l'utiliser au boulot :(...)

j'utilise beaucoup netbeans (pour le php et Java)  .. et j'ai vue que la communauté avec sortie un module arduino mais pas tester..
Aimez la Vie, mais preferez la Mort, car seulement celle-ci vous liberera des tenebres de la Vie.

fdufnews

Ma pierre à l'édifice.
Un petit exemple, 2 programmes qui lisent quelques entrées logiques et retournent un message sur la console si le bouton est appuyé.
EssaiBoutonsSimple
Code: [Select]
#define NUMBOUTON 5
byte boutons[NUMBOUTON]= {2, 3, 4, 5, 6};
byte index=0;

void setup(void){
  for (int i=0;i<NUMBOUTON;i++){
    pinMode(boutons[i],INPUT);
    digitalWrite(boutons[i],HIGH); // active pullup
  }
  Serial.begin(9600);
}

void loop(void){
  byte etat= digitalRead(boutons[index]);
  if (etat==0){
    Serial.print("Pin ");
    Serial.print(boutons[index]);
    Serial.println(" on");
  }
  index++;
  if (index>NUMBOUTON){
    index=0;
  }
}


EssaiBoutonsObjet
Code: [Select]

class bouton{
  byte pinBouton;
 
  public:
    bouton(byte);
    boolean getState(void);
    byte getPin(void);
 
};

  bouton::bouton(byte pin){
    pinMode(pin,INPUT);
    digitalWrite(pin,HIGH); // active pullup
    pinBouton=pin;
  }
 
  boolean bouton::getState(void){
    return(digitalRead(pinBouton)==0);
  }

  byte bouton::getPin(void){
    return(bouton::pinBouton);
  }

#define NUMBOUTON 5
byte index=0;

bouton tabBouton[NUMBOUTON]={bouton(2), bouton(3), bouton(4), bouton(5), bouton(6)};
void setup(void){
  Serial.begin(9600);
}

void loop(void){
    if (tabBouton[index].getState()){
    Serial.print("Pin ");
    Serial.print(tabBouton[index].getPin());
    Serial.println(" on");
  }
  index++;
  if (index>NUMBOUTON){
    index=0;
  }
}


Le code objet du premier programme est compilé en 2706 octets
Le code objet du second programme est compilé en 2772 octets

Donc on ne peut pas dire que le code généré soit beaucoup plus gros. En même temps l'exemple est très simple
Je vais continuer en regardant la mémoire consommée

fdufnews

#11
Jul 09, 2013, 10:14 pm Last Edit: Jul 09, 2013, 10:16 pm by fdufnews Reason: 1
Suite de l'essai
J'ai ajouté la librairie memoryFree pour mesurer la mémoire libre sur les 2 programmes précédents

Avec le programme simple:
        Taille du programme : 3008 octets
        Mémoire libre           : 1811 octets

Avec le programme objet:
        Taille du programme : 3080 octets
        Mémoire libre           : 1810 octets

Donc sur un programme simple la différence est minime.

Si quelqu'un a d'autres exemples.

En pièce jointe les 2 programmes

Edit: je viens de constater que la librairie memoryFree a légèrement changé depuis que je l'ai installée. Si vous reproduisez les exemples il n'est pas impossible que vous trouviez une différence dans les résultats.

patg_

Ca serait pas mal d'ajouter des fonctions et méthodes, non utilisées, et de vérifier qu'elles sont bien absentes du binaire produit (que sa taille n'augmente pas).
Mes Arduineries: http://breizhmakers.over-blog.com/

skywodd

Bonjour,

Avec GCC et G++ le binaire final n'est franchement pas bien différent.
A pars dans des cas très précis où il y a besoin de vtables par exemple (utilisation de classes avec méthodes virtual par exemple) le programme final donne (quasiment) le même résultat que du C " de base" orienté objet.

Il y a une très légère surcharge en terme de code en flash mais vraiment rien de bien méchant.
Et puis il faut relativiser, faire du C orienté objet ou du C++ "de base" revient à faire exactement la même chose, à la seule différence que le second sera bien plus simple à maintenir.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up