cz12.10-2006.PDF

(1493 KB) Pobierz
113105859 UNPDF
Programowanie I
Prouramilowanfle
proeesor6w
[rU ]JQZ!/tiIu
u
GzQsc
12
,'
a
o
W dzisiejszym odcinku napiszemy wlasny
program bootloadera. PrzedstawiEpodstawo-
we informacje o sekcjachpamiqci, ich wyko-
rzystaniu oraz sposobie tworzenia. Aby nasz
bootloader byl jak najmniejszy, czq66 funkcji
bqdzie utworzona w pelnym asemblerze -
pojawi4 siq wiqc informacje, o kt6re pltano
mnie w listach od Czytelnik6w.
Poniewa2 dla wielu os6b pisania bootloa-
dera jest czyms nouym, a w ramach kur;u
BASCOM temat ten nie byl omawiany, zanim
przejdziemy do pisania aplikacji, przedstawiq
skr6towospos6b. wjaki naszprocesorwspie-
ra pisanie takiego programu.
z sekcji RWW mo2e skoriczy6 siq zawiesze-
niem procesora. Druga sekcja nosi ozrlacze-
nie NRWW (No-Read-While-Write), co jak
latwo siq domy5li6 ozracza brak mo2liwoSci
odczyhr podczas zapisu.W praktyce ozracza
to, 2e na czas zapisu do tej czqSci pamiqci
procesor j est zatzryW arry.
Podziat na sekcje RWW i NRWW jest
sztywny i skonstruowany w taki spos6b,aby
sekcja NRWW byla w stanie zmie6cid naj-
wiqkszy, moZliwy dla danegoprocesora, pro-
gram bootloadera. W przypadku naszego
ukladu w ATmega162 sekcja ta zajmuje
ostatnie2KB pamiEci.
Kolejny podzial pamiqci jaki moLnaptzed-
stawii, to sekcja aplikacji oraz sekcja boot-
loadera (BLS). W odr62nieniuod podzialu na
sekcje RWW i NRWW ten podzial nie jest juz
sztywny. Ilo66 pamiEci przeznaczonel rlanasz
program laduj4cy mo2emy ustawid jako 1/8,
Rozmial
BOOTRST=1
o
2-
te
0-
la
.)
BOOTRST=0
:h
z1
rk
Bootloader
a procesory AVR
Aktualnie produkowane procesory AVR
umoZliwiaj4 stworzenie wlasnej aplikacji
laduj4cej. Producent nie umieszcza w nich
2adnego domySlnego programu tego typu.
Oznaczalo, 2e caly trud jego stworzenia spo-
czywa na programiScie. Z drugiej strony, ist-
nieje pelna dowo1no56
Rys. 50 Konfi guracia bootloadera
ki
Uruchomienie programu laduj4cego moZe
nastqli6 na dwa sposoby:
l. Skok z aplikacji do programu laduj4ce-
go majduj4cego siq w sekcji BLS.
2. Reset procesora,w kt6rym zaprogramo-
wano bit BOOTRST.
Szczeg6lnie interesujqca jest druga mo2li-
wo56.Dziqki temu istnieje mozliwo6i urucho-
mienia bootloadera, nawet jeSli aplikacja jest
uszkodzona. Przy stosowaniutakiego rozwi4-
zaniaumawiamy siq zwykle, 2e nasz program
Ladujqcy powinien by6 uruchomiony, je6li
zaraz po zerowaniu procesora wyst4pi jakiS
specjalny sygnal. Mo2e to by6 przykladowo
zwarcie jednego z wyprowadzeri do masy czy
teZ wyslanie odpowiedniego znakt przez
wybrany interfejs. Je6li taka sltuacja nie ma
miejsca, powinniSmy wykona6 skok pod
adres 0. To rozwiqzante jest wygodne tak2e
114, 112 lub
caloSd sekcji
NRWW. Zwi4-
zane z tyrn roz-
miary sekcji
BLS dla proce-
sora ATme-
gal62 pokantje
tabela 9.
11
2568
10
5128
jego dzialania.Do pro-
gramowania moZemy wykorzystad dowolny
interfejs. Mo2e to by(, zar6wno interfejs ju2
istniej4cy, jak i dowolny wymySlony przez
nas samych.
Sp6jrz na rysunek 50. Pokazuje on pewne
podstawowe moZliwoSci konfiguracji boot-
loadera oraz ideqjego dztalania.Pamiq6 pro-
gramu jest podzielona na dwie czqSci.Pierw-
sza z nich to sekcja RWW (Read-While-
Write). Ten, nieco myl4cy, skr6t w praktyce
ozrtacza, 2e w chwili zapisywania sekcji
RWW mo2emy wykonl.wa6 program z sekcji
NRWW. Jednakpr6ba odczytu w tym czasie
01
10248
Ila
tz-
u-
00
20488
Tabela 9 Rozmiar sek-
cji BLS w procesolze
ATmegal62
W sekcji BLS znajdzie siq nasz program
laduj4cy. Istnieje mo2liwoSd zabezpieczeiia
przed zapisemlub odczltem oddzielnie sekcji
BLS i aplikacji. Bootloader mo2e wymieni6
nawet samego siebie. Wymaga to wielkiej
ostro2no6cii je6li mo2liwo56 taka nie jest
konieczna, zaleca siq ustawietie zabezpiecze-
nia przed zapisem sekcji bootloadera.
$zezeg6flr techniczne
Wsparcie dla Bootloadera
a wsparcie dla samoProgramowania
skonfigurowa6 w taki spos6b, aby po rdsecie
startowatr w trybie bootloadera. W takim
przypadku mo2liwe jest zaprogramowanie
procesora,w kt6rym nie ma jeszcze aplikacji
lub teZw kt6r'r/maplikacja zostalauszkodzo-
na, co mo2e siE zdarzy6, je6li podczas
programowania zasilaniezostanieodl4czone.
W ten mechanizm wlrposa2ones4 wszystkie
aktualnie produkowane,,wiqksze" procesbry
w tym rodzina Almega.
Wsparcie dla samoProgramowania
(Self-Programming Support): W tym roz-
wi1zanit nie ma wydzielonej sekcji bootloa-
dera. Instrukcj a zapisu do pamiqci programu
mo2e byt' wylvolana z dowolnego miejsca
programu. W takim przypadku to na nas spo-
czywa odpowiedzialno56 napisania bootloa-
deraw taki spos6b,aby nie uszkodzil on sam
siebie. Z drugiej strony daje to bardzo
\ .ygodna mo2liwoS6 wykorzystania pamiqci
FLASH jako dodatkowej, nieulotnej pamiqci
danych. Rozwi4zanie to jest stosowane
w procesorach, takich jak ATtiny23l3 czy
ATtiny25.
Nasz procesorwyposa2onyjest w bardziej
rozbudowane rozwiqzanie i nim wla6nie
bqdziemy siq dzi6 zajmowal.
W przypadku rodziny procesor6w AVR spot-
kamy siq z dwoma mechanizmami umoZli-
wiaj4cymi napisanie kodu progtamuj4cego
ich pamiqd FLASH.
Wsparcie dla bootloadera (Boot Loader
Support): Pamiq6 procesora podzielona jest
na dwie czqSci.Instrukcja zapisu do pamiq-
ci programu jest aktywna jedynie zpozio-
mu sekcji bootloadera @LS). Rozwi4zanie
to jest o tyle wygodne, 2e procesor mo2na
nh
vll
dlaWszystkich PaZdziernik
2006
39
-
r ^ -rrrfirn
:F
Elektronika
113105859.018.png 113105859.019.png
z tego wzglgdu, 2e bootloader staje sig prak-
ty cznie niewidoczny dla aplikacji.
Nastqpnie do rejestru SPMCR wpisulemy
wartoS60x01 i wykonujemy instrukcjq SPM'
WaZne jest, aby wiedzie6, 2e kaZdy adres
bufora strony mo2e byi zapisany tylko raz'
Aby pojawila sigmo2liwo6i ponownego zapl-
sania danego adresu, konieczne jest jego
wyzerowanie. Bufor ten jest zerowany auto-
malycznie po zakohczeniu procedury zapisu
lub w chwili zerowania procesora. Istnieje
mo2liwodc programowego skasowania
umieszczenia naszego programu w pamlQcl
pod adreseminnym ni2 pocz4tek pamipci.
jest
w strony. Nie ma mo2liwoSci bezpo$redniego
zapisania lub skasowania jednostki mniejszej
niZ strona. Po szczeg6ly, takie jak tozmiar
i liczba stron, naleZy siggn4i do dokumentac-
ji konkretnego mikrokontrolera. ATmegal62
posiada 112 stron w sekcji RWW oraz 16
stron w sekcji NRWW. Ka2da strona ma roz-
miar 64 sl6w 16-bitowYch (1288)'
Do kasowania, zapisu, programowanla
pamiqci FLASH a Lak2ezabezpieczania pro-
gramu sluZy instrukcja SPM. Jej dztalanie
zale|y odustawieir w rejestrzeSPMCR. Aby
zapozna( srg ze znaczeniemwszystkich jego
bit6w, sp6jrz na rysunek 51.
Sekcje pamieci
Umieszczenie dowolnej danej lub funkcji pod
wybranym adresem a2 prosi sig o istnienie
dyrektywy podobnej do ,,at" BASCOMA czy
niekt6rych kompilator6w C dla '51. W AVR-
GCC mamy mo2liwoS6 umieszczenia zmien-
nej lub funkcji pod wybranym adresem, jed-
nakjest to trochg trudniejsze zadante'W tym
celu musimy poznai podstawy sekcji pamiqci'
W naszym programie domy6lnie tworzo-
nych jest kilka sekcji. Tabela 10 pokazule
najwaZniejsze z nich. Zapoznal sig z nimi,
a nastgpnie zwr6i uwagq na podane obok
zakresy ich adres6w Aby odr62nii poszcze-
g6lne przestrzenie adresowe, dla sekcji two-
rzonej w pamiqci RAM do jej adresu musimy
dodai 0x800000. Oznacza to w praktyce"
ze jeSli chcemy wprowadzi6 now4 sekcjq,
kt6ra bgdzie zawierala jakie6 dane, frzycznie
pod adresem0x100, musimy utworzy6 sekcjE
o adresiepocz4tkowl'rn 0x800100' Podobnie
ma siq sprawa z Pamigci4EEPROM.
Mo2emy zmusii kompilator, aby umie6cil
zmiennq w dowolnej sekcji' Sp6jrz na kod
z listingu l44.Tenprzyl<\ad pokazuje, w jaki
spos6butworzyi zmienn4 kt6rej wafio66 nie
bEdziezmieniala siqpo zerowaniu procesora'
Umieszczanie zmiennych bezpoSrednio
w wybranych sekcjach trzeba stosowa6 do$i
rozwa2nie. Wiadomo na przyldad, Ze jeSli
zmiennej umieszczonej w sekcji .noinit
bqdziemy chcieli przypisai wartoSi, kompila-
tor zglosi bl4d. Nie mo2na w ten spos6btakZe
umiescii zmiennej w sekcji lexf.
jego
zawartorici poptzez zapisanie ,,1" do bitu
RWWSRE.
Uwaga: dane z bufora zostanqtakZe utra-
cone, je6li w trakcie jego wypelniania zosta-
nie wykonany zapis do pamigci EEPROM.
Kasowanie stronY
Aby skasowad stronQw rejestrze Z musi zna-
le26 sip jej adres.Wa2ne s4 tylko bity wska-
zuj4ce numer strony. pozostalenie majq zna-
czenia. Do rejestru SPMCR wpisujemy war-
to6i 0x03 i w1-r,votujemy
instrukcjq SPM.
odblokomnlo sekcliRWW.
Podczas aPisusekcjaR\JW isst
blokowanadoodc4/tu (crytana
byejedyniesekcia NRVVry).Po
zakohczsniu
procesu
Zapis bufora do
pamigci FLASH
Zawarto\( bufora mo2e-
my zaptsal jedYnie do
strony, kt6ra jest Pusta
(zostala skasowana).W
rejestrze Z m:usiznale26
siq adres pocz4tku stro-
ny, do kt6rej bgdziemY
siq odwoty'rruai. WszYst-
kie pozostale bttY, Poza
numerem sffony, muszQ
byi wyzerowane. Do
rejestru SPMCR, Pisule-
my wartoS6 0x05
i wywolujemY
instrukcjg SPM.
"':l*"1!!,,Y!**:iiiti:xt::k:::!?:"'?',11l"oi"it"r));
W bardzo podobny spos6b mo2emy w wy-
branej sekcji umiescid funkcjq. Funkcjq
mozemy umiescii jedynie w sekcji odnosz4-
cej sip do pamigci programu a wiqc znajduj4-
cej siq w zakresieadres6w 0x0 do 0xTFFFF'
DomySlnie posiadamy tylko jedn4 takq sek-
cjg, jednak nic nie stoi na przeszkodzie aby
utworzy6 drug4. W tym celu musimy zajrzed
do pliku makefile. Sp6jrz na listing 145'
Rys. 5{ Znaczenie bit6w
w rejestrze SPMCR
Pisanie
bootloadera
W tej chwili wiesz ju2
w jaki spos6b odblva
siE programowanie pamipci procesora. JeSIi
co6 jeszcze jest niezrozumiale, poczekal, az
zaczniemy pisai przykladowy program.
Samo programowanie pamiEci to tylko
ustawianie odpowiednich rejestr6w oraz
wl.rvolywanie instrukcji SPM. Praktycznie
jedynym problemem, z jakim nie mieliSmy
jeszcze do czynienia, jest koniecznoSi
Zapis strony pamiqci programu sklada siq
z trzech element6w:
1 Zapis bufora stronY
2. Kasowanie stronY
3. Zapis bufora do Pamigci FLASH.
Kasowanie strony moze odbYwai sig
zar6wno przed, jak i po wypelnieniu bufora.
Zale|y to od potrzeb naszegoprogramu, a dla
ll
Tabela {O Podstawowe sekcie
programu tworzonego w WinAVR
Sekcja
.text
Zakres PrawidlowYch adres6w
pamiqci nie ma wipkszego znacze-
Sekcjata zawiera kod program*
,r_O od 0x00000000 do 0x0007FFFF
ZnajdujEsie w niejponadtospecjalne sekcie'inito-goraz 'fin
.data TutajmieszczE siezmienne globalneorazstatyczne'
ktore sq inicjowane jakqs wartosci+
.bss Zawierazmienne globalneorazstatyczne,
kt6renie sq inicjowane ZostanEustawione na wartosi domyslnq
.noinit Fragmentsekcji'bss. Zawierazmienne globalneorazstalyczne'
kt6reniesq inicjowane. Po starcie programuich wartoSc
nie jest zmienianaUmozliwia to zachowanie wartosci
niekt6rychzmiennych mimozerowanla procesora
Zawieradanedla Pamieci EEPROM
Ir";r.o"t"t"
od 0x00800000 do 0x0080FFFF
Zapis bufora stronY
Wypelnianie bufora strony odblrva sig za
pomoc4 instrukcji SPM. Do adresowanta
stuZy nam wtedy rejestr Z, przy czym waZna
jest tylko jego czgsi odpowie dz\alna za adres
slowa na danej stronie. Dan4 do zapisania
musimy umieSci6 w rejestrach Rl:R0.
od 0x00800000 do 0x0080FFFF
od 0x00800000 do 0x0080FFFF
od 0x00810000
do 0x008'lFFFF
40
PaZdziernik
2006 Elektronika
dlaWszYstkich
Programowanie Pamieci
FLASH
Zapis danych do pamiqci programu nie jest
tak prosty jak zapis do pamiqci RAM czy
EEPROM. Pamiqi ta zorganizowana
zapisu,
wpisanie 1 do tego bitu i wykonanie
instrukciiSPM odblokowuje sekcje
RWW do odczytu.
113105859.020.png 113105859.021.png 113105859.001.png 113105859.002.png 113105859.003.png 113105859.004.png
www ,alarmu-ge
tard.pl
Wida6 na nim fragment opcji linkera, kt6ry
powinieneS odszuka6 oraz liniq, kt6r4nale2y
dopisa6. Aby wszystko dzialalo prawidlowo,
nalezy jeszcze wcze6niej ustawi6 zmiennq
BOOTSTART. Dla wygody proponujq zrobi6
to na samym pocz4tku pliku, zgodnie z listin-
giem 146. Zwracam uwagQ na to, ze adres
pocz4tku sekcji liczony jest w bajtach, a nie
w slowach. Bajt o numerze 0x3800 odpowia-
da slowu 0zlC00. Adres ten odpowiada
wybraniu najwiqkszegodostqpnego rozmiaru
botloaderadla ATmegal62.
testowej aplikacjiskonfrguruje-
my pbrtkez wySwietlaczem LED' Wy6wiet-
lacz wrykorzystamy w bardzo ograniczony
spos6bjako zestawdiodSwiec4cych
nam sprawdzi6, jak funkcjonuje umieszczenie
funkcji w sekcji .bootloader. Program nie po-
winien w1'rnaga6specjalnych wyja6nief. Jego
zadaniem jest wySwietlenie na wy6wietlaczu
kreski, gdy uruchomiono program gl6wny'
a kropki, gdy wylvolana zostalafinkcja boot.
do wska-
zywania aktualnegostanu programu.
Konfiguracja procesora do PracY
z bootloaderem
Jeszczezanim program zostanie wyslany do
procesora,dobrze byloby dokonai jego konfi-
guracji. Wykorzystamy do tego celu progra-
mator BASCOM'a ze wzglqdu na jego czytel-
noS6i pogl4dowo6i.
Bity, kt6re tzeba zmreni(, zostaty wyt62-
nione na rysunku 53. ZatwaL zawartoi| roz-
wijalnej listy dotycz4cej wektora resetu.
Wpisz program do procesora,a nastQpnlewy-
pr6buj dwie r62ne warto6ci w tym miejscu.
Zgodnie z oczekiwaniem, zal,e2nre od usta-
wienia bitu BOOTRST uruchomiona zostanie
albo aplikacja (funkcja main), albo bootloader
(funkcja boot), co objawi siq wySwietleniem
na wySwietlaczukeski w pierwszl'rn przy-
padkuikropkiwdrugim.
sprzqtuutw6rz nowypro-
jekt (w materialach dodatkowYch
nazwalem go bootsect). Dodaj do
niego plik makra.h z poprzedniego
lwiczenia. W standardowl,rn pliku
makefile wprowadZ zmianY wY-
szczegolnione na listingach 145
orzz 146, IJtut6rz ptste phki hard-
def.h oraz bootsect.c.
Do pliku harddef.h wpisz zawar-
to56listingu 147. Listing ten opisu-
je calkowicie nasz komputerek w konfigurac-
ji z wy6wietlaczem LED. Listing 148 to pro-
pozycjaprostego programu,kt6ry pozwoli
Listing 145 Twonenie nowej sekcji
4. --- Linker Options ---
# -wI,.. :
tell Gcc to pass this to linker.
t.
#
-N4ap:
create mapfile
#
-cref:
add cross reference to mapfile
: -wl,-Map=$(TARGet).map,-cref
LDFLAGS += $ (EXTT4EI'4OPTS)
LDFLAGS += $(PRINTF-LIB) $(SCANF_LIB)$(il4ATH_LIB)
# Wprowadzenie nowej sekcji
LDFLAGS+= -Wl,-section-start=. bootloader=$(BOOTSTART)
,-
v
Listing 146 Zmienna okreilaiqca poczqtek nowei sekcji
BooTSTART : OX38OO
Adrssstrony.\trybiera strone
dokasowania orazzapisu.
"iN
)d
ki
Adrcsslowanadanejskonie.Musi byc
r6wny0 w chwili zapisywaniastrony'
Listing 148 Tut umiuzczenia funkcii w sekcji bootloader
#i nc.lude <avr,/i o. h>
#include "harddef.h"
#inc'iude "makra,h"
a.
lo
IA
Rys.52 Adresowanie Pamiqci
FLASH
do zapisu
ill
ft
a-
ze
Wiemy juZ jak umieSci6 now4 sekcje
w procesorze. Zaraz spr6bujemy umieScid
w niej wybran4 funkcjq.
int main(void)
t
,/,/ Konfiguracja portow
eonr(couronr) = 1<<coM1l1<<coM2
|
1<<coM3 | 1<<coM4 ;
DDR(LEDPoRT) = oxff;
DDR(coMPoRr) = 1<<coM1 | 1<<coM2|
1<<coM3 | 1<<coM4 ;
,// wy6wietlenie kreski
eonr(lrleonr) = -(1<<LED A);
ponr(collponr) G -(1<<coM1);
4Y
.q-
]t
lF.
)k-
,by
rc6
45.
Listing 14 7 Plik harddef .h
Rys. 53 Konfiguracia Procesora
do pracy z bootloaderem
#i fndef HA,RDDEF,H_INCLUDED
#defi ne HARDDEF-H*TNcLUDED
#define LED-A 4
#defire LED-B 3
#detlne Lru_L )
#define LED-D 2
#define LED-E 6
#define L€D:F 0
#define LED-G7
#define LED-DP 1
#define LEDPORT B
#define c0M1 5
#define coM2 4
#define coFll 3
#define coM4 2
#define CON4P0RT
return 0;
Dwa podej5cia
do tworzenia bootloadera
Zastan6wmy sigprzez chwilq, jak dziala ptzry -
klad, kt6ry wla6nie stworzyli6my. Gdy wektor
zerowaniajest ustawiony na pocz4tek naszej
sekcji bootloadera, wywo\wana jest znajdu-
j4ca siq na jej pocz4tku funkcja boot. W in-
nym przypadku wywolywana jest funkcja
main. Czy to na pewno wygl4da tak prosto?
Ot62 sqk tkwi w tym, 2e nie. W przypadku
normalnego zerowania,zanim rozpocmie siE
wykonl rvaniefunkcji main, wykonywana jest
voi d
uoot (voi d)
/,/ Konfi guracja port6w
eonr(coueonr) = l<<coMl l1<<coM2|
1<<coM3| 1<<coM4 ;
DDR(LEDPORT)
= oxff;
onn(couponr) = 1<<coM1 | 1<<coM2 |
1<<coM3 | 1<<coM4;
// wySwietlenie kropki
eonr(lnoronr) = -(1<<LED DP);
ponr(couponr) G -(1<<coM1);
D
#define SwPoRTE
#define 5w1 0
#define 5w2 2
for(;;)
t)
#endaf / / HARDDEF-H-TNCLUDED
$zczeg6llt techniecne
Wady tworzenia bootloadera
przez umieszczanie funkcii
w specialnei sekcii
umieszczona na jej pocz4tku.
Marnowanie zasob6w: Bootloader two-
rzony razemz aplikacj4jest razem znt4kom-
pilowany. Oznacza to, 2e wykorzystlrwane
przez niego zasoby dodaj4 siq do zasob6w
wykorzystywany ch przez aplikacj E.
Problemy z symulacj4: Aktualna wersja
A\rRStudio nie chcewczytywa6 kodu maszy-
nowego z sekcji innej niZ .text. W takrm
przlpadku instrukcje C pojawiaj4 siq, jednak
nie ma mo2liwoSci ich przesymulowania.
Konieczno56 niskopoziomowego pano-
wania nad aplikacj4: Rozwi4zaniewymaga
samodzielnej inicjacji stosu oraz zmiennych
albo pisania calego kodu w asemblerze.
Trudno5ciw zapanowaniu nad kodem:
IJmieszczaj4ckilka funkcji w sekcjibootloa-
dera, nie mamy pewnoSci,kt6ra zostanie
^L
Elektronika
dla Wszystkich
PaZdziernik
2006
41
Przygotowanie do Pisania
aplikacji
Do pierwszej,
Pierwszy program - testuiemY
mo2liwo56 umieszczenia funkcii
w nowej sekcii
Po przygotowaniu
LDFLAGS
113105859.005.png 113105859.006.png 113105859.007.png 113105859.008.png 113105859.009.png 113105859.010.png 113105859.011.png 113105859.012.png 113105859.013.png 113105859.014.png 113105859.015.png
I Programowanie
domySlna inicjacja. Zajrzyj do tabeli 11. Opis
sekcji .init0-9 pokazuje jednocze6nie, co
dzieje siq z naszym programempo urucho-
mieniu. Zapamiqtaj tqtabelkE. Zauwa2 jedno'
czesnie,2e co druga sekcja jest wolna' Umo2-
liwia nam to umieszczeniewlasnej funkcji na
dowolnym etapie uruchamiania systemu.
Przekonamy siq w przyszlo\ci, 2e bywa to
bardzo walne.
Zanim uruchomimy
pnzerwania
Bootloader to zwykle prosty program
i zaprzqganie do jego dzialania przerwari
czqstookazuje siq zbqdne.W przykladowych
programach nie bqdziemy korzystali z tej
mo2liwo6ci. ChcE jednak zaztaczy{ 2e aby
przerwania tzialaty prawidlowo w programie
traduj4cym,trzeba koniecznie przesun46 ich
wektory na pocz4tek sekcji BLS. Musimy to
Gzg6ci wsp6lne
dla nasrych bootloader6w
W naszym boo{oaderze wykorzystamy utwo-
rzorry w czgsci 7 kursu prosty modul obslugi
portu RS232. Ze wzglqdrt ra zaJmowane
miejsce nie bqde przedstawial tutaj calego
programu, postu2q siq jedynie fragmentami.
Caty kodjest dostqpnyna Elportalu.
Na listingu 151 widzimy makro wykonu-
jqce skok do aplikacji. Nie ma w nim nic
magiczrego, ale wygodniej w programie
korzysta6 z makra ntL powtarza6 jawnie
odpowiedni4 wstawkq asemblerow4' Na lis-
tingu 152 tworzymy bufor na dane strony
pamiqci. Do obliczenia jego rozmiaru wyko-
rzystujemy stal4 deklarowan4 dziqki dolqcze-
niu nagl6wka <avr/io.h>,li:t6ra okreSla roz-
miar strony pamiqci w bajtach.
Tabefa 11 Znac;zenie sekcii .inito-9
N
I
.inito
JeSli programistastworzyfunkcjg _initO zostanieona wywolanawla6nie z tej sekcji.
,iniil
.init2
.ini$
.init4
.lnit5
.init6
,init7
.init8
,initg
Do wykorzystania przez programistQ'
Skok do funkcji mainO
Listing I 5I Makro skoku do aplikacii
#define :prp-0O asm volatile("jmp
0": :)
Listing I52 Bufor a pamipci MM na pruesylane dane
uintB_t g-pagebuf f Islu-eaensrzr]
;
Listing 149Przesuniqciesekcji programudo obszaruBLS
#-------- Linker options --------
# -wl,...:
tell Gcc to pass this to linker.
zrobi( jeszcze przed ich
aktywacj4 - najlepiej na
samym pocz4tku funkcji
main. W razie potrzebY,
przesuniEcie przerwarl
umoZliwi prosty kod z listin-
gu 150.
Listing153O
WDT
void in
tribute ( (naked) );
-tvlap:
create maPfile
#
att;Ibu
);
-cref:
add cross reference to map file
#
void
ini
oid)
: -WI,-Map=$(TARGET).MAP,-CTCf
LDFLAGS+: $(EXTMEI4OPTS)
LDFLAGS +: $(PRINTF-LIB) $(SCANF_LIB) $(N'IATH-LIB)
# Przesuniecie sekcji programu do obszaru BLS
LDFLAGS +: -Wl.-section-start=.text=$(BOOTSTART)
t
if(ucucsx & 1<<wDRF)
rup oO;
l
Chwilki wyja6nienia wymaga listing
153. Utworzona w tym miejscu funkcja
zapewnia,2e jeSli wystqlitro zerowanie
spowodowane przepelnieniem licznika
WDI natychmiast zostanie uruchomio-
na aplikacja. Gdy w programie pojawia
wehoriw przemari
// tktywacja przesuwania wektor6w przerwai
crcR = 1<<rvcE;
// erzeniesienie wektor6w przerwa6 do BLS
GICR = I<<IVSEL;
To co jest dla nas wa2ne tetaz, to fakt,
2e przy utworzonym ptzez nas programle,
gdy uruchamiamy go w trybie bootloadera,
przed wywolaniem funkcji boot nie jest
wykonywana inicjacja stosu! Nasz program
dziala zgodnie z oczekiwaniami tylko dlatego,
2e jestbardzo prosty. Ju2 wywolanie jakiej-
kolwiek innej funkcji z poziomt funkcji boot
moze sprawi6, 2eprocesorodm6wi pracy.Nie
jest to jedyna wada rozwiqzania, ale wszyst-
kie wynikaj4 z tego,2e staramy siEpisa6 jed-
noczesnie program bootloadera otaz samq
aplikacjq. Takie dzialanie ma sens tylko
wjednym przypadku: JeSlichcemy, aby apli-
kacja mogla zapisywai do pamiqciprogramu.
mo2emy gdzie6 na koricu sekcji bootloadera
umieScii funkcjE da11ca tak4 mo21iwo66
(przypominam, 2e instrukcja SPM dziala
tylko z sekcji BLS). Do pisania funkcjonalne-
go bootloadera wygodnie jest podej66 trochq
rnaczeJ.
Tym razem bootloader bEdziemy pisa6
jako samodzieln4 aplikacjE.Nam6wimy jedy-
nie linker, aby umieScil caly program w wy-
ranym miejscu pamiqci. Mo2na to zrobid
w bardzo prosty spos6b: przeniefmy cal4 sek-
c1e,
ldea rozwiazania
Komunikacia z bootloaderem
Zanim zaczniemy tworzyd aplikacj q bootloa-
dera, powinniSmy zastanowii siq, jak chce-
my sig z nim komunikowad. W naszym przy-
padku wykorzystamy interfejs RS232'
Aby uruchomic bootloader. komputermusi.
w czasienie dlu:2szym niz sekundaod zero-
wania procesora,wyslai. bajt tworz4cy znak
' ! '. Je6li bajt taki zostanieodebrany, bootloa-
der odpowiada znakiem potwierdzenia '@"
\M tym momencie, aby wej56 w tryb bootlo-
adera konieczne jest przeslanie ci4gu
'boot\n'. Bootloader odpowiada w taki sam
spos6bi od tej chwili przyjmuje ju2 polece-
nia. Skomplikowanie wej6cia do bootloade-
ra, ma na celu unikniqcie przypadkowego
jego wl4czenia.
Komendy maj4 postai pojedynczych liter.
Obslugiwane bqd4 nastqpuj4cekomendy:
q - wyjScie z programu bootloadera i skok
do aplikacji.
i - identyfikacja, mikrokontroler odpowiada
laricuchem z razwqurz4dzenia; nazwa kofr-
czy siq znakiem '\n'.
v - wersja bootloadera; sterownik odpowia-
da dwoma bajtami w kodzie binamYm'
m - informacja o pamiEci; sterownik podaje,
w kodzie binarnym: rozmiat strony, liczbq
stron mo2liwych do zaprogramatia oraz licz'
bq stron w pamiqci eeprom.
w - zapis danych do bufora; dane przesylane
w postaci binamej
r odczyt danych z bufora; dane przesylane
w postacibinarnej
f - zapis bufora do pamiqci flash
e - zapis bufora do pamiEci eeprom.
Zwracam uwagE na brak moZliwoSci
odczytywania pamiqci - to najlepsze zabez-
pieczenie przed kopiowaniem naszego kodu'
Istnieje natomiast mo21iwo66 sprawdzenia
danych wpisanych wcze6niej do bufora. Daje
to mo2liwoSi sprawdzenia, zanim przeSlemy
bufor do zapisania,czy w transmisji nie poja-
wily siq przeklamania.
Je6li sterownik $Ykryje nieznan4 komen-
dq, odpowiada znakiem zapyt.ania. W pro-
gramie przyjqto zasadq, 2e tam gdzie naleiy
potwierdza6 dane,' @' oznacza prawidlowe
dzialanie a '#'
\
I
I
.text zgodnie z listingiem 149.
Teraz program bootloadera mo2emy pisa6
identycznie jak ka2dqinnq aplikacjq. Niekt6-
rzy doceni4 tak2e moiIiwo$6 wykorzystania
orzerwaf w bootloaderze.
oznacza wyst4pienie blqdu
(brak potwierdzenia).
,.{
42
PaZdziernik
2006
LDFLAGS
Listiilg I50Preeniesienie
113105859.016.png
)l
siq funkcja _init0, kompilator umieszcza j4
w taki spos6b , 2e bgdzie ona wryolana zaraz
po resecie procesora (patrz tabela 11).
Koniecznie musi to byi funkcja z atrybutem
naked (gola). Brak tego atrybutu powoduje
dodanie przez kompilator dodatkowegokodu,
kt6ry powoduje zawieszenie aplikacji. JeSli
aplikacja korzysta z WDT, w przypadku
wyst4pienia jego przerwania walne jest, aby
jak najszybciej powr6ci6 do wykony',vanego
programu. Ponadto, czQstow tego typu apli-
kacji stosujesiq zmienne umieszczonew sek-
cji .noinit, gdziewa2ne jest zapamiqtanie war-
to6ci w chwili wystqpienia zerowania.
W miejscu gdzie aplikacja ma takie dane,
bootloader mo2e miei zmienne inicjowane.
W takim przypadku gdyby uruchamianiebylo
kontynuowane, warto5ci zmiennych aplikacji
ulegtyby straceniu. Rozwi4zanie z listingu
153 sprawia, 2e caly bootloader jest bardziej
..przezroczysry"dla aplikacji.
Samo przejScie w tryb programowania
przedstawiam w szarejramce ,,Komunikacja
z bootloaderem". Nie bqdq omawial tego
fragmentu kodu ze wzglqdu na to, 2e nie
wnosi on nic nowego. Tak samo pominiemy
obslugq komend: ,rg", ,ri" oraz ,rv". S4 one
latwe do zrozvmienia na podstawie udostqp-
nionych kod6w.
o organizacji pamiqci. Jej zasadniczqczqS(
pokazuje listing 154. Interesuj4cy punkt
zaznaczylem kolorem. Obliczanie iloSci do-
stgpnych dla aplikacji stron odbywa siE na
podstawie informacji o miejscu w kt6rym
umieszczony zostal bootloader. ZauwaZ, 2e
zmienna BOOTSTART zostala utworzona
w pliku makefile i kompilator C nic o niej nie
wie. Jak wiqc umo2lwi6 jej wykorzystanie?
Rozwi4zania s4 dwa:
1. Zdeklarowac ztpelnie niezale2nie stal4
BOOTSTART w pliku harddef.h.
2. Przeslac wartoS6zniennej BOOTSTART
do kompilatora C z poziomlupliku makefile.
O ile pierwsze rozwi4zanienie wymaga
wyja6nieri, z drugiego jeszcze nie korzystali6-
my. Opis znajduje siq, razem z listingiem
155, w niebieskiej ramce.
Program mohesz wypr6bowa6 razem ze
znajduj4cym signa Elportalu programem slu-
iqcym do wysylania kodu programu.
Bqdziesz mial wtedy okazjg zatwaLy{ 2e
program jest ladowany wyru2nie szybciej ni2
ptzez prosty interfejs ISP.
,0
L
Pelny asembler
Bootloader jest programem, na kt6ry mamy
niewiele miejsca. Jest to dobre miejsce
do wypr6bowania swoich mo2liwoSci w napi-
saniu duzego fragmentu kodu w asemblerze.
Przepiszemy teraz ra asembler funkcjq zapi-
suj4cqbufor do pamiqci FLASH.
t-
lc
5-
rJ
)-
a-
z-
Rys. 54 Zmiana ustawieri dotllcz4ca
plik6w.S
WczyQrwanie
ofaz wysylanie strony
Poniewa2 program byl pisany w najprostszy
moZliwy spos6b, dane do zapisu do pamiqci
s4 wysylane w postaci ci4gu liczb binarnych.
Brak jest jakiegokolwiek zabezpieczenia
przed przeldamaniami. Dlatego zostal wpro-
wadzony mechanizm umoZliwiaj4cy odczyta-
nie zapisanej strony. Po wyslaniu strony pro-
gramu a jeszczeprzedjej zapisem.program
mo2e dokonad sprawdzenia poprawnoSci
danych. Praktyczne pr6by wykazaly,2e mimo
tak prostego rozwiqzania, przeklamania pod-
czastransmisji s4bardzo rzadkie.
U2lrwanie w kodzie pro-
gramu stalej BOOTSTART
Ciekawy drobiazg wystEpuje w odpowiedzi
na komendE ,rm"
Listing 156 - kod komendy 'f
'
lg
p
1e
(a
U-
1a
uint16 t page;
// oczekiwanie na potwirdzenie
rs put('f');
if('@' != rs qetO)
conti nue;
// pobranie adresu
page = rs getO;
paqe l= (uint16_t)rs_qetO<<8;
// przeslanie adresu do kontroli
rs_put(page & Oxff);
rs put(page >> 8);
if('@' != rs qetO)
conti nue ;
///////// //// //// /// ///// ////// //
// Procedura zapisu
uint16 t i;
..;.+o +*
- wypisanie informacji
B.ootloader z .wykotryst?- -
infomacji opamiqci
// aozniar strony (w bajtach)
rs put((srla paeusrze)&Oxff) ;
rs put((spu peersrzu)>>8) ;
// tloi( stron
rs_put ((eoorsranr/2/srla eacrs r zr)&0xf f ) ;
rs_put ((goorsranr/2/spru pecrs r zr)>>8) ;
// tloi( stron eeprom
rs put (((rztlta+L) /2 / spyt paersrze)&Oxf f) ;
rs_put (( (s2rNo+t) / 2 / spv pacES r zE)>>8) ;
niem wsparcia avr-libc 1.4
Listing 156 pokazuje czqS6kodu wykonywa-
n4 na komendg ,,P'. Zwr66 szczeg6ln4uwagq
na spos6b wykorzystania funkcji z pliku
<avr/boot.h>. Takie napisanie bootloadera
jest wygodne tbardzo pogl4dowe.
aEc.."ccc
Wsparcie bootloadera
przez avr-libc 1.4
Gdy postanowimy do naszego programu
dotrqczyl plik nagl6wkowy <adboot.h>,
uzyskamy dostqp do wygodnych funkcji
umo2liwiaj4cych napisanie programu ladu-
j4cego. Dla nas najwa2niejszes4nastqpuj4-
ce funkcje:
bootlage_erase(adres) - przygotowuje
kasowanie strony.Adres jest adresembajto-
lYym.
boot_page_fill(adres, dana) - wpisuje
16-bitow4 dan4 do bufora strony.
boot_page_write(adres) - zapisuje bufor
strony do pamiqci FLASH.
boot_rww_enableQ -
e
Frr-!
- - p-eebuff;
ABC...GGC
Deklaracja stalych dla preproce-
sora G z poziomu pliku makefile
W WinAVR tytulowe dzialaniejestbardzo
proste,trzebawiedziei tylko czegoszuka6.
Listing I 55 Dqliniowanie stalych dla kompilatora C
w pliku makefle
# P-lace -D or -U options here
CDEFS = -DF-CPU=$(F-CPU)UL
CDEFS +: -DBOOTSTART=$(BOOTSTART)
e
eeprom busy waitO;
boot page erase(page);
// oczekiwanie na skasowanie pamiqci
boot_spm_busy_wait O ;
// wypelnianie bufora strony
for (i=0; i<sPM PAGESTzE; i.F2)
'I
;
a
rr.,-*-L,.rr P--,-+;
ry a= (*pbuff++) << 8;
boot page titt(page + i, w);
// zapisanie bufora do pamiqci
boot_page_write (page) ;
// oczekiwanie na zakoriczenie operacji
boot_spn busy waitO;
// ektywacja sekcji RWW
boot rww enabfeO;
// <oniec zapisu
//// //// // // //// //// ///// //// ////
v
Szuka6musimy czego6,co pokazuje listing
155.Opcia:
-Dna2wa=ci
ag-znakow
odpowiada umieszczeniuw ka2dyrn kompi-
L-
odblokowanie zajq-
v
W tym miejscu znajdujemy wyjaSnienie,
jak to siq dziele, 2e w kodzie moZemy
korzvstai ze stalei F CPU.
tej sekcji RWW.
boot_spm_busy$ - sprawdza,czy instruk-
cja SPM jest zajqta.
boot_spm_busy_wait0 - czeka na zakoh-
czetie dzialania instrukcii SPM.
u
// eotwierdzenie dokonania zapisu
rs put('@') ;
)n
Elektronika
dlaWszvstkich PaZdziernik
2006
43
T
Listing154Wjpisywanie
113105859.017.png
Zgłoś jeśli naruszono regulamin