Bootloader használata

Bootloader settings

A bootloader használatához szükségesek a megfelelően előkészített startup kódok, attól függően melyiket kívánjuk használni. Ezek a kódok a crt0.c, crt0i.c és a crt0iz.c fájlokban vannak. Illetve szükséges még a megfelelően megszerkesztett Linker Script és a megfelelő compiler és linker opciók beállítása is.

Példaként nézzük a crt0i.c tartalmának egy döntő részletét, ami alapesetben a reset vektort a 0x0000 címre helyezi:

/*
 * entry function, placed at interrupt vector 0 (RESET)
 */
void _entry (void) __naked __interrupt 0
{
  __asm
    goto    __startup
  __endasm;
}

Mivel a bootloader - ha nem programozó módban indítjuk - átadja a vezérlést 0x1000 címre, ezért az eredetileg 0x0000 címre kerülő reset vektorunkat át kell helyeznünk a 0x1000 címre az alábbiak szerint. Majd a compile paranccsal elő kell állítanunk az object fájlt, amit aztán célszerű valamilyen sokatmondó névre átnevezni.

/*
 * entry function, placed at interrupt vector 0 (RESET)
 */
#pragma code _entry 0x1000
void _entry (void) __naked __interrupt 0
{
  __asm
    goto    __startup
  __endasm;
}

Ezek után a megfelelő Linker script:

// File: 18f4550.lkr
// Sample linker script for the PIC18F4550 processor
 
// Not intended for use with MPLAB C18.  For C18 projects,
// use the linker scripts provided with that product.
 
LIBPATH .
//FILES ../bootloaders/bl_crt0.o   // use --ivt-loc and --no-crt options !
 
CODEPAGE   NAME=bootloader START=0x0    	END=0xFFF	PROTECTED
CODEPAGE   NAME=vectors    START=0x1000 	END=0x1029	PROTECTED
CODEPAGE   NAME=page       START=0x102A        	END=0x7FFF
CODEPAGE   NAME=idlocs     START=0x200000      	END=0x200007	PROTECTED
CODEPAGE   NAME=config     START=0x300000      	END=0x30000D    PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE      	END=0x3FFFFF    PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000      	END=0xF000FF    PROTECTED
 
ACCESSBANK NAME=accessram  START=0x0            END=0x5F
DATABANK   NAME=gpr0       START=0x60           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=usb4       START=0x400          END=0x4FF       PROTECTED
DATABANK   NAME=usb5       START=0x500          END=0x5FF       PROTECTED
DATABANK   NAME=usb6       START=0x600          END=0x6FF       PROTECTED
DATABANK   NAME=usb7       START=0x700          END=0x7FF       PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF       PROTECTED

Ha a Projecthez hozzáadtuk a scriptet, akkor automatikusan az lesz használva, de megadhatjuk a Compiler opcióknál is:
-Wl-s"valamilyen.lkr"

Ezek után még szükséges a Compilert és a Linkert is tájékoztatni, hogy az új crt0xx.o fáljt használja, illetve ha használunk megszakításokat, akkor azokat is a 0x1000 címtől állítsa be.

Project => Project Properties => Options for Compiler:

 --ivt-loc=0x1000

Project => Project Properties => Options for Linker:
 --use-crt="../bootloaders/bl_crt0xx.o"

(Az LKR scriptben elvileg elhelyezhetjük a crt0xx.o fájlt, viszont ebben az esetben a --no-crt paranccsal kell megakadályozni a standard crt0xx.o linkelését.)


Fontos: Mivel az SDCC és a GPUtils GNU-Linux alapú rendszerekre van elsődlegesen fejlesztve, ezért a fájlnevek megadásakor az ott szokásos formát kell használni! Illetve a hosszú fájlnevek használata sem ajánlott. pl.: "Program Files" helyett a "Progra~1" alak a megfelelő, ha abszolút elérést akarunk megadni