ISR not in IRAM!

Software:
Arduino: 1.8.9
Esp core: 2.5.2

Hardware:
Wemos D1 Lite

Buongiorno a tutti,

ho bisogno di qualche delucidazione per cortesia. Ho aggiornato il core di esp8266 dalla versione 2.4.2 all'ultima disponibile la 2.5.2. Quando ho verificato e scaricato il nuovo codice sulla Wemos, la stessa va in riavvio e la causa che leggo dal monitor seriale dopo lo stack è:

"ISR not in IRAM"

Ora sono consapevole del fatto che per gli ESP gli interrupt vanno allocati in ram, per cui nello skecth che ha girato fino a ieri penso di averlo fatto ed infatti era tutto ok, o almeno credo. Potete aiutarmi a correggere questa anomalia. Vi mostro il codice:

volatile byte mod;                 // variabile stato modalità
volatile float t_set_man;        // settaggio temperatura manuale
volatile float t_set_gelo;        // settaggio temperatura antigelo

// PULSANTI
#define Pulsante_2 D5 // down
#define Pulsante_3 D6 // menù
#define Pulsante_1 D7 //  up
volatile unsigned long millis_p_1;
volatile unsigned long millis_p_2;
volatile unsigned long millis_p_3;
#define ICACHE_RAM_ATTR

.....

void setup()
{

  pinMode(Pulsante_1, INPUT); // pulsante up
  attachInterrupt(digitalPinToInterrupt(Pulsante_1), up, RISING);
  pinMode(Pulsante_2, INPUT);  // pulsante down
  attachInterrupt(digitalPinToInterrupt(Pulsante_2), down, RISING);
  pinMode(Pulsante_3, INPUT);  // pulsante MENU'
  attachInterrupt(digitalPinToInterrupt(Pulsante_3), menu, RISING);

 }

//==============================================================
//                        INTERRUPT
//==============================================================
void ICACHE_RAM_ATTR up()  {    // pulsante su D7
  if (mod == 1) { // legge memoria stato mod.MAN
    if (millis() - millis_p_1 >= 225) {
      t_set_man = t_set_man + 0.5;      // e incrementa la temperatura t_set_man
      millis_p_1 = millis();
    }
  }
  if (mod == 3) { // legge memoria stato mod.GELO
    if (millis() - millis_p_1 >= 225) {
      t_set_gelo = t_set_gelo + 0.5;      // e incrementa la temperatura t_set_gelo
      millis_p_1 = millis();
    }
  }
}

void ICACHE_RAM_ATTR down() {  // pulsante su D5
  if (mod == 1) { // legge memoria stato mod.MAN
    if (millis() - millis_p_2 >= 225) {
      t_set_man = t_set_man - 0.5;     // e decrementa la temperatura t_man
      millis_p_2 = millis();
    }
  }
  if (mod == 3) { // legge memoria stato mod.GELO
    if (millis() - millis_p_2 >= 225) {
      t_set_gelo = t_set_gelo - 0.5;      // e decrementa la temperatura t_set_gelo
      millis_p_2 = millis();
    }
  }
}

void ICACHE_RAM_ATTR menu() { // pulsante su D6
  if (millis() - millis_p_3 >= 225) {     // PULSANTE CICLATA MODALITA' OFF/MAN/AUTO/GELO
    mod++;
    EEPROM.write(addr, mod);
    EEPROM.commit();
    millis_p_3 = millis();
  }
  if (mod > 4) {
    mod = 1;
    EEPROM.write(addr, mod);
    EEPROM.commit();
  }
}

Aggiungo che i tre interrupt sono a servizio di altrettanti pulsanti e che gli stessi sono dotati di circuito di debauncing.
Grazie

Non so aiutarti, ma trattandosi di una cosa specifica dell'ESP forse meglio se scrivi o qui ma nel topic dedicato, o in un qualche altro forum sugli ESP...

docdoc:
Non so aiutarti, ma trattandosi di una cosa specifica dell'ESP forse meglio se scrivi o qui ma nel topic dedicato, o in un qualche altro forum sugli ESP...

Grazie lo stesso, gentilmente sapresti indicarmi qual'è il topic dedicato?

Ciao

Hm, non lo trovo, puoi vedere un po' di cose sull'ESP nel forum Megatopic, ma se non ottieni/trovi risposte temo che tu debba cercare sui forum WeMos che però vedo offline per manutenzione... :frowning:

Prova altrimenti QUI.

Ciao, la soluzione è aggiungere "ICACHE_RAM_ATTR" prima della isr.
Tipo:

void ICACHE_RAM_ATTR Interrupt_ISR ( void) {

...

}

Source 1: Latest Core - crash at boot with ISR not in IRAM error · Issue #6127 · esp8266/Arduino · GitHub
Source 2: My ESP crashes running some code. How to troubleshoot it? — ESP8266 Arduino Core 3.1.1-25-g84a59aa9 documentation

>nrdmtt: essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

nrdmtt:
Ciao, la soluzione è aggiungere "ICACHE_RAM_ATTR" prima della isr.
Tipo:

void ICACHE_RAM_ATTR Interrupt_ISR ( void) {

Già fatto, infatti sta già nel codice del primo post. Purtroppo non sembra essere la soluzione.

zoomx:
Già fatto, infatti sta già nel codice del primo post. Purtroppo non sembra essere la soluzione.

Strano. Io oggi ho risolto lo stesso problema aggiungendo quel attributo.
Hai provato ad aggiornare ad arduino/esp 1.8.10/2.6?

Eh, non ero io ad avere quel problema.