- Messaggi: 1
- Ringraziamenti ricevuti 0
Problema bootloader Microchip con C18 lite vs full
2 Anni 9 Mesi fa - 2 Anni 9 Mesi fa #1
da Antonmaxxx
Problema bootloader Microchip con C18 lite vs full è stato creato da Antonmaxxx
Buongiorno e grazie all'admin per l'amissione al forum.
E' il mio primo post, che poi è una richiesta di aiuto: so che non è il massimo dell'eleganza, ringrazio pertanto in anticipo chiunque offrirà il proprio contributo.
Premetto: programmare PIC non è il mio lavoro ma un vecchio hobby che ho rispolverato per una piccola necessità; utilizzo ancora MpLab 8 con C18 in due versioni, la v3.06 full e la v3.47 lite.
Mi trovo a dover ricompilare il bootloader USB HID di Microchip per il 18F4550, i cui sorgenti ho trovato nella MLA_v2018_11_26. Con C18 lite, a causa della non ottimizzazione del codice, ho dovuto editare il linker per allocare una quantità superiore di memoria destinata al bootloader: così compilato occupa non più fino a FFFh ma arriva fino a 1081h. Ovviamente ho provveduto a riposizionare i vettori di reset sia nel bootloader che nella mia applicazione (per semplicità ho voluto esagerare e ho riservato da 0000h a 1FFFh per il bootloader e da 2000h in avanti per l'applicazione).
La compilazione così va a buon fine e se provo a programmare il micro, il bootloader si avvia regolarmente. Ma come provo a caricare l'hex della mia applicazione usando l'applicativo Microchip, per una ragione a me ignota, questo anzichè limitarsi a scrivere le locazioni a partire da 2000h, si preoccupa anche di cancellare tutto quanto si trova da 1000h in avanti, andando così a cancellare una piccola porzione di codice. Ricordo infatti che il bootloader compilato con C18 lite arriva ad occupare fino a 1081h.
Di seguito trovate lo screen con la comparazione di due dump del micro: a sinistra, con il bootloader appena caricato, a destra dopo il tentativo di programmazione con l'applicativo Microchip (che ovviametne abortisce a metà). Come si vede, il programmatore va a cancellare le locazioni da 1000h a 1081h, di fatto corrompendo il bootloader.
Se nella programmazione del bootloader inserisco il code protect da 0h a 1FFFh, il programmatore Microchip porta a termine l'operazione ma avvisa che la verifica è fallita.
A mio avviso è un difetto dell'applicativo Microchip e non so come poterlo aggirare.
Qualsiasi opinione è ben accetta. Grazie, saluti a tutti.
EDIT: Credo di aver capito, non è colpa del programmatore ma - ovviamente - del firmware del bootloader che considera come blocco di partenza del codice la locazione 1000h. Penso occorra modificare PROGRAM_MEM_START_ADDRESS nel boot.c, ancora devo provare ma credo sia questa la risposta.
E' il mio primo post, che poi è una richiesta di aiuto: so che non è il massimo dell'eleganza, ringrazio pertanto in anticipo chiunque offrirà il proprio contributo.
Premetto: programmare PIC non è il mio lavoro ma un vecchio hobby che ho rispolverato per una piccola necessità; utilizzo ancora MpLab 8 con C18 in due versioni, la v3.06 full e la v3.47 lite.
Mi trovo a dover ricompilare il bootloader USB HID di Microchip per il 18F4550, i cui sorgenti ho trovato nella MLA_v2018_11_26. Con C18 lite, a causa della non ottimizzazione del codice, ho dovuto editare il linker per allocare una quantità superiore di memoria destinata al bootloader: così compilato occupa non più fino a FFFh ma arriva fino a 1081h. Ovviamente ho provveduto a riposizionare i vettori di reset sia nel bootloader che nella mia applicazione (per semplicità ho voluto esagerare e ho riservato da 0000h a 1FFFh per il bootloader e da 2000h in avanti per l'applicazione).
La compilazione così va a buon fine e se provo a programmare il micro, il bootloader si avvia regolarmente. Ma come provo a caricare l'hex della mia applicazione usando l'applicativo Microchip, per una ragione a me ignota, questo anzichè limitarsi a scrivere le locazioni a partire da 2000h, si preoccupa anche di cancellare tutto quanto si trova da 1000h in avanti, andando così a cancellare una piccola porzione di codice. Ricordo infatti che il bootloader compilato con C18 lite arriva ad occupare fino a 1081h.
Di seguito trovate lo screen con la comparazione di due dump del micro: a sinistra, con il bootloader appena caricato, a destra dopo il tentativo di programmazione con l'applicativo Microchip (che ovviametne abortisce a metà). Come si vede, il programmatore va a cancellare le locazioni da 1000h a 1081h, di fatto corrompendo il bootloader.
Se nella programmazione del bootloader inserisco il code protect da 0h a 1FFFh, il programmatore Microchip porta a termine l'operazione ma avvisa che la verifica è fallita.
A mio avviso è un difetto dell'applicativo Microchip e non so come poterlo aggirare.
Qualsiasi opinione è ben accetta. Grazie, saluti a tutti.
EDIT: Credo di aver capito, non è colpa del programmatore ma - ovviamente - del firmware del bootloader che considera come blocco di partenza del codice la locazione 1000h. Penso occorra modificare PROGRAM_MEM_START_ADDRESS nel boot.c, ancora devo provare ma credo sia questa la risposta.
Ultima Modifica 2 Anni 9 Mesi fa da Antonmaxxx.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Antonmaxxx
- Autore della discussione
- New Member
Riduci
Di più
2 Anni 9 Mesi fa #2
da firstcolle
Risposta da firstcolle al topic Problema bootloader Microchip con C18 lite vs full
esattamente, nelle impostazioni del progetto c'è l'offset da impostare per indicare da quale posizione di memoria iniziare a scrivere il programma.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- firstcolle
- Platinum Member
Riduci
Di più
- Messaggi: 362
- Ringraziamenti ricevuti 39
2 Anni 9 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Problema bootloader Microchip con C18 lite vs full
Effettivamente bisogna impostare entrambi i cambiamenti:
1) vietare la zona di programmazione
2) offset del programma
Il punto 1 non implica che il programma sia automaticamente cambiato in termini di offset. Si potrebbe per esempio iniziare un programma all'indirizzo "0" scrivere un poco di programma, vietare una zona della memoria flash, per esempio per scrivere chiavi o altro codice, e poi continuare. In questo caso l'offset non sarebbe necessario.
Altra cosa importante, è che la memoria flash viene cancellata in pagine, per cui ogni zona assegnata al bootloader, deve essere un multiplo di una pagina della memoria flash.
Saluti,
Mauro Laurenti
1) vietare la zona di programmazione
2) offset del programma
Il punto 1 non implica che il programma sia automaticamente cambiato in termini di offset. Si potrebbe per esempio iniziare un programma all'indirizzo "0" scrivere un poco di programma, vietare una zona della memoria flash, per esempio per scrivere chiavi o altro codice, e poi continuare. In questo caso l'offset non sarebbe necessario.
Altra cosa importante, è che la memoria flash viene cancellata in pagine, per cui ogni zona assegnata al bootloader, deve essere un multiplo di una pagina della memoria flash.
Saluti,
Mauro Laurenti
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.