Personnellement j'ai la version svn (+ client svn pour la garder à jour) et elle marche parfaitement sous arduino 0022.
Aprés ce n'est pas du calcul parallèle attention !
DuinOS est un RTOS, mais il ne fait qu'alloué un certain temps de calcul à une tache et pendant ce temps les autres sont en pause.
Telson:
Tu pourrais développer SVN + client pour mise à jour?
histoire de toujours avoir la dernière version de duinOS (et donc pouvoir utiliser l'IDE arduino le plus récent), j'utilise un client SVN avec le lien google code du projet : Google Code Archive - Long-term storage for Google Code Project Hosting.
Par contre le fait d'avoir la dernier version de développement implique que quelque fois il y est des bug sur certaine fonction récente.
Telson:
Tu utilises la mega2560?
Oui mega2560 officiel et Uno et ça marche bien sur les deux. Edit : Je viens de regarder le µc de ma mega (fait maison) sur laquelle j'avais tester duinOS et c'est un ATmega1284 . je vais voir de refaire le test avec ma "vrai" mega2560 Re-Edit : C'est bizarre avec une UNO ça marche normalement, avec ma mega1284 aussi et sur la mega2560 le programme ne boot pas ?!
Sinon je confirme la version 3 (version svn) tourne sans probléme sous arduino 0022 (et même avec l'add-on teensyduino aucun probléme). Re-Re-Edit : (décidément ^^) L'ATmega1280 marche, l'ATmega1284 marche, l'ATmega2560 n'est rien d'autre que l'ATmega1280 avec 2x plus de flash et ça ne marche pas !? C'est vraiment un bug trés étrange !
Nous pouvons lire sur la procédure d'instalation :
4. Copy the hardware\boards.txt (0.3) deployed with DuinOS to the \hardware\arduino (Arduino IDE 0021) folder.
Note : if you use Arduino card other than Arduino Duemilanove or Nano w/ ATmega328, Arduino Diecimila, Duemilanove, or Nano w/ ATmega168, then Copy the hardware\boards-test.txt (0.3) deployed with DuinOS to the \hardware\arduino (Arduino IDE 0021) folder and rename it as board.txt.
Je vais tester ce board-test.txt mais je ne pense pas que le probléme viennent de là.
L'ATmega2560 est juste la version 256Ko de l'ATmega1280 (128Ko) sinon niveau hardware il n'y à aucune différence !
Ce qui marche avec un ATmega1280, ATmega1284 devrait marcher avec un ATmega2560
C'est trés trés bizarre en comparant avec notepad++ les deux fichiers boards.txt et boards-test.txt là seul diférence c'est qu'il ont supprimé la uno + duinos et mega2560 + duinos
Je vais voir de trifouiller un peu la configuration de FreeRTOS pour la mega2560 voir si cela change quelque chose.
En faite c'est tout bête !
L'ATmega1280 a 2x moins de place en flash que l'ATmega2560.
Or qui dit plus de mémoire, dit plus d'adresses mémoire !
Par conséquent le registre interne qui gère l'adressage est plus grand !
Sur l'ATmega1280 c'est un compteur 16bit mais sur l'ATmega2560 c'est un compteur 22bit !
J'ai fait un patch pour le fichier port.c se trouvant dans ..\hardware\arduino\cores\arduino.DuinOS\DuinOS
je le joins en pièce jointe.
Le patch fonctionne "normalement" en 16bit avec les Atmega328/1280/1284/... mais si il détecte un ATmega2560 il passera en mode 22bit
En espérant que cela aidera d'autre personne ^^
PS: j'ai aussi posté mon patch sur le google code du projet duinOS
Telson:
Mais c'est énorme ce que tu nous propose là.
CM... Non je vais évité même si c'est trop tentant
Telson:
Merci beaucoup, je vais essayer de faire fonctionner cela au plus vite.
Car en fait, je souhaiterais faire avancer mon robot et en même temps faire tourner ma tourelle supportant mon capteur.
Chaque chose n'est pas exécuté en "même" temps, chaque fonction à un certain temps de calcul puis c'est le tour d'une autre fonction etc, etc, ...
On a l'impression que tout ce fait en même temps mais c'est pas vraiment le cas.
Effectivement ce n'est pas vraiment du multi. mais pour mon niveau cela devrait aller.....Quoi que j'aimerai bien apprendre mais je ne sais pas par ou commencer????
Telson:
Effectivement ce n'est pas vraiment du multi. mais pour mon niveau cela devrait aller.....Quoi que j'aimerai bien apprendre mais je ne sais pas par ou commencer????
Premiers pas avec DuinOS - PoBot ? ça pourrai aller pour commencé ^^ aprés pour partir sur du plus "concret" (application avec zone de code critique, mutex & co) il est toujours possible d'allez voir les tuto pour freeRtos.
Je viens de faire un essai avec Duinos et l'exemple
voici le résultat !!
In file included from E:\arduino-0021\hardware\arduino\cores\arduino.DuinOS/DuinOS.h:14,
from E:\arduino-0021\hardware\arduino\cores\arduino.DuinOS/WProgram.h:13,
from E:\arduino-0021\hardware\arduino\cores\arduino.DuinOS\main.cpp:1:
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h: In function 'void eeprom_read_block(void*, const void*, size_t)':
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: ISO C++ forbids incrementing a pointer of type 'void*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: ISO C++ forbids incrementing a pointer of type 'const void*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: invalid conversion from 'const void*' to 'const uint8_t*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:290: error: initializing argument 1 of 'uint8_t eeprom_read_byte(const uint8_t*)'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h: In function 'void eeprom_write_block(const void*, void*, size_t)':
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: ISO C++ forbids incrementing a pointer of type 'void*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: ISO C++ forbids incrementing a pointer of type 'const void*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: invalid conversion from 'void*' to 'uint8_t*'
e:/arduino-0021/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:398: error: initializing argument 1 of 'void eeprom_write_byte(uint8_t*, uint8_t)'
Alors des nouvelles de Duinos....j'essai de faire fonctionner deux tâches similtanément, ces tâches sont des commandes de moteur pas à pas. Cependant, les moteurs tournent continuellement et ce même lorsque je supprime le contenu de la fonction loop.
Je suppose donc que les Taskloop suffise pour faire fonctionner les moteurs????
voici mon code:
#include <Stepper.h>
const int stepsPerRevolution = 200; // Nombre de pas par révolution
// initialize the stepper library on pins 8 through 11:
Stepper MD(stepsPerRevolution, 22,23,24,25);
Stepper MG(stepsPerRevolution, 32,33,34,35);
// Déclaration des deux tâches parallèles
taskLoop(MoteurG)
{
MG.step(20);
}
taskLoop(MoteurD)
{
MD.step(20);
}
// Fonctions habituelles
void setup()
{
// set the speed at 60 rpm:
MG.setSpeed(60);
MD.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
// Création des deux tâches
createTaskLoop(MoteurG, NORMAL_PRIORITY);
createTaskLoop(MoteurD, NORMAL_PRIORITY);
}
void loop()
{
Serial.println("Début de boucle");
// Deux tâches en parallèle pendant 2 secondes
Serial.println("Les deux moteurs");
resumeTask(MoteurG);
resumeTask(MoteurD);
delay(2000);
// Puis seulement le moteur gauche pendant 5 secondes
Serial.println("Le moteur gauche");
suspendTask(MoteurD);
delay(5000);
// Puis seulement le moteur droit pendant 5 secondes
Serial.println("Le moteur droit");
resumeTask(MoteurD);
suspendTask(MoteurG);
delay(5000);
// et on recommence (loop)
Serial.println("En fin de boucle");
}