Multitâches DuinOS

Bonjour,

Est ce que quelqu'un aurait des informations complémentaire sur DuinOS pour les Méga2560.

Sommes nous obligés d'utiliser l'IDE 0021?

Y aurait t'il une nouvelle version pour la 0022?

Sur cette page, il semblerait que non mais sais t'on jamais : http://robotgroup.com.ar/duinos/wiki/index.php?title=DownLoad_and_Getting_Started

Quelqu'un aurait t'il de l'expérience dans ce domaine?

Je me pose la question du multitâche ca pour faire avancer le robot et détecter les obstacles c'est bien deux routines qui fonctionnent en parallèle?

A+

Bonjour,

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.

Tu pourrais développer SVN + client pour mise à jour?

Tu utilises la mega2560?

Merci.

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 : http://code.google.com/p/duinos/source/checkout 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 :blush:. 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 !

Bon alors apparemment selon le lien suivant : http://robotgroup.com.ar/duinos/wiki/index.php?title=DownLoad_and_Getting_Started

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.

Dans ce fichier nous pouvons lire :

mega2560_DuinOS.name=Arduino Mega 2560 + DuinOS . . .

Quelqu'un a déjà essayé?

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 :stuck_out_tongue_closed_eyes:

Ha ok.....Et bien j'ai hâte de lire tes conclusions.....

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 :astonished: Je vais voir de trifouiller un peu la configuration de FreeRTOS pour la mega2560 voir si cela change quelque chose.

J’ai trouvé le probléme 8)

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 :wink:

En espérant que cela aidera d’autre personne ^^

PS: j’ai aussi posté mon patch sur le google code du projet duinOS :wink:

port.c (20.3 KB)

Mais c’est énorme ce que tu nous proposes là.

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.

J’essaie tout cela dès que possible.

Merci encore.

P.S. L’adresse du google code DuinOS c’est bien : http://code.google.com/p/duinos/ ?

Telson: Mais c'est énorme ce que tu nous propose là.

CM... Non je vais évité même si c'est trop tentant :grin:

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.

Telson: P.S. L'adresse du google code DuinOS c'est bien : http://code.google.com/p/duinos/ ?

Oui c'est ça.

CM ??????

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: CM ??????

Même pas une petite idée ^_^

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????

http://www.pobot.org/Premiers-pas-avec-DuinOS.html ? ç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.

ARGH !!! J'suis con CMB !!!

Bonjour,

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)’

A l’aide…Snifff!!!

En lisant l’erreur il semblerai que le probléme ce situe dans duinOS.h à la ligne 14 soit :

#include <avr/eeprom.h>

Petit coup d’oeil rapide sur la ligne au dessus :

/* EEPROM routines used only with the WinAVR compiler. */

traduit : Les routines EEPROM ne peut être utilisé qu’avec winAVR.

Je suis sur que la compilation n’est pas faite sous windows :wink:
Pour empêché ce probléme sous linux/mac il faut commenter cette ligne.

Salut,

Merci de te pencher sur mon problème mais je fais quoi?

J'ai pas compris en fait hein?? J'suis désolé.

Tu mets la ligne comme si c’était un commentaire

// #include <avr/eeprom.h>

Bonjour,

Alors j'ai réussi à faire fonctionner (sous windows) la mega2560 + arduino0022 + Duinos V0.3.

Pour ce, faire la mise à jour (r32) de Duinos V0.3 avec le code SVN via Turtoise et remplacer le fichier port.c comme proposé au dessus.

Pour le moment j'ai testé uniquement l'exemple des leds qui clignotent simultanément.

Merci à skywodd pour son aide et sont fichier providentielle ainsi que pour tous ceux qui m'ont répondu

Bonjour,

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");
}

Qu’en pensez vous ???