Bonjour,
Sur un ESP32, mon programme gère un pas-à-pas sur le Coeur1 et le reste sur le Coeur0. (pour plus d’info voir ce sujet).
Dans le programme principal, j’ai un bouton pour purger manuellement (fait tourner le moteur à une certaine vitesse). Ce bouton d’éclanche une fonction qui bloque tous (while (!digitalRead(bouton)) {}) temps que le bouton est enfoncé.
Le souci que j’ai c’est quand mettant le programme principal sur le Coeur0, «ESP-IDF» ajoute un «watchdog timers» qui après ~5seconde remarque que la loop() n’a pas bougé et il me d’éclanche un reset.
Avec le programme ci-dessous, ci je le laisse sur le Coeur1, pas de soucis. Ci je le mes sur le Coeur0, ça bug…
Les lien que j’ai trouver (en anglais avec google_traduction, pas évident de comprendre) traitant ce problème :
forum Arduino Anglais
forum stackoverflow.com
forum Espressif
Programme test : (dans l’IDE pour verser sur le Coeur0 : Outils /Arduino Runs On : / Core 0)
const uint8_t swMoteurOn = 26;
void setup() {
Serial.begin(115200);
pinMode(swMoteurOn, INPUT_PULLUP);
}
void loop() {
if(digitalRead(swMoteurOn)) {
moteurOn();
}
}
void moteurOn(){
delay(20); //Anti-rebond bloquant mais suffisant, la fonction s'execute à l'arrêt de la machine
if (digitalRead(swMoteurOn)) return;
//Copier les paramètres du moteur
//Remplacer les paramètre moteur par ceux de la fonction
Serial.println("Moteur On");
while (!digitalRead(swMoteurOn)) {} //Attendre que le bouton soit relâché
Serial.println("Moteur Off\n");
//Remettre les paramètres moteur copiés au début de la fonction
}
Erreur afficher sur le port-série :
11:34:43.761 -> Moteur On
11:34:48.748 -> E (1802238) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
11:34:48.748 -> E (1802238) task_wdt: - IDLE (CPU 0)
11:34:48.748 -> E (1802238) task_wdt: Tasks currently running:
11:34:48.748 -> E (1802238) task_wdt: CPU 0: loopTask
11:34:48.748 -> E (1802238) task_wdt: CPU 1: IDLE
11:34:48.748 -> E (1802238) task_wdt: Aborting.
11:34:48.748 ->
11:34:48.748 -> abort() was called at PC 0x400d8371 on core 0
11:34:48.748 ->
11:34:48.748 ->
11:34:48.748 -> Backtrace:0x400833d1:0x3ffbe78c |<-CORRUPTED
11:34:48.780 ->
11:34:48.780 ->
11:34:48.780 ->
11:34:48.780 ->
11:34:48.780 -> ELF file SHA256: 0000000000000000
11:34:48.780 ->
11:34:48.780 -> Rebooting...
11:34:48.780 -> ets Jun 8 2016 00:22:57
11:34:48.780 ->
11:34:48.780 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
11:34:48.780 -> configsip: 0, SPIWP:0xee
11:34:48.780 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
11:34:48.780 -> mode:DIO, clock div:111:34:48.780 -> load:0x3fff0030,len:1344
11:34:48.780 -> load:0x40078000,len:13864
11:34:48.780 -> load:0x40080400,len:3608
11:34:48.812 -> entry 0x400805f0
Pour resoudre ça, vous me consayé quoi ?
- Trouver une façon de réinisialiser le watchdog pendant le while()
- Transformer ma fonction en _vTask FreeRTOS avec un vTaskDelay(...) dans le while()
- Faire une fonction On est une fonction Off (ce qui implique de sauvegarder les paramètre depuis le On pour les remettre dans le Off)
- Désactiver les watchdog, pas trop envie, ou alors que temporairement.
- Ou une autre solution !

