Mikrokontrolery ARM cz9


K U R S
Mikrokontrolery
z rdzeniem ARM, część 9
Pierwszy projekt
W tej części kończymy prezentację sposobu przygotowania narzędzi tylko do odczytu przypisano jej
atrybuty: wykonywalny oraz tylko
do kompilacji pierwszego projektu. Przedstawione informacje
do odczytu ((xr)). Nazwie DATA
mają charakter uniwersalny i będą pomocne także w przypadku
przypisano obszar pamięci RAM
kompilowania innych projektów, także składających się z wielu
mikrokontrolera znajdujący się
od adresu 0x40000000 (ORIGIN =
plików zródłowych.
0x40000000), a jego wielkość okre-
Gdy kompilowany projekt zawie- Kolejnym plikiem wykorzystywa- ślono na 32 kB (LENGTH = 32K).
ra wiele plików (jak na przykład nym w projekcie jest skrypt linke- Obszarowi pamięci RAM przypi-
przedstawiony na rys. 25 w EP7/ ra lpc2138 rom.ld, który przypisuje sano atrybuty: zapis oraz odczyt
2006) makefile budujemy w sposób poszczególne segmenty kodu i da- ((rw)). Obszar pamięci został tu-
przedstawiony poniżej. nych generowanych przez kompila- taj skonfigurowany dla mikrokon-
W linii: tor w odpowiednie miejsca pamięci trolera LPC2138. W przypadku,
#tutaj wpisz nazwe pliku hex
mikrokontrolera. W tab. 5 przedsta- gdy będziemy tworzyć program
TARGET = test
wiono poszczególne segmenty two- dla innych mikrokontrolerów np.
wpisujemy nazwę test, ponieważ rzone przez kompilator gcc. LPC2131 wystarczy zmienić pa-
plikiem, jaki chcemy otrzymać jest W przypadku mikrokontrolerów rametr LENGTH. Dalszej części
test.hex. W linii SRC wpisujemy LPC213x/214x skrypt możemy napi- skryptu konfiguracyjnego nie bę-
nazwę wszystkich plików zródło- sać w taki sposób, aby kod progra- dziemy musieli zmieniać. Znajdu-
wych napisanych w języku C/C++. mu i dane były umieszczane w pa- ją się tam przypisania odpowied-
Natomiast w linii ASRC wpisujemy mięci Flash, natomiast pozostałe nich sekcji do obszarów pamięci
listę wszystkich plików napisanych dane umieszczane będą w pamięci np.:
w asemblerze. Tak, więc w naszym RAM. Skrypt możemy napisać rów- /* sekcja .rodata zawiera dane sta-
le */
przypadku linie te będą wyglądać nież tak, aby kod programu i da-
.rodata :
{
w sposób następujący: ne znalazły się w pamięci RAM,
*(.rodata)
#pliki zrodlowe
jednak taka konfiguracja może być
*(.rodata.*)
SRC = 1.cpp 2.cpp
*(.gnu.linkonce.r.*)
przydatna najwyżej do testowania
#pliki assemblerowe
} >CODE
ASRC = boot.s 3.s
niewielkich programów. Plik roz-
Ostatnią czynnością będzie poczyna się od definicji obszarów Do obszaru pamięci CODE (czy-
stworzenie zależności pomiędzy i adresów pamięci RAM i ROM: li pamięci Flash) przypisana jest
/* Konfiguracja pamieci */
plikami, mające doprowadzić do sekcja .rodata zawierająca dane sta-
otrzymania pliku wynikowego. Dla łe, które w języku C są zadeklaro-
MEMORY
{
naszego przykładu zależności będą wane jako const.
CODE (xr) : ORIGIN = 0x00000000,
wyglądać następująco: LENGTH = 512K Do omówienia pozostał nam, je-
DATA (rw) : ORIGIN = 0x40000000,
#Zaleznosci pomiedzy plikami w C
scze plik led.cpp, który zawiera pro-
LENGTH = 32K
boot.o: boot.s
} gram generujący efekt węża świetlne-
3.o: 3.s
1.o: 1.cpp lpc213x.h
Sekcja MEMORY zawiera opis go na diodach LED zestawu ZL6ARM.
2.o: 2.cpp lpc213x.h
konfiguracji pamięci. Nazwie Pomimo, iż zastosowanie języka C++
#zaleznosci pomiedzy plikami konco-
wymi
CODE przypisano obszar pamięci do problemu poruszanego w przykła-
$(TARGET).elf: boot.o 1.o 2.o 3.o
lpc2138 rom.ld Flash mikrokontrolera, który znaj- dzie może być traktowane jako prze-
W przypadku, gdy projekt za- duje się od adresu 0 (ORIGIN = rost formy nad treścią, to zdecydowa-
wiera większą liczbę plików zró- 0x00000000), a jego wielkość okre- no się na taki krok, gdyż w ogólnym
dłowych sposób postępowania przy ślona jest na 512 kB (LENGTH = przypadku jest to język znakomicie
tworzeniu makefile jest analogiczny. 512K). Ponieważ pamięć Flash jest nadający się do pisania programów
na mikrokontrolery ARM. Na począt-
Tab. 5. Segmenty wynikowe tworzone przez kompilator gcc ku definiujemy porty, do których są
Nazwa segmentu Opis podłączone diody LED:
.text Segment zawierający kod programu //Definicja LEDow
#define LEDS (0xFF<<16)
.rodata Segment zawierający dane tylko do odczytu
#define LEDDIR IO1DIR
#define LEDSET IO1SET
.ctors Segment zawierający kody konstruktorów C++
#define LEDCLR IO1CLR
.dtors Segment zawierający kody destruktorów C++
.data Sekcja zawierająca dane zainicjalizowane
Kod generujący efekt węża
.bss Sekcja zawierająca dane nie zainicjalizowane
świetlnego zaimplementowano
Elektronika Praktyczna 8/2006
95
K U R S
w klasie CShiftLed, zawierającej
List. 4. Implementacja klasy (pro-
metodę Run(), która powinna być
gram migający diodą LED)
wywołana w pętli głównej progra-
class CLedShift
mu. Klasa jest rozszerzeniem po- {
public:
jęcia struktury z języka C. Posiada
//Konstruktor klasy
ona w sobie zmienne, które tutaj
CLedShift()
dla odróżnienia nazywa się pola- {
//Piny jako wyjscia
mi, ale dodatkowo posiada w so-
LEDDIR |= LEDS;
bie funkcje zwane metodami, które
}
//Metoda Run
operują na polach. Metody są po
void Run()
to, żeby można było chronić dane
{
i wykonywać operacje na danych //Pierwsza dioda
mShift = 1;
chronionych, oraz ułatwić opera-
for(int i=0;i<8;i++)
cje na polach tylko tej danej klasy
{
w danym obiekcie. Metoda, jest to //Zapal wybrana diode
LEDSET = mShift << 16;
prawie to samo, co funkcja, z tym,
//Zgas pozostale diody
że ma ona dostęp do pól klasy.
LEDCLR = ~mShift << 16;
Konstruktor klasy jest to specjal- //Petla opozniajaca
for(int d=0;d<1000000;d++);
na metoda, która jest wywoływa-
//Przesun bit o 1
na zawsze, gdy klasa jest inicjo- mShift <<= 1;
}
wana. Konstruktor jest potrzebny
}
do przydzielenia polom wartości
private:
początkowych lub wykonania in- //Zmienna przechowujaca biezacy
LED
nych czynności koniecznych przy
unsigned char mShift;
tworzeniu obiektu klasy. Konstruk-
};
tor i destruktor nie zwraca żadnej
wartości. Nazwa konstruktora jest
dokładnie taka sama jak nazwa cyklu wywoływana jest pętla opóz-
klasy. Destruktor jest wywoływany, niająca, tak abyśmy mogli dostrzec
gdy klasa nie będzie więcej używa- zmianę stanu diod. Warto tutaj
na i jest ona niszczona. Jest on po zwrócić uwagę na licznik pętli
to, żeby np. zwolnić pamięć przy- opózniającej, który zlicza do milio-
dzieloną dynamicznie. W klasach na. Widać tutaj jak dużą mocą ob-
występują stopnie ochrony danych liczeniową dysponuje zastosowany
określające dostępność danego pola mikrokontroler.
//Funkcja glowna main
lub metody. Stopień private, jest
int main(void)
największym stopniem ochrony.
{
//Klasa diod swiecacych
Dostęp do metod i pól chronionych
CLedShift led1;
tym stopniem jest ograniczony tyl-
//Petla glowna
while(1)
ko do metod będących częścią tej
{
klasy, co oznacza, że są one nie- //Wywolanie cyklicznie metody
RUN
dostępne na zewnątrz. Natomiast
led1.Run();
stopień ochrony public daje swo- }
}
bodny dostęp z dowolnego miejsca
do metod i pól znajdujących się W funkcji main() tworzony jest
pod kontrolą tego modyfikatora. obiekt klasy CShiftLed, a następnie
Implementację klasy przedstawiono w pętli nieskończonej wywoływana
na list. 4. jest metoda Run() tworząca efekt
W konstruktorze klasy CLed- węża świetlnego.
Shift linie P1.16& P1.24 portu P1 Mam nadzieję udało mi się
są ustawiane jako wyjściowe. Pole czytelnikom przybliżyć, chociaż
mShift zadeklarowane jako składo- w stopniu podstawowym procedu-
wa prywatna klasy, przechowuje rę instalacji oraz posługiwanie się
informację o tym, która z 8 diod środowiskiem Eclipse. Nic jednak
LED ma zostać zapalona. Metoda nie jest w stanie zastąpić samo-
Run() powinna być wywoływana dzielnych prób i eksperymentów,
cyklicznie w pętli głównej progra- dlatego do nich gorąco zachęcam.
mu. Realizuje ona cykliczne prze- W kolejnych odcinkach zajmie-
suwanie pola mShift o jeden bit my się poszczególnymi układami
w lewo oraz przepisanie jego do peryferyjnymi mikrokontrolerów
rejestru portu P1, co w efekcie LPC213x/214x.
powoduje wyświetlenie stanu bi- Lucjan Bryndza SQ7FGB, EP
tów pola mShift na diodach LED lucjan.bryndza@ep.com.pl
zestawu ZL6ARM. Na zakończenie
Elektronika Praktyczna 8/2006
96


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery ARM cz1
Mikrokontrolery ARM cz10
Mikrokontrolery ARM cz14
Mikrokontrolery ARM cz8
Mikrokontrolery ARM cz12
Mikrokontrolery ARM cz15
Mikrokontrolery ARM cz21
Mikrokontrolery ARM cz19
Mikrokontrolery ARM cz3
Mikrokontrolery ARM cz6
Mikrokontrolery ARM cz22
Mikrokontrolery ARM cz18
Mikrokontrolery ARM cz18
Mikrokontrolery ARM cz11
Mikrokontrolery ARM cz13
Mikrokontrolery ARM cz17
Mikrokontrolery ARM cz5
Mikrokontrolery ARM cz20
Mikrokontrolery ARM cz7

więcej podobnych podstron