Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - deallocazione risorse e jump
Forum - C/C++ - deallocazione risorse e jump

Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:49
Martedì, 01/12/2015
Salve, ho una domanda di puro carattere tecnico da porvi, anche se immagino gia le possibili risposte, vorrei dei riscontri affidabili.
Mi sto lanciando nel primo tentativo di stesura di un bootloader di basso livello per AVR.
So con precisione l'indirizzo di memoria dal quale inizierà l'esecuzione(lo 0x7e00) quindi mi basta passare al main l'attributo section per dire al compilatore in che area di memoria posizionare il main. Ora il vero e proprio dubbio, alla fine del bootloader devo spostare l'esecuzione all'indirizzo 0x0000 per fare questo dichiaro start
Codice sorgente - presumibilmente C/C++

  1. void (*start)() = 0x0000;


e la richiamo al termine del main del bootloader, e qui i conti iniziano a non tornare. Start in assembly viene tradotta come una semplice call ad una subroutine, questo comporta che il vero programma del AVR viene eseguito sopra al bootloader, per esempio senza mai de allocare le variabili locali del bootloader. Mi chiedo l'unica soluzione per una corretta stesura del bootloader sia scrivere il jump finale in assemply?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:06
Mercoledì, 02/12/2015
Sia che fai un JMP o una chiamata a start, le variabili rimarranno allocate sullo stack. Penso dovrai manualmente modificare la register SP per deallocare le variabili del bootloader e poi fare un JMP.


Il mio blog: https://piero.dev
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:05
Mercoledì, 02/12/2015
Grazie Piero, se hai letto anche l'altro topic è saltato fuori che il compilatore include nel codice un reset dello stackpointer, quindi questo avverrebbe all avvio del programma principale, dopo il jump, in poche parole mi sono fatto problemi che effettivamente non ci sono. In ogni caso non mi costa nulla includere un istruzione di reset dello stackpointer prima di effettuare il jump, giusto per sicurezza. Grazie della risposta.

PM Quote