76
Vos projets / Re : projet centrale wifi DCC++ Can
« le: mars 11, 2020, 10:27:25 pm »
Bonsoir,
Avec Dominique, on pensait qu'il fallait pouvoir profiter de l'ESP32 et notamment de ses doubles coeurs processeur.
L'ESP32 embarque le FreeRTOS, un OS temps réel puissant mais qui pour autant un peu bridé par Arduino IDE qui n'exploite au final qu'un coeur (le coeur n°1, sachant que le coeur n°0 ingère de l'idle pendant ce temps).
Et bien sachez que ce n'est pas compliqué (je n'ai pas encore testé donc c'est certainement très facile d'en parler ) de profiter des 2 coeurs : https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
Dans le setup(), on déclare une fonction, Task1code dans l'exemple mais c'est libre, qui sera affecté sur le coeur 0. Exemple :
Comme vous le voyez, c'est très simple, on pourrait très bien avoir une loop_core0() et une loop_core1() ->
Un beau cas d'usage pour notre projet serait de séparer la partie web du reste de la centrale pour être sûr de ne pas ralentir quoi que ce soit selon le nombre de client. A creuser.
Après on entre dans le domaine du multitâche / multi thread donc attention aux MUTEX qu'il faudra gérer à la pogne si nécessaire.
Avec Dominique, on pensait qu'il fallait pouvoir profiter de l'ESP32 et notamment de ses doubles coeurs processeur.
L'ESP32 embarque le FreeRTOS, un OS temps réel puissant mais qui pour autant un peu bridé par Arduino IDE qui n'exploite au final qu'un coeur (le coeur n°1, sachant que le coeur n°0 ingère de l'idle pendant ce temps).
Et bien sachez que ce n'est pas compliqué (je n'ai pas encore testé donc c'est certainement très facile d'en parler ) de profiter des 2 coeurs : https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
Dans le setup(), on déclare une fonction, Task1code dans l'exemple mais c'est libre, qui sera affecté sur le coeur 0. Exemple :
Code: [Sélectionner]
xTaskCreatePinnedToCore(
Task1code, /* Function to implement the task */
"Task1", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
&Task1, /* Task handle. */
0); /* Core where the task should run */
et ensuite on implémente notre fonction :Code: [Sélectionner]
Void Task1code( void * parameter) {
for(;;) {
Code for task 1 - infinite loop
(...)
}
}
Comme vous le voyez, c'est très simple, on pourrait très bien avoir une loop_core0() et une loop_core1() ->
Un beau cas d'usage pour notre projet serait de séparer la partie web du reste de la centrale pour être sûr de ne pas ralentir quoi que ce soit selon le nombre de client. A creuser.
Après on entre dans le domaine du multitâche / multi thread donc attention aux MUTEX qu'il faudra gérer à la pogne si nécessaire.