Vai al contenuto
Vai all indice del manuale di programmazione

Il sistema operativo dei sistemi SlimLine e Netsyst gestisce una serie di errori di eccezione che possono generarsi durante l’esecuzione del programma utente. L’eccezione è un meccanismo che interrompe l’esecuzione del programma in caso di errore di run-time.

Riconoscere le eccezioni

Nel caso l’esecuzione del programma utente si interrompa inaspettatamente ponendo il programma in stop occorre verificare l’eventuale blocco per eccezione. Accedendo alla pagina web dei Logs, o connettendosi in Telnet sulla porta 23 è possibile accedere all’interprete comandi (Vedi articolo) e con il comando SysLog visualizzare l’eventuale eccezione. Siccome le eccezioni sono rilevate dal sistema all’avvio non è ancora stata aggiornata la data, quindi l’evento ha data errata.

Screenshot visualizzazione eccezioni

Codici di eccezione

Le eccezioni sono ritornate con un codice alfanumerico seguito dall’indirizzo di memoria in cui è avvenuta. Anche se non sempre è possibile dall’indirizzo risalire alla parte di programma che ha generato l’eccezione riporto indicazione delle operazioni da effettuare. L’eccezione dell’esempio si è generata perchè il tempo di esecuzione del programma ha superato il tempo concesso dal circuito di watchdog. Per risalire all’indirizzo occore aprire con un editor di testi il file con estensione lst che si trova nella cartella Build del progetto LogicLab.

Nel programma attivando l’ingresso Di00CPU l’esecuzione si chiude in un ciclo WHILE infinito che fà intervenire il circuito di watchdog che esegue un reset del sistema. L’eccezione di WDOG è avvenuta all’indirizzo 0x005BA1B6. Quindi eseguendo la ricerca dell’indirizzo 005BA1B6 nel file si vede che è proprio all’interno del ciclo while. Non sempre nel listato compare l’esatto indirizzo riportato sul codice di eccezione, quindi consiglio di effettuare la ricerca considerando un range di indirizzi, nel nostro caso avrei potuto cercare l’indirizzo 005BA1B e poi spostarmi sull’indirizzo più vicino a quello dell’eccezione.

LogicLab, file listato
    +--------------------------------------------------------------------------+
    | LOGICLAB PROGRAM                                                         |
    +--------------------------------------------------------------------------+

    IF (Di00CPU) THEN WHILE (TRUE) DO END_WHILE; END_IF;

    +--------------------------------------------------------------------------+
    | LISTING FILE                                                             |
    +--------------------------------------------------------------------------+

    #9                  (* IF Di00CPU *)
    #10                 LD Di00CPU    {LNXT:5|-1|-1}
    (*) UNDEF
    005BA1A8  F8DF 7024 ldr r7, [pc, #+36] ; 0x2041AF60
    005BA1AC  7838      ldrb r0, [r7]

    #11                 JMPCN    $label0    {LNXT:5|5|2}
    (-) BOOL
    005BA1AE  2800      cmp r0, #0
    005BA1B0  D005      beq #10 ; 0x005BA1BE

    #13                 (* THEN *)
    #15                 (* WHILE TRUE *)
    #16                 $label1:
    #17                 LD        TRUE    {LNXT:5|-1|-1}
    (-) UNDEF
    005BA1B4  200       mov r0, #1 ; 1

    #18                 JMPCN        $label2    {LNXT:5|2|2}
    (-) BOOL
    005BA1B6  2800      cmp r0, #0                        <--- Exception address
    005BA1B8  D001      beq #2 ; 0x005BA1BE

    #20                 (* DO *)
    #21                 JMP        $label1    {LNXT:5|2|2}
    (-) BOOL
    005BA1BC  E7FA      b #-12 ; 0x005BA1B4

Except: HARD_FAULT, generata dal microcontrollore.

Except: BUS_FAULT, gestione memoria.

  • Si fà riferimento ad una variabile allocata ad un indirizzo di memoria errato.
  • Si cercai di accedere in scrittura ad una variabile allocata in memoria di sola lettura.

Except: USAGE_FAULT, gestione memoria.

  • Eseguita istruzione non definita.
  • Acceso a memoria non allineata. Nei processori ARM le variabili a 2 bytes vanno allocate ad indirizzi divisibili per 2, mentre le variabili a 4 bytes allocate ad indirizzi divisibili per 4. All’allineamento delle variabili provvede il compilatore di LogicLab ma attenzione quando si utilizzano i puntatori.
  • Generata in caso di divisione per 0.

Except: MEM_MNG, gestione memoria.

  • Accesso ad area di memoria vietata, esempio eseguito programma da un’area impostata read/write.

Except: IDISABLE. disabilitazione interrupts hardware.

  • Effettuate un numero di disabilitazioni superiori al numero di abilitazioni.

Except: IENABLE. abilitazione interrupts hardware.

  • Effettuate un numero di abilitazioni superiori al numero di disabilitazioni.

Except: WDOG, intervenuto circuito di watchdog hardware che ha resettato il sistema.

  • L’esecuzione del programma ha richiesto un tempo superiore al tempo di watchdog.

Except: IVECTOR, verificata corruzione vettori interrupt.

Except: REBOOT, eseguito un reboot del sistema.

Except: RMALLOC, problema nell’utilizzo della memoria rilocabile.

Except: UNDEF, si è riscontratro un problema di cui non è possibile risalire alla causa.

Was this article helpful?