Bonjour Ami.e.s codeur.euse,
Je requière votre aide, cela fait presque une journée que je penche sur mon problème.
Je travaille sur un microcontrôleur AVR 8bits Atmega328p (celui de l'arduino uno), la norme que j'utilise est C++11,
donc le moindre byte de flash et SRAM sont précieux.
Je développe mon propre framework, qui sera moins gourmand que celui proposé par Arduino.
J'ai récemment découvre les templates, les constexpr et lors puissances.
j'ai crée une template<uint8_t PIN_>
qui permettent d'avoir en paramètre la pin sur laquelle la class va travailler.
La passer en paramètre permet en autre de pré-calculer divers constantes lors de la compilation et non à l’exécution (il me semble que cela s'appelle la métaprogrammation).
Ce-ci fonctionne très bien, et est super optimisé, j'adore.
seulement voilà, j'aimerai avoir la possibilité d'avoir un tableau d'objets. et je bloque complètement sur comment faire.
voici le code (j'ai supprimé ce qui n'avait rien avoir avec mon problème pour simplifier la compréhension).
la class en question:
son implémentation dans le main
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 template<uint8_t PIN_> class PWMPin { public: void write(uint8_t duty); uint8_t getDuty() const; public: static constexpr uint8_t PIN = PIN_; static constexpr uint8_t SHIFT_REGISTER = ((PIN_ & 0b00011000 >> 3) * 3); static constexpr uint8_t BIT = (PIN_ & 0b00011000); };
maintenant si je veux faire un tableau de moteurs (ou tout autre conteneur, premettant de manipuler plusieurs moteurs facilement), impossible de trouver une solution viable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int main() { PWMPin<10> motor1; PWMPin<9> motor2; motor1.write(200); motor2.write(200); CSerial << "moteur1=" <<motor1.getDuty() << " moteur2=" << motor2.getDuty() << endl; return 0; }
j'ai essayée de faire une collection hétérogène avec une class conteneur maison, cependant, cela gaspille 2bytes de SRAM et presque 10bytes de flash par objet dans la collèction. dû coup cela perd de son intérêt de passer par une class template + constexpr.
j'ai éssaye de faire des conversions de types, de passer par des pointeurs, (choses que je maitrise en vraiment maitriser ) etc... sans résultat.
Ce que je n'arrive pas comprendre c'est pourquoi motor1 et motor2 son si différent alors que ce qui diffère que par une constante (de même type) passé par paramètre template.
Je ne sais même pas s'il est possible de faire ce que je veux sans passer par une collection hétérogène.
Donc voilà si quelqu'un peu m'aider à trouver une solution par avoir un tableau ou tout autre choses qui me permetterai de facilement manipuler plusieurs moteurs en mêmes temps du style.
Un grand merci à vous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main() { //code pour déclarer mes moteurs sous forme de tableau for(uint8_t i = 0; i < 5; i++) { motor[i].write(200); CSerial << "moteur[" << i <<"]=" <<motor[i].getDuty() << endl; } return 0; }
PS: je me suis auto-formé, donc il est possible que ce soit codé n'importe comment ou que le vocabulaire utilisé ne soit pas le bon. J'ai éssayé de faire de mon mieux.
Partager