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
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.
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
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
)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
Plik z chomika:
jacek_040
Inne pliki z tego folderu:
cz01.05-2005.PDF
(2017 KB)
cz02.06-2005.PDF
(1475 KB)
cz03.07-2005.PDF
(2027 KB)
cz05.10-2005.PDF
(2238 KB)
cz06.12-2005.PDF
(1896 KB)
Inne foldery tego chomika:
Alfanumeryczne wyświetlacze LCD (zxpro)
ARDUINO
arduino en
Arduino(1)
arduino(2)
Zgłoś jeśli
naruszono regulamin