OS Linux a jednočipové mikroprocesory.
Pro vývoj firmware jsem v profesionální praxi používal Keil µVision. Pro doma je to ale moc nákladná volba. Hledal jsem, čím to nahradit a to tak aby to fungovalo na Linuxovém desktopu. Poměrně dobrá volba je SDCC. Používám k tomu IDE Kdevelop a Makefile si napíšu sám. Jedinou nevýhodou je hodně špatný debuger. I když se v mnohých ohledech SDCC liší od Keilu – to zjistíme ihned, pokud z programu v C voláme rutiny napsané v assembleru, dá se v něm realizovat i projekt, který má několik tisíc řádek v C. Dokonce jsem zjistil, že některé části kódu se kterými má Keil problémy (elipsis ...) přeloží SDCC bez problémů. SDCC kromě řady X51 umí i HC08 od Motoroly, některé PIC a Z80. Ty jsem sice nezkoušel, ale možná zkusím přes zimu některou malou 8-pinovou Motorolu, která jde programovat po sériovém portu. Z80 už asi nemají velkou budoucnost, PICy jsou sice moderní, ale nic extra na nich nevidím.
Tedy vytvořit doma funkční kód a převést ho do Intel-hex formátu celkem vzato není problém a není ani potřeba kupovat si na to specializovaný software. Horší je nacpat ten hex do švábu. Komerčně vyráběné programátory mají podporu Linuxu nulovou, i když situace se pomalu začíná měnit a velké firmy už začínají brát Linuxový desktop vážně. Nabízí se zde jedna, podle mne dost dobrá možnost – programování obvodu po sériové lince pomocí interního bootloaderu. Např. firma ATMEL nabízí několik typů těchto obvodů, které jsou sice o něco dražší, ale dá se to rozchodit. Dokonce má podporu pro Linux, ale ta se mi moc nelíbila, protože je klikací. Tak jsem si napsal svůj software, který se ovládá z příkazové řádky a tak je možné to zabudovat přímo do Makefile a používat v IDE. Podporuje ale jen obvod AT89C51ED2, jiný jsem nezkoušel.
Zdrojový text programu pro programování obvodů ATMEL AT89C51ED2 pomocí interního bootloaderu po sériové lince. Použitá rychlost je pevně nastavena na 57600 Bd, port je /dev/ttyS0, pokud to chceme změnit, je nutné sáhnout do zdrojáků.
Příklad SDCC Makefile pro projekt Osciloskop:
PR = Osciloskop
CC = sdcc
AS = asx8051
CFLAGS = -D__SDCC__
DFLAGS = --debug
MFLAGS = --model-small
#MFLAGS = --model-large
# default je --iram-size 256
#LFLAGS = --iram-size 128
OFLAGS = -o $(PR).ihx
all: $(PR).ihx
OBJECTS = main.rel \
spec.rel
$(PR).ihx: $(OBJECTS)
$(CC) $(OFLAGS) $(MFLAGS) $(DFLAGS) $(LFLAGS) $(OBJECTS)
clean:
rm -f core *~ \#* *.cdb *.rel *.lst *.map \
*.rst *.sym *.lnk *.bin *.adb *.mem \
*.asm $(PR)
prog:
flip $(PR).ihx
%.rel: %.c
$(CC) -c $(CFLAGS) $(MFLAGS) $(DFLAGS) $<
%.rel: %.a51
$(AS) -ol $<