Microchip XC8: come impacchettare il codice rispetto a un limite superiore?

1

Ho un progetto per un PIC16F1454 che necessita di collegamenti personalizzati. Fondamentalmente, ho separato il mio codice in due parti che possono essere scaricate separatamente sul campo e quindi aggiornare (quasi) tutta la memoria flash, incluso il bootloader. Come parte del piano per evitare il bricking stesso, ho questa struttura:

  • Inferiore, protetto dall'hardware, non aggiornabile sul campo:
    • codice di avvio e copia immagine, scritto in assembly
  • Medio:
    • Spazio per le applicazioni
    • Utilizzato anche per scaricare nuove immagini
  • Alta:
    • Spazio per Bootloader

E c'è del codice in vari punti che impone quella struttura.

Il bootloader include uno stack USB, un loop principale e alcune funzioni di aiuto che si sommano a poco più di una pagina di flash, il che causa alcuni problemi al linker. Ad esempio, il file della guida dice che questa opzione dovrebbe concatenare l'intero elenco e metterlo contro il limite superiore specificato (notare l'indirizzo negativo):

  • -L-pUSBCode = -1FFEh, USBConst, BootloaderCode, BootloaderConst

Ma quando lo faccio, tutti e quattro i problemi si sovrappongono, con le consuete conseguenze non intenzionali. L'ho fatto:

  • -L-aBootloader = 1400h-17FFh, 1800h-1FFDh -L-dBootloader = 2 -L-pUSBCode = Bootloader -L-pUSBConst = Bootloader -L-pBootloaderCode = Bootloader -L-pBootloaderConst = Bootloader

che definisce una classe con elementi a 2 byte che attraversa un limite di pagina a 1800 ore e mette tutti e quattro i ps di quella classe. Mentre non si sovrapponevano, ho ottenuto un grosso buco accanto al limite della pagina, abbastanza grande da consentire a diverse funzioni di supporto di adattarsi.

Potrei assegnare funzioni più granulose a più di quattro psect, e questo probabilmente renderebbe le cose più in forma, ma preferirei non renderlo più complicato del dovuto. Qualcun altro (potrei essere io dopo qualche mese) probabilmente lo modificherà in un secondo momento, e non mi aspetto che sia intimamente a conoscenza dei dettagli.

Come posso imballare l'intera sezione bootloader il più strettamente possibile nella memoria superiore, tenendo conto del trampolino da main () a 1FFEh-1FFFh, senza richiedere a uno sviluppatore futuro di modificare qualcosa al di fuori dei file sorgente C?

    
posta AaronD 28.08.2014 - 21:59
fonte

2 risposte

0

Ho risolto il problema, ma non nel modo in cui inizialmente pensavo. Mi sono reso conto che era ok avere un codice applicativo nella sezione bootloader, ma non il contrario. Quindi se la sezione di avvio è più grande di quanto deve essere e il linker riempie alcune lacune con il codice dell'app, va bene. Il codice dell'app non verrà eseguito fino a quando non verrà verificata la sezione dell'app.

Quindi ora ho:

  • -L-pUSBConst = 1200h -L-aBootloader = 1200h-17FFh, 1800h-1FFDh -L-dBootloader = 2 -L-pBootloaderText = Bootloader -L-pUSBText = Bootloader -L-pISRText = 0220h

e sembra funzionare. 0x1200 è il punto a metà dello spazio lasciato dal codice di avvio, arrotondato al più vicino 0x0100, quindi non si lamenta delle costanti presenti. Questo, quindi, è il più grande bootloader / driver USB che posso avere senza causare altri problemi comunque.

Come nota a margine, l'ottimizzatore funziona solo sulle sezioni denominate * testo * (caratteri jolly, senza distinzione tra maiuscole e minuscole). Ci è voluto un po 'per capire perché il mio ISR accuratamente programmato è stato ottimizzato ancora peggio della versione gratuita.

Grazie per il tuo aiuto!

    
risposta data 09.09.2014 - 17:34
fonte
1

Innanzitutto, hai esaminato Ottimizzazione su XC8? Potrebbe richiedere una licenza a pagamento, ma potrebbe anche farti scendere al di sotto di una pagina, impedendoti di avere quei bit in più che pendono sulla pagina successiva. Un'altra cosa da notare è che a volte i compilatori della serie X faranno cose molto, molto strane sotto le impostazioni di ottimizzazione. Esegui un test accurato del prodotto se utilizzi le impostazioni di ottimizzazione. Potresti trovare dei bug. Ricorda che Microchip è nel Business Processor, non nel Compiler Business. Mostra.

In secondo luogo, hai preso in considerazione la possibilità di provare il compilatore C18 per vedere se questo ti darà un binario più piccolo? Non sono sicuro che funzionerà con il tuo chip, ma produce file binari leggermente diversi, che potrebbero risultare più piccoli di quelli forniti da XC8.

Infine, potrebbe essere necessario riscrivere il codice fino a quando il compilatore sputa qualcosa di più piccolo. Ho dovuto farlo un paio di volte per aggirare me stesso le pagine e, anche se non è mai bello, è quasi sempre meglio che dover aggiungere manualmente i dati alla fine di una pagina quando si installa un altro binario.

    
risposta data 28.08.2014 - 22:11
fonte

Leggi altre domande sui tag