Utilizzo del "SALTO" GOTO dell'asm

12 Anni 1 Mese fa #1 da Akuryu
Utilizzo del "SALTO" GOTO dell'asm è stato creato da Akuryu
Come da titolo sono qui a chiedervi come funziona il salto GOTO in linguaggio asm utilizzato da Mauro per la gestione dell'interrupt, ma soprattutto mi chiedevo, una volta che termina la parte del programma a cui si è fatto il salto, il programma da dove riparte ? Se per esemio io volessi creare ( come sto facendo) un menù come sottoprogramma del programma principale potrei utilizzare il salto GOTO per entrare nel menù e quindi nelle sue funzioni per poi uscirne e tornare al programma principale ?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Akuryu
  • Avatar di Akuryu
  • Premium Member
  • Premium Member
Di più
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #2 da Akuryu
Risposta da Akuryu al topic Re: Utilizzo del "SALTO" GOTO dell'asm

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Akuryu
  • Avatar di Akuryu
  • Premium Member
  • Premium Member
Di più
12 Anni 1 Mese fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Utilizzo del "SALTO" GOTO dell'asm
Ciao,

in generale l'utilizzo del goto non viene ritenuta una buona pratica di programmazione per cui dovrebbe essere limitata.
L'utilizzo del goto nelle interruzioni serve solo per rimappare o puntare la funzione che gestisce l'interruzione (indirizzo di inizio).
Dal momento che al verificarsi dell'interruzione il program counter viene salvato (salva l'indirizzo dell'istruzione successiva che deve essere eseguita al ritorno dell'interruzione) e il goto non altera lo stack. Quando viene eseguito il ritorno di funzione della funzione (che comunque non e' un RET ma un RETI) l'informazione salvata nello stack e' ancora valida e tiene in memoria il punto corretto dove ritornare.

Un uso del goto deve essere fatto in maniera meticolosa perche' rompe e altera il flusso del programma.
Se salti per esempio nel main e non esegui piu' un RETI lo stack non viene rilasciato...e via via si esaurisce.
...ed hai il cosiddetto stack overflow, che in generale causa un reset del microcontrollore.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
12 Anni 1 Mese fa #4 da Spazzoli
Risposta da Spazzoli al topic Re: Utilizzo del "SALTO" GOTO dell'asm
Ne approfitto a scrivere perchè mi sono trovato davanti ad un problema molto simile se non ho capito male la domanda, che all'atto pratico ho già risolto e la soluzione funziona, ma non mi sembra troppo elegante. Purtroppo non possiedo i codici su questa piattaforma e non posso quindi postare ma riassumendo a grandi linee accade questo:

Nel main vengono eseguiti set di istruzioni ciclici (giochi di luce) di durata considerevole e con la presenza di wait() bloccanti. All'inizio di ogni ciclo si entra in uno stwitch che, guardando il programma selezionato fa partire un gioco luminoso oppure un altro.

Ora il programma desiderato viene selezionato asincronicamente grazie agli interrupt. Io peró voglio che esso parta istantaneamente all'atto della selezione, senza aspettare di terminare il programma in corso per ripassare dallo switch(programma).

Ho risolto confrontando dentro ogni wait() bloccante se il programma desiderato è lo stesso di quello richiesto, in caso negativo avviene istantaneamente un break, questo comporta comunque uno sfarfallio dei led, in quanto viene comunque esegue tutto il programma in corso fino allo switch ma soltanto saltando le wait, e quindi ci mette una frazione quasi impercettibile di secondo!

Ho risolto questo secondo problema (sfarfallio dei led) moltiplicando le variabili di uscita ledX*mask, dove, in caso sia necessario cambiare programma prima dei break setto mask a 0, in modo che i led non sfarfallino...poi alla riesecuzione del programma corretto risertto mask ad 1.

Il tutto mi sembra estremamente macchinoso, funziona certo, ma non mi convince un gran che...qualcuno ha idee migliori? Diciamo che un goto dentro l'interrupt per saltare al programma corretto sarebbe l'ideale..se solo esistesse uno stack infinito...:)

Spero di essermi spiegato decentemente...

anto.spax
youtube robot gallery:
www.youtube.com/user/antospax?feature=mhum

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Spazzoli
  • Avatar di Spazzoli
  • Senior Member
  • Senior Member
Di più
12 Anni 1 Mese fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Utilizzo del "SALTO" GOTO dell'asm
un goto che impedisce allo stack di fare i salti indietro è certamente un problema.
Fare dei controlli nei loop è una soluzione altrimenti è meglio utilizzare il timer in interruzione e fare una macchina a stati.
Il premere i pulsanti fa cambiare solo stati e in un loop si controlla sempre in che stato ci si trova.

Utilizzare un approccio a stati permette di mantenere il codice pulito e ben definito.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login