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?