Top www
Listing 145 Tworzenie nowej sekcji
#--Linker Options--
4 -Wl,...: tell GCC to pass this to linker.
4 -Map: create map tile
4 -cref: add cross reference to map file
LOFLAGS - -w I,-Map-KTARGETJ.-nap,-cref
LOFLAGS ♦- JCEXTMEM0PTS;
LDFLAGS +* l(PRINTF_LIB) S(SCANF_LIB) 5(MATH_L1B)
4 wprowadzenie nowej sekcji
LDFLAGS ♦ • -w',-s«etion-start=.hoorload«»r=$CBOOTSTART)
Listing 146 ćmienna określająca początek nowej sekcji
BOOTSTART = Ox3BOU | |
Z-pointer 1 |
Adres strony. Wybiera stron* dc kasowania oraz zapisu. |
Widać na nim fragment opcji linkera, który powinieneś odszukać oraz linię, którą należy dopisać. Aby wszystko działało prawidłowo, należy jeszcze wcześniej ustawić zmienną BOOTSTART. Dla wygody proponuje* zrobić to na samym początku pliku, zgodnie z listingiem 146. Zwracani uwagę na to, żc adres początku sekcji liczony jest w bajtach, a nie w słowach. Bajt o numerze 0x3800 odpowiada słowu OzlCOO. Adres ten odpowiada wybraniu największego dostępnego rozmiaru botloadera dla ATmegal62.
Do pierwszej, testowej aplikacji skonfigurujemy płytkę z wyświetlaczem LED. Wyświetlacz wykorzystamy w bardzo ograniczony sposób jako zestaw diod świecących do wskazywania aktualnego stanu programu.
Pierwszy program - testujemy możliwość umieszczenia funkcji w nowej sekcji
Po przygotowaniu sprzętu utwórz nowy pro-jckt (w materiałach dodatkowych nazwałem go bootsect). Dodaj do niego plik makra.li z poprzedniego ćwiczenia. W standardowym pliku makęfile wprowadź zmiany wyszczególnione na listingach 145 oraz 146. Utwórz puste pliki hcrnl-def.h oraz bootsect.c.
Do pliku harddęf.h wpisz zawartość listingu 147. Listing ten opisuje całkowicie nasz komputerek w konfiguracji z wyświetlaczem LED. Listing 148 to propozycja prostego programu, który pozwoli nam sprawdzić, jak funkcjonuje umieszczenie funkcji w sekcji .bootloader. Program nie powinien wymagać specjalnych wyjaśnień. Jego zadaniem jest wyświetlenie na wyświetlaczu kreski, gdy uruchomiono program główny, a kropki, gdy wywołana została funkcia bool.
Konfiguracja procesora do pracy z bootloaderem
Jeszcze zanim program zostanie wysiany do procesora, dobrze byłoby dokonać jego konfiguracji. Wykorzystamy do tego celu programator BASCOM’a ze względu na jego czytelność i poglądowość.
Bity, które trzeba zmienić, zostały wyróż nione na ry sunku 53. Zauważ zawartość roz-wijalncj listy dotyczącej wektora resetu. Wpisz program do procesora, a następnie wypróbuj dwie różne wartości w tym miejscu. Zgodnie z oczekiwaniem, zależnie od ustawienia bitu BOOTRST uruchomiona zostanie albo aplikacja (funkcja mam), albo bootloader (funkcja boot), co objawi się wyświetleniem na wyświetlaczu kreski w pierwszym przypadku i kropki w drugim.
Rys. 52 Adresowanie pamięci FLASH do zapisu
X12I -slZLfeJ U Ii
■H
Fu..Ut<M USfr.H^ln^uotm. FumW KB/ Ml O CKSa-OO 9 HhmI RC C
Fu*.ME 'Ci.eW.ncO FwmWF tOiuMaSTAC OEnwhn
Fu. Wal
Fu.afat M. ClLUąjłmł w)t! j1.1 'i: ^
IS 1 S_P tpcłrwr
Wiemy już jak umieścić nową sekcje w prucesorze. Zaraz spróbujemy umieścić w niej wybraną funkcję.
listing 147 Plik harddęf.h
fffndef H4KL>utł'_H_iNCLUDtu
#define harddef_h_included
#define LED_A 4 #defiie LED_B 3 #defiie led_C 5 #defiie LED_D 2 rfdcfine led_e 6 rfdefine LED_F 0 #define LCD_G 7 #define LCD„DP 1 rfdeflne LEDPORT b #definc COMl S rfdefine COM2 4 #define COM3 3 #define COM4 2 #define COMPORT p tfdefine SWPORT E jKdefine SWl C #define SW? 7
#endif //HARDDEF H INCLUDED
Listing !4S Test umieszczenia .funkcji w sekcji .booiloailer tfinclude <avr/io.h>
tfinclude "harddęf.h"
#include “makra.h"
vo1d boot(void) attribute
(GesticnC. .Dootloader")));
int main(void)
(
// Konfiguracja portów PORT(COMPORT) - l«COMl | l«COM2 | i«C0M311«CQM4;
DDRCLEDPDRrj - Oxff;
DDR(COMPORr) - 1«CCM111<C0M2|
L«C0M3 | l«COM4 J
ff wyświetlenie kreski
PORT(LEDPORT) ■ ~(l«Lt:D A);
portCcjmpokt) &- ~Ci« lmi) ; return 0;
>
void boot(void)
{
// Konfiguracja portów PORT(COMPORT) - l«OOMl | l«COM2 |
1«CDM3 | l«COM4 ;
ddr(ledfdrt) - 0xff;
DOR (COMPORT) - l«COMl|l«CCM2| 1<<OM3I1<<COM4S
// wyświetlenie kropki port(ledport) - ~(1«LEC_CP); port(comport) L- ~(1«ccmi);
forC;;)
U
Rys. 53 Konfiguracja procesora do pracy z bootloaderem
Zastanówmy się przez chwilę, jak działa przykład, który właśnie stworzyliśmy. Gdy wektor zerowania jest ustawiony na początek naszej sekcji bootloadera, wywoływana jest znajdująca się na jej początku funkcja boot. W innym przypadku wywoływana jes; funkcja main. Czy to na pewno wygląda tak prosto? Otóż sęk tkwi w tym, że nie. W przypadku normalnego zerowania, zanim rozpocznie się wykonywanie funkcji main. wykonywana jest
Szczegóły techniczne Wady tworzenia bootloadera przez umieszczanie funkcji w specjalnej sekcji
Trudności w zapanowaniu nad kodem:
Umieszczając kilka funkcji w sekcji bootloadera, nie mamy pewności, która zostanie
umieszczona na jej początku.
Marnowanie zasobów: Bootloader tworzony razem z aplikacją jest razem z nią kompilowany. Oznacza to, że wykorzystywane przez niego zasoby dodają się do zasobów wykorzystywanych przez aplikację.
Problemy z symulacją: Aktualna wersja AYRStudio nie chce wczytywać kodu maszynowego z sekcji innej niż ,text. W takim przypadku instrukcje C pojawiają się, jednak nie ma możliwości ich przesymulowania.
konieczność niskopoziomowego panowania nad aplikacją: Rozwiązan e wymaga samodzielnej inicjacji stosu oraz zmiennych albo pisania całego kodu w asemblerze.
Elektronika dla Wszystkich Październik2006 41