85_88.pdf
(
107 KB
)
Pobierz
C dla mikrokontrolerów 8051, część 9
K U R S
Wiêkszoæ kompilatorów jêzyka C oferuje szereg ró¿nych
modeli pamiêci. Który z nich wybraæ? Jakie kryteria wyboru stosowaæ? Jaki
wp³yw ma zastosowany model kompilacji na optymalizacjê kodu wynikowego
oraz czas wykonywania programu przez mikrokontroler?
czêæ 9
Konfiguracje pamiêci mikrokontrolera 8051 dla programów napisanych
w jêzyku C, czêæ 1
Podstawy: fizyczne lokalizacje
segmentów pamiêci
Prawdopodobnie najbardziej irytu-
j¹cym podczas pisania programów
dla mikrokontrolerów 8051 i pochod-
nych jest fakt, ¿e posiadaj¹ one kil-
ka ró¿nych obszarów pamiêci zaczy-
naj¹cych siê od tego samego adresu.
Inne mikrokontrolery, dla przyk³adu
z rodziny 68HC11, maj¹ ci¹g³¹ prze-
strzeñ adresow¹, w której poszczegól-
ne obszary pamiêci umieszczone s¹
kolejno jeden za drugim, w zale¿no-
ci od tego, czy istniej¹ w danym
mikrokontrolerze, czy te¿ nie. Jest to
zgodne z konfiguracj¹ pojedynczego
obszaru pamiêci wed³ug za³o¿eñ von
Neumana.
W mikrokontrolerze 8051 pamiêæ
podzielono na kilka czêci dostêp-
nych na ró¿ne sposoby. Aby dobrze
zrozumieæ zasady u¿ycia poszczegól-
nych rodzajów pamiêci i modeli kom-
pilacji, musimy przyjrzeæ siê bli¿ej
temu podzia³owi i miejscom fizycznej
lokalizacji komórek pamiêci.
Pierwszy z segmentów nazywa siê
DATA. Mowa tu o wewnêtrznej pa-
miêci RAM mikrokontrolera zwanej
segmentem danych. Zaczyna siê on
od adresu 0x00 i koñczy pod adre-
sem 0x7F (127 dziesiêtnie). G³ówne
przeznaczenie tego segmentu pamiêci
to przechowywanie zmiennych wyko-
rzystywanych przez program w czasie
pracy. Obszar ten dostêpny jest jako
adresowany bezporednio. Znajd¹ tu
zastosowanie instrukcje asemblera
z grupy MOV A,n - MOV n,A.
Od adresu 0x80 umieszczony jest
tak zwany rejestr funkcji specjalnych
SFR (
Special Function Register
), któ-
ry równie¿ mo¿e byæ adresowany
bezporednio. Powy¿ej adresu 0x80,
do adresu 0xFF, rozci¹ga siê czêæ
drugiego obszaru pamiêci RAM, zwa-
nego IDATA, który mo¿e byæ adreso-
wany wy³¹czenie porednio. Znajduj¹
tu zastosowanie instrukcje z grupy
MOV A,@Ri (i=0 lub i=1).
Standardowe wersje mikrokontrole-
rów 8051 s¹ wyposa¿one w 128 baj-
tów pamiêci DATA. Dodatkowy seg-
ment IDATA pojawi³ siê w momencie
wprowadzenia do sprzeda¿y mikro-
kontrolerów z rodziny 8052. Segment
ten nie jest czêci¹ pamiêci DATA.
Rozci¹ga siê od adresu 0x00 do
0xFF i mo¿e byæ adresowany wy³¹cz-
nie porednio. Z zwi¹zku z tym dob-
rze jest stosowaæ go nie w celu za-
pamiêtywania zmiennych, ale z prze-
znaczeniem na stos mikrokontrolera.
Jednostka centralna bêdzie wtedy
u¿ywa³a tego segmentu, adresuj¹c go
za porednictwem wskanika stosu.
Oczywicie pisz¹c programy w jêzyku
C, trudno jest wywrzeæ wp³yw na to,
do czego kompilator bêdzie wyko-
rzystywa³ obszar IDATA. Jest to mo¿-
liwe tylko poprzez zmianê paramet-
rów linkera, jednak wymaga to grun-
townej wiedzy na temat zasad funk-
cjonowania kompilatora oraz daleko
posuniêtej ostro¿noci przy wprowa-
dzaniu zmian. Opisan¹ tutaj zasadê
nale¿y stosowaæ podczas pisania pro-
gramów w asemblerze, natomiast
w przypadku C zalecam zdaæ siê na
autorów kompilatora, chyba ¿e jakie
specjalne powody zmuszaj¹ do inne-
go podejcia.
Obszar IDATA nak³ada siê na ob-
szar rejestru SFR. Jawnie widaæ tu
pewn¹ sprzecznoæ: IDATA dziel¹cy
wspólnie przestrzeñ adresow¹ z SFR
mo¿e byæ adresowany tylko pored-
nio, natomiast do SFR maj¹ dostêp
instrukcje adresowania bezporednie-
go! Aby by³o ciekawiej, obydwa te
segmenty znajduj¹ siê w obszarze we-
wnêtrznej pamiêci RAM mikrokontro-
lera. Czyli patrz¹c na to od strony
programisty 8051 - to do jakiego ob-
szaru pamiêci zapisywane czy z jakie-
go odczytywane s¹ dane, zale¿y od
sposobu w jaki zostanie zaadresowa-
ny ten sam obszar pamiêci. Ten sam
w znaczeniu fizycznie wpisywanego
adresu, nie za segmentu pamiêci
mikrokontrolera. Pomo¿e to zrozumieæ
poni¿szy fragment programu asemble-
rowego:
MOV 0A0H,#dana;zapis do obszaru
;SFR, w tym przypadku do P2
;(równoznaczny zapis to
;MOV P2,#dana)
MOV R0,#0A0H
MOV @R0,#dana ;zapis do obszaru
;IDATA (nie do P2!)
Pierwsza linia przyk³adowego pro-
gramu zapisuje dane do obszaru SFR,
w tym przypadku jest to port P2.
Druga i trzecia linia, mimo ¿e powo-
duj¹ zapis bajtu pod ten sam adres,
to jednak u¿ywane jest adresowanie
porednie (adresowanie za pomoc¹
rejestru R0) i bajt zostaje zapisany
w segmencie IDATA, a nie jak po-
przednio w SFR. Warto o tym pamiê-
taæ, tworz¹c w³asne aplikacje.
Trzeci segment pamiêci, nazywa-
ny CODE, równie¿ rozpoczyna siê od
adresu 0x0000, ale zarezerwowany
jest na pamiêæ programu. Typowo
obszar ten zajmuje adresy od 0x0000
do 0xFFFF (65536 bajtów) i jeli u¿y-
wany jest mikrokontroler 8031, to
segment ten w ca³oci pod³¹czany jest
z zewn¹trz w postaci dodatkowego
uk³adu pamiêci ROM. Niektóre mik-
rokontrolery, np. 8051, posiadaj¹ jed-
nak wewnêtrzn¹ pamiêæ ROM, pe³ni¹-
c¹ tê sam¹ rolê. Segment pamiêci
programu dostêpny jest przez instruk-
cje wykorzystuj¹ce do adresowania
licznik rozkazów PC oraz 16-bitowy
rejestr DPTR. Oczywicie w segmen-
cie CODE mog¹ byæ przechowywane
wy³¹cznie wartoci sta³e, takie jak
tablice danych, a przede wszystkim
instrukcje programu wykonywanego
przez mikrokontroler.
Czwarty segment pamiêci, nazywa-
ny XDATA (czasami mo¿na siê spo-
tkaæ z okreleniem XRAM), równie¿
znajduje siê poza mikrokontrolerem.
Zaczyna siê od adresu 0x0000 i tak,
jak segment CODE, koñczy siê pod
adresem 0xFFFF. Jedna uwaga: oma-
wiaj¹c przestrzeñ adresow¹ pamiêci
CODE czy XDATA, opisujê mo¿liwoæ
jej fizycznego rozszerzenia, a nie
przymus zajmowania ca³ego dostêpne-
go obszaru przez dane urz¹dzenie
(uk³ad) pod³¹czone w tej przestrzeni
adresowej.
W zestawie rozkazów 8051 mo¿na
znaleæ tylko jedn¹ metodê dostêpu do
Elektronika Praktyczna 2/2003
85
K U R S
Rys. 1
do obszaru CODE aktywowany jest za
pomoc¹ PSEN. Dostêpem do obszaru
XDATA steruj¹ zewnêtrzne sygna³y
READ (odczyt) i WRITE (zapis). Wy-
prowadzenie PSEN nie bierze udzia-
³u w cyklu dostêpu do danych za-
wartych w segmencie XDATA.
Aby odró¿niæ polecenia dostêpu
do danych zawartych w segmencie
XDATA od pozosta³ych, wprowadzo-
no specjalne instrukcje zawieraj¹ce
w swej nazwie literê X:
MOV DPTR,#08000H
;zapamiêtaj dan¹ zawart¹
;w akumulatorze pod adresem
MOVX A,@DPTR
;0x8000 w pamiêci XDATA
Ten alternatywny tryb dostêpu do
pamiêci XDATA jest podstawowym
dla modelu COMPACT. Zauwa¿, ¿e
jeli Port 2 pod³¹czony jest do star-
szych linii adresowych, mo¿e on pra-
cowaæ jako prze³¹czany przez aplika-
cjê kontroler stron pamiêci.
Istotn¹ do zapamiêtania informa-
cj¹ jest to, ¿e wyprowadzenie PSEN
przyjmuje stan niski, jeli pobierany
jest kod instrukcji, natomiast wypro-
wadzenia READ i WRITE podczas
wykonywania przez CPU rozkazu
MOVX. Litera X w symbolu polecenia
jêzyka asembler mikrokontrolera 8051
oznacza rozkaz zwi¹zany z urz¹dze-
niem pod³¹czonym z zewn¹trz, akty-
wowanym za pomoc¹ READ lub
WRITE.
ca³ego segmentu XDATA za pomoc¹
pojedynczego rozkazu. S³u¿¹ do tego
instrukcje wykorzystuj¹ce do adresowa-
nia rejestr DPTR. Niemniej jednak ca-
³y obszar XDATA (od adresu 0x0000
do 0xFFFF) mo¿e byæ te¿ dostêpny
w trybie stronicowania. Do adresowania
pamiêci w obszarze 256-bajtowej strony
jest tu u¿ywany omiobitowy rejestr
R0 lub R1. W tym przypadku starsz¹
czêæ adresu (numer strony) trzeba
ustawiæ rêcznie np. poprzez wpisa-
nie odpowiedniej wartoci do P2.
Trzeba przy tym pamiêtaæ, ¿e P2 nie
bierze aktywnego udzia³u podczas ta-
kiego adresowania (nie pe³ni funkcji
szyny systemowej). Równie dobrze mo-
¿e byæ wykorzystany inny rejestr lub
nawet tylko jego czêæ. Obszar ten na-
zywany jest PDATA (
rys. 1
).
Pojawia siê pytanie: w jaki sposób
jednostka centralna mikrokontrolera
8051 rozró¿nia fizycznie inne i o in-
nym przeznaczeniu obszary pamiêci?
W jaki sposób kod instrukcji progra-
mu pobierany jest spod adresu
CODE:0x0000, zamiast DATA:0x00?
Odpowied tkwi w budowie mikro-
kontrolera. Gdy CPU ¿¹da dostêpu do
segmentu DATA, za³¹czany jest we-
wnêtrzny RAM przez wewnêtrzny
sygna³ odczytu READ - odpowiednik
tego sygna³u wyprowadzany na ze-
wn¹trz (wyprowadzenie READ mikro-
kontrolera) nie zmienia siê.
Odczyt i zapis bajtu z wykorzysta-
niem akumulatora w trybie adresowa-
nia bezporedniego mo¿na uzyskaæ za
pomoc¹ poleceñ:
MOV A,40H
;odczyt bajtu spod adresu 0x40
MOV 40H,A
;zapis bajtu pod adres 0x40
Jest to podstawowy tryb dla mo-
delu pamiêci SMALL.
Odczyt bajtu z wykorzystaniem
trybu adresowania poredniego z seg-
mentu IDATA za porednictwem aku-
mulatora i rejestru R0 wygl¹da nastê-
puj¹co:
MOV R0,#0A0H
;odczyt bajtu z segmentu IDATA
;znajduj¹cego siê pod adresem
MOV A,@R0
;0xA0 do akumulatora
Ten tryb adresowania u¿ywany
jest do dostêpu do porednio adreso-
wanych komórek pamiêci IDATA le-
¿¹cych powy¿ej 0x80 i jest alterna-
tywn¹ metod¹ dostêpu do danych le-
¿¹cych poni¿ej tego adresu.
W obrêbie segmentu DATA znaj-
duje siê równie¿ obszar nazywany
BDATA. Jest to szesnacie bajtów
(128 bitów) zajmuj¹cych przestrzeñ
adresow¹ od 0x20 do 0x2F w obsza-
rze adresowania bezporedniego. Spe-
cjaln¹ cech¹ tego obszaru jest to, ¿e
oprócz instrukcji MOV maj¹ zastoso-
wanie równie¿ instrukcje operuj¹ce
na pojedynczych bitach i wykorzystu-
j¹ce specjalny tryb adresowania poje-
dynczych bitów.
Zewnêtrzna pamiêæ ROM (segment
CODE) nie jest za³¹czana podczas do-
stêpu do RAM czy XDATA (XRAM).
Jej wyborem steruje sygna³ PSEN
(
Program Store Enable
) - zmiana po-
ziomu wyprowadzenia PSEN na niski
uaktywnia pamiêæ programu. Nazwa
wyprowadzenia sygna³u jest jedno-
czenie sugesti¹, ¿e g³ówn¹ rol¹ pa-
miêci ROM jest przechowywanie in-
strukcji programu.
Pewn¹ ciekawostkê stanowi fakt,
¿e jeli mikrokontroler posiada we-
wnêtrzn¹ pamiêæ ROM (FLASH, EP-
ROM), to w cyklu dostêpu do tej pa-
miêci stan zewnêtrznego, wyprowa-
dzenia PSEN nie zmienia siê dot¹d,
a¿ przekroczony zostanie obszar ad-
resowania wewnêtrznego ROM. Po
tym fakcie mikrokontroler wykonuje
normalny cykl dostêpu do zewnêt-
rznej pamiêci programu wyprowadza-
j¹c przez porty P0 i P2 adresy oraz
pobieraj¹c instrukcje do wykonania
z zewnêtrznej pamiêci ROM. W takiej
sytuacji, jeli zewnêtrzna pamiêæ
ROM jest ulokowana od adresu
0x0000, to bajty le¿¹ce poni¿ej koñ-
ca adresu wewnêtrznej pamiêci ROM
(na przyk³ad dla 4 kB bêdzie to ad-
res 0x1000) nie bêd¹ dostêpne.
Pod³¹czone do mikrokontrolera
z zewn¹trz segmenty XDATA oraz
CODE nie s¹ ze sob¹ w konflikcie.
Ich rozdzia³ jest przeprowadzany
przez zewnêtrzne sygna³y steruj¹ce.
Jak wczeniej wspomnia³em, dostêp
Dostêpne modele pamiêci
Pisz¹c program dla mikrokontrole-
ra 8051, pierwsza decyzja, któr¹ mu-
sisz podj¹æ to taka, jaki model pa-
miêci wybierzesz. Podczas gdy pro-
gramista komputera PC dokonuje wy-
boru pomiêdzy modelami TINY,
SMALL, MEDIUM, COMPACT, LAR-
GE i HUGE, aby kontrolowaæ jak u¿y-
wane s¹ segmenty pamiêci RAM
komputera PC, programista 8051 pla-
nuj¹cy swoj¹ aplikacjê musi podj¹æ
decyzjê na podstawie tego, gdzie
znajduj¹ siê dane niezbêdne podczas
pracy mikrokontrolera.
Popularnie u¿ywane kompilatory
Keil i Raisonance aktualnie obs³uguj¹
nastêpuj¹ce konfiguracje pamiêci:
1. ROM - najwiêkszy rozmiar
zbioru obiektu, który mo¿e powstaæ
po kompilacji, to 64kB, jakkolwiek
znacznie wiêksze rozmiary pamiêci
ROM (do 1 MB - kompilator Keil, do
4 MB - kompilator Raisonance) mog¹
byæ obs³ugiwane w trybie prze³¹cza-
nych banków pamiêci (BANKED) opi-
sanym w dalszej czêci artyku³u.
Zmienne mog¹ byæ deklarowane przy
u¿yciu s³owa kluczowego
code
umieszczaj¹cego je w pamiêci progra-
86
Elektronika Praktyczna 2/2003
K U R S
mu mikrokontrolera. Nazwa zmienne
jest tu myl¹ca, poniewa¿ zadeklaro-
wana, na przyk³ad tablica mo¿e pe³-
niæ rolê wzorca - nigdy za zmien-
nej.
Tab. 1.
Nazwa segmentu
Zalecany do...
Nie zalecany do...
pamiêci
DATA
· Czêsto u¿ywanych danych
· Zmiennych tablicowych i struktur
Rozmiar 128 bajtów,
wymagaj¹cych szybkiego dostêpu.
zawieraj¹cych wiêcej ni¿ kilka -
2. RAM - dostêpne s¹ trzy mode-
le pamiêci: SMALL, COMPACT
i LARGE:
- SMALL - wszystkie zmienne zosta-
j¹ umieszczone w wewnêtrznej pa-
miêci mikrokontrolera
- COMPACT - zmienne zostaj¹ zapa-
miêtane w segmencie pamiêci PDA-
TA, adresowanej przez port P0 (z
bankami prze³¹czanymi przez P2).
U¿ywany jest tryb adresowania po-
redniego. Wewnêtrzne rejestry mik-
rokontrolera s¹ w dalszym ci¹gu
u¿ywane do przechowywania lokal-
nych zmiennych i parametrów.
- LARGE - zmienne i parametry prze-
chowywane s¹ w zewnêtrznej pa-
miêci adresowanej za porednict-
wem @DPTR. Wewnêtrzne rejestry
mikrokontrolera w dalszym ci¹gu
u¿ywane s¹ do przechowywania
zmiennych i parametrów.
- BANKED (prze³¹czane banki pamiê-
ci) - program mo¿e zajmowaæ do
1 MB - kompilator Keil lub 4 MB
- kompilator Raisonance. Pamiêæ
prze³¹czana jest w formie stron
o rozmiarze 64kB ka¿da za pomoc¹
innych ni¿ w³aciwe dla P0 i P1
wyprowadzeñ mikrokontrolera albo
te¿ za pomoc¹ zatrzasków
latch
umieszczonych w przestrzeni adre-
sowej, powy¿ej adresu 0xFFFF.
Ka¿dy 64 kB blok pamiêci progra-
mu musi posiadaæ ustawiony tak
zwany blok wspólny (COMMON
AREA) dla biblioteki funkcji prze-
³¹czaj¹cej banki pamiêci.
Firma Raisonance wprowadzi³a do
swojego kompilatora dodatkowy mo-
del pamiêci TINY, który jest iden-
tyczny z modelem SMALL z t¹ ró¿ni-
c¹, ¿e podczas kompilowania progra-
mu generowane s¹ instrukcje ACALL
i AJMP, zamiast LCALL i LJMP. Limi-
tuje to rozmiar obszaru pamiêci pro-
gramu do 2 kB i jest u¿yteczne szcze-
gólnie dla mikrokontrolerów, które
nie obs³uguj¹ lub nie potrzebuj¹ in-
strukcji LCALL i LJMP, czyli maj¹-
cych do 2 kB pamiêci ROM w swojej
strukturze (AT89C2051, 87C751 itp.)
oraz nieposiadaj¹cych na zewn¹trz
wyprowadzeñ PSEN, READ i WRITE.
W Keilu mo¿na korzystaæ z dyrektywy
ROM, np. #PRAGMA ROM(SMALL)
spowoduje u¿ywanie wy³¹cznie rozka-
zów ACALL i AJMP.
Mo¿liwe jest równie¿ ³¹czenie
poszczególnych modeli pamiêci tak,
aby zmusiæ kompilator do lokowa-
nia zmiennych i danych w okrelo-
domylny dla modelu
· Procedur obs³ugi przerwañ, które
kilkanacie bajtów.
SMALL
powinny byæ wykonywane bardzo
szybko, powinny u¿ywaæ obszaru
DATA, poprzez lokaln¹ deklaracjê
funkcji jako stosuj¹cej model
SMALL.
· Czêsto wywo³ywanych podprogra-
mów pobieraj¹cych czy przekazu-
j¹cych du¿¹ liczbê parametrów.
· Stosu funkcji typu
re-entrant
.
IDATA
· Zmiennych tablicowych i struktur · Du¿ych tablic i struktur oraz
128 lub 256 bajtów,
o ograniczonym do oko³o 32 baj-
zmiennych z wymaganym krótkim
nie jest przypisany
tów rozmiarze.
czasem dostêpu.
do ¿adnego z modeli
Uwaga:
suma rozmiarów struktur
kompilacji
i zmiennych tablicowych nie
powinna przekraczaæ 64 bajtów.
· Stosu mikrokontrolera (lokowany
jest on w obszarze IDATA i adreso-
wany porednio przy pomocy SP).
CODE
· Sta³e programu.
· Zmiennych.... To jest ROM, wiêc
64kB
· Du¿e tablice konwersji
nie mog¹ byæ tu zapisywane
· PLUS oczywicie instrukcje
¿adne zmienne.
programu!
PDATA
· Funkcji obs³ugi przerwañ o niezbyt · Du¿ych tablic i struktur o rozmia-
256 bajtów,
krytycznym czasie wykonywania.
rze przekraczaj¹cym 256 bajtów
obszar domylny
· Zmiennych typu
char
, niedu¿ych
· Bardzo czêsto u¿ywanych danych
dla modelu COMPACT
tablic i struktur o wymaganym oraz zmiennych wykorzystywa-
krótkim czasie dostêpu. nych przez procedury obs³ugi
· Doskona³a do zmiennych, które przerwañ
musz¹ byæ monitorowane w czasie · Zapamiêtywania zmiennych typu
rzeczywistym podczas uruchamia-
single, float, double itp.
nia programu przy pomocy ICE.
XDATA
· Du¿ych tablic i struktur o rozmiarze · Bardzo czêsto u¿ywanych danych.
do 64kB,
powy¿ej 256 bajtów.
· Zmiennych wykorzystywanych
domylny dla modelu
· Zmiennych o niezbyt krytycznym
przez procedury obs³ugi
LARGE
czasie dostêpu.
przerwañ.
· Zmiennych rzadko u¿ywanych.
· Zapamiêtywania zmiennych typu
· Doskona³a do zmiennych, które
single, float, double itp.
musz¹ byæ monitorowane w czasie
rzeczywistym podczas uruchamia-
nia programu przy pomocy ICE.
nych segmentach pamiêci, pod
okrelonym adresem.
aby aplikacja pracowa³a efektywnie.
W przypadku mikrokontrolerów z serii
8052/8032 deklaracje zmiennych
w przestrzeni IDATA powy¿ej adresu
0x80 mog¹ pozwoliæ aplikacji na
uzyskanie dodatkowej przestrzeni do
przechowywania zmiennych. Nale¿y
jednak pamiêtaæ, ¿e obszar ten u¿y-
wany jest równie¿ na stos mikrokon-
trolera.
Model SMALL mo¿na tak¿e stoso-
waæ przy kompilacji nawet bardzo
du¿ych programów, umieszczaj¹c
obiekty du¿e i takie, do których nie
jest wymagany bardzo szybki dostêp,
w zewnêtrznej pamiêci RAM. Dobrze
jest tam równie¿ ulokowaæ zmienne,
które musz¹ byæ dostêpne w czasie
rzeczywistym podczas uruchamiania
urz¹dzenia z mikrokontrolerem przy
pomocy emulatora, poniewa¿ emula-
tory (takie jak produkowane przez
Hitex albo Raisonance) maj¹ bezpo-
redni dostêp do tego segmentu pa-
Wybór najlepszego modelu
pamiêci
Model TINY nie nastrêcza ¿ad-
nych trudnoci przy wyborze. Stosu-
je siê go raczej do bardzo ma³ych
programów. Dla wiêkszoci aplikacji
wykonywanych dla mikrokontrolera
8051 wystarczaj¹cy jest model
SMALL. Stosuj¹c go mo¿na równie¿
u¿ywaæ zewnêtrznej pamiêci znajdu-
j¹cej siê w segmencie PDATA. Dostêp
do niej uzyskuje siê za pomoc¹ in-
strukcji MOVX A,@Ri i MOVX @Ri,A.
SMALL - pamiêæ RAM, 128
bajtów
U¿ywaj¹c modelu SMALL, nale¿y
zredukowaæ do minimum liczbê
zmiennych globalnych u¿ywanych
w programie. Pozwoli to linkerowi na
nak³adkowanie funkcji w taki sposób,
Elektronika Praktyczna 2/2003
87
K U R S
List. 1.
#pragma COMPACT
/* model SMALL */
void SmallFunc() small
{
List. 2.
#pragma COMPACT
void fast_func() SMALL
{
..... kod.....
}
Kompilator Raisonance ustawia
port P2 i zezwala na tryb stronico-
wania automatycznie. Podczas pracy
linkera parametr PDATA(ADDR) musi
byæ ustawiony aby powiedzieæ linke-
rowi pod jakim adresem znajduje siê
obszar PDATA.
printf(%s\n,Hello!);
}
/* model LARGE */
void LargeFunc() large
{
w COMPACT, nadal u¿ywane s¹ re-
jestry mikrokontrolera.
Wybór modelu pamiêci
Model pamiêci, zarówno dla na-
rzêdzi firmy Keil jak i Raisonance,
wybiera siê przy pomocy polecenia
#pragma
umieszczonego w pierwszej
linii programu. Format polecenia jest
nastêpuj¹cy:
#pragma <Model Pamiêci>
np.
#pragma LARGE
Domylnie u¿ywany jest model
SMALL i jak wspomniano wczeniej,
mo¿e on mieæ zastosowanie równie¿
do ca³kiem sporych programów, za-
pewniaj¹c pe³n¹ funkcjonalnoæ seg-
mentów PDATA i XDATA dla danych
o niezbyt krytycznym czasie dostêpu.
Kompilatory C pozwalaj¹ równie¿ na
lokalne definiowanie modeli pamiêci
przyporz¹dkowanych do indywidual-
nych funkcji. Konsekwencj¹ tego jest
fakt, ¿e w obrêbie pojedynczego mo-
du³u, funkcje mog¹ zostaæ zadeklaro-
wane jako SMALL, COMPACT lub
LARGE (
list. 1
).
Program napisany w jêzyku C mo-
¿e zawieraæ wszystkie mniej wa¿ne
funkcje skompilowane jako COMPACT
oraz funkcje krytyczne pod wzglêdem
czasu wykonywania (np. obs³ugi
przerwañ) skompilowane jako SMALL.
Mo¿e to jednak w po³¹czeniu z u¿y-
ciem polecenia
#pragma
doprowadziæ
do niezamierzonych efektów pracy
linkera, do komunikatów typu MUL-
TIPLE PUBLIC DEFINTION (wielo-
krotna definicja funkcji). Powód jest
taki, ¿e podczas kompilowanie mo-
du³ów jako COMPACT kompilator
tworzy odniesienia do biblioteki fun-
kcji w³aciwej dla tego modelu a fun-
kcje kompilowane z wykorzystaniem
modelu SMALL bêd¹ korzysta³y
z biblioteki funkcji dla SMALL. Pod-
czas pracy linkera, dla przyk³adu
dwie definicje
putchar()
pochodz¹ce
z dwóch ró¿nych bibliotek mog¹ zo-
staæ odnalezione.
Rozwi¹zaniem jest ustawienie jed-
nego globalnego modelu i nastêpnie
u¿ycie atrybutu SMALL opisywanego
w poprzedniej sekcji do ustawienia
modelu pamiêci lokalnie (
list. 2
).
Jacek Bogusz, AVT
jacek.bogusz@ep.com.pl
printf(%s\n,Hello!);
Wybór optymalnego segmentu
dla danych
Podsumowuj¹c: mikrokontroler
8051 oferuje piêæ segmentów pamiêci
dostêpnych dla danych, z których
ka¿dy ma swoje pewne specyficzne
cechy. W
tab. 1
przedstawiamy kilka
wskazówek, u³atwiaj¹cych dobór mo-
delu do aplikacji.
}
/* program g³ówny */
void main()
{
SmallFUnc();
LargeFunc();
}
miêci. Ten model najlepszy jest rów-
nie¿ dla aplikacji o krytycznym cza-
sie wykonywania, jako ¿e gwarantuje
on najszybszy dostêp do zmiennych
i parametrów przez funkcje, podczas
gdy du¿e obszary danych mog¹ zo-
staæ umieszczone poza uk³adem mik-
rokontrolera.
Uwagi dotycz¹ce stosowania
modelu COMPACT
Przestrzeñ XDATA jest adresowa-
na przez DPTR, który umieszcza po-
³ówki 16-bitowego adresu w portach
P0 i P2. Model COMPACT u¿ywa
równie¿ R0 jako 8-bitowego wskani-
ka, który umieszcza adres w tylko
w porcie P0...P2. Jest on pod pe³n¹
kontrol¹ u¿ytkownika i poniewa¿ jego
wyprowadzenia po³¹czone s¹ z linia-
mi adresowymi uk³adu pamiêci, pe³-
ni rolê prze³¹cznika jej stron. Kom-
pilator nie posiada informacji na te-
mat stanu portu P2 i dopóki u¿yt-
kownik nie ustawi jego wartoci bê-
dzie ona niezdefiniowana, zazwyczaj
równa 0xFF. Domylnym dla zmien-
nych modelu COMPACT jest obszar
PDATA adresowany za pomoc¹ R0.
Linker ³¹czy zmienne XDATA oraz
PDATA i umieszcza te ulokowane
w obszarze PDATA od adresu 0x00.
Niekoniecznie jest to intencj¹ progra-
misty - czasami zmienne mog¹ znaj-
dowaæ na której z kolejnych stron
pamiêci. Kompilator jednak u¿ywaj¹c
jako domylnego segmentu PDATA
adresuje go za porednictwem R0 nie
ustawiaj¹c tym samym wartoci por-
tu P2 odpowiedniej dla po¿¹danej
strony pamiêci RAM. Tak wiêc w re-
zultacie program COMPACT nie bê-
dzie pracowa³ poprawnie.
Kiedy u¿ywa siê kompilatora Keil
bardzo wa¿ne jest aby wartoæ PPA-
GE zawart¹ w zbiorze
startup.a51
ustawiæ na znan¹ wartoæ - dobrym
wyborem jest 0x00. Sta³a PPAGEE-
NABLE musi byæ ustawiona na 1
aby w³¹czyæ tryb stronicowania pa-
miêci. Zaniedbanie tych nastaw za-
owocuje bardzo niebezpiecznymi wy-
nikami, jako ¿e dane bêd¹ lokowane
w zale¿noci od przypadkowej warto-
ci portu P2.
COMPACT - pamiêæ RAM
256 bajtów poza uk³adem,
128 lub 256 bajtów
w uk³adzie
COMPACT to model pamiêci do-
stosowany do programów, gdzie dla
przyk³adu wewnêtrzny RAM mikro-
kontrolera przeznaczony jest na
zmienne systemu operacyjnego. Model
ten jest rzadko u¿ywany dla ca³ego
programu. Najbardziej u¿yteczna kom-
binacja to jego po³¹czenie z modelem
SMALL u¿ywanym lokalnie dla pro-
cedur obs³ugi przerwañ. COMPACT
stosuje siê przede wszystkim do pro-
gramów zawieraj¹cych du¿¹ liczbê
zmiennych, które nie wymagaj¹ krót-
kiego czasu dostêpu. Odbywa siê on
bowiem za pomoc¹ instrukcji MOVX
A,@Ri wykorzystuj¹cej tryb adresowa-
nia poredniego przy pomocy rejest-
ru R0 lub R1. COMPACT mo¿e byæ
równie¿ bardzo u¿yteczny dla aplika-
cji wymagaj¹cych stosu o du¿ym roz-
miarze, co mo¿e oznaczaæ koniecz-
noæ umieszczenia go w zewnêtrznej
pamiêci RAM poza uk³adem mikro-
kontrolera.
LARGE - pamiêæ RAM do
64kB poza uk³adem, 128 lub
256 bajtów w uk³adzie
Model LARGE pozwala na niezbyt
szybki dostêp do bardzo du¿ego ob-
szaru pamiêci RAM i jest przypusz-
czalnie naj³atwiejszy w stosowaniu.
Podobnie jak poprzednio, niezbyt
czêsto u¿ywa siê go w niezale¿nie -
najczêciej jest stosowany w po³¹cze-
niu z modelem SMALL. Tak jak
ród³o:
Embedded Systems Academy
http://www.esacademy.com/
88
Elektronika Praktyczna 2/2003
Plik z chomika:
wilo1981
Inne pliki z tego folderu:
1.pdf
(343 KB)
129_130.pdf
(347 KB)
133_134.pdf
(168 KB)
136_137.pdf
(132 KB)
138_140.pdf
(218 KB)
Inne foldery tego chomika:
01.03
03.03
04.03
05.03
06.03
Zgłoś jeśli
naruszono regulamin