Zadania dla WSISIZ:

Transkrypt

Zadania dla WSISIZ:
Temat:
Wykorzystanie łącza szeregowego do ładowania programów wykonywalnych i
wymiany danych z komputerem PC.
Ćwiczenie 2.
(sd 2)
1.Zagadnienia teoretyczne
Zadanie postawione w tym ćwiczeniu polega na rozwiązaniu problemu ładowania kodu wykonywalnego
do STRC51. W pamięci wewnętrznej 89C51 (odpowiednika 80C51 instalowanego w STRC51),
znajduje się oprogramowanie monitora. Za pomocą tego programu możliwe jest po wyzerowaniu
(RESET) mikrokontrolera załadowanie zbiorów wykonywalnych w formacie Intel HEX i ich
uruchomienie. Pliki w formacie HEX są wynikiem kompilacji programów za pomocą pakietu SDCC.
1.1.Format plików HEX –Intel.
W praktyce wykorzystuje się wiele różnych formatów szesnastkowych. Najbardziej popularnymi są
opracowania Intela i Motoroli. Dla skupienia uwagi opis będzie dotyczył formatu Intel.
Przykładowy plik wygląda następująco:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
Ogólny schemat rekordu wygląda następująco:
Znacznik Długość
początku rekordu
rekordu
1 – znak 2 – znaki
Adres
rekordu
Typ
Rekordu
Dane
Suma
kontrolna
4 – znaki
2 – znaki
2*N – znaków
2 – znaki
Każda linia zaczyna się znacznikiem początku rekordu (znak ‘:’). Jest to cecha tego typu formatu pliku.
Po tym znaku następuje informacja określająca wielkość rekordu (w przykładzie kolejno 10, 10, 0b,
00-specjalny rekord). Informacja ta określa ilości bajtów będących danymi, (zapisanymi w formacie
HEX - pierwszy znak określa wartość wpisywaną do czterech starszych bitów a następny znak określa
cztery młodsze bity).
Adres rekordu (następne cztery znaki) określa miejsce w pamięci gdzie dany fragment ma być
załadowany (w podanym przypadku są to lokacje 0080, 0090, 00A0, 0000).
Istnieje wiele rodzajów rekordów – informacja o typie zajmuje dwa kolejne znaki (w podanym
przykładzie we wszystkich liniach mamy rekordy typu 00 i jeden – ostatni 01). Określono typy
rekordów:
00 – rekord danych (podstawowy),
01 – rekord końca danych (zawsze na kocu pliku, nie zawiera danych),
02 – rozszerzony segment danych (nie zawiera danych, zmienia segment danych),
03 – rekord startu rozszerzonego segmentu danych,
04 – rozszerzony z liniowym adresowaniem danych (nie zawierają danych, tylko zmieniają adres bazy),
05 – rekord startu liniowego segmentu danych,
Przypadku STRC51 i pakietu SDCC występują dwa rodzaje rekordów 00 i 01.
Dalsze znaki (w ilości wcześniej zidentyfikowanej) są danymi które trzeba wpisać pod podany wcześniej
adres. Na końcu linii znajduje się suma kontrolna, liczona jako suma wszystkich bajtów w taki sposób, że
dodana do sumy wczytanej ma dać 0 (wartość komplementarna).
Każda linia kończona jest znakiem lub znakami końca linii. W uniwersalnym systemie należy
rozpoznawać format końca linii.
1.2.Kontrola przepływu danych przez łącze RS232.
Istnieją rożne metody kontroli przepływu informacji podczas transmisji przez łącze RS232. Dzielą się one
na sprzętowe i programowe. Metoda sprzętowa jest prostsza w implementacji, wymaga jednak
odpowiedniego skonfigurowania zwór płytki STRC51. Metoda programowa nie wymaga ingerencji w
ustawienia zwór na płytce. W tej metodzie przepływ informacji kontrolują znaki:
XOFF
XON
– Control S
– Control Q
– DC3 (Device Control 3)
– DC1 (Device Control 1)
– lub po prostu ASCII kod 19,
– lub po prostu ASCII kod 17.
Działanie protokołu polega na zakomunikowaniu nadawcy znakiem XOFF, w momencie gdy odbiorca nie
jest wstanie przyjmować większej ilości danych (z reguły gdy zapełnienie bufora osiąga więcej niż ¾
pojemności). Po skonsumowaniu przed odbiorcę danych z bufora odbiorca wysyła nadawcy znak XON (co
z reguły następuje gdy bufor opróżni się do ¼ pojemności).
Dla pełnego wykorzystania tego protokołu w systemie PC połączonym z STRC51, należy uaktywnić
kontrolę przepływu Flow control -> Xon/Xoff. Rysunek 1. pokazuje miejsce w którym trzeba
dokonać zmian.
Rys 1. Okno ustawień programu TeraTermPro
1.3.Umieszczanie danych w pamięci STRC51.
Obszar pamięci danych dostępnych dla procesora mogą być określane podczas linkowania projektu (patrz
plik makefile: --xram-loc 0x0000). Określany jest początek obszaru w którym alokowane będą
zmienne z prefiksem xdata lub wszelkie zmienne w modelu large. Maksymalna wielkość obiektów
alokowanych w pamięci danych nie jest wprost określana. Analizując wyniki zapisane w pliku z
rozszerzeniem .map, można dowiedzieć się gdzie dany obiekt został zaalokowany i jaka jest jego
wielkość. Przykładowy wpis wygląda tak:
Area
Addr
Size
Decimal Bytes (Attributes)
------------------------------------- ----- -----------DSEG
0030
000B =
11. bytes (REL,CON)
Value
Global
-------- -------------------------------0030
_maxp
0032
_utoa_PARM_2
0035
_PrintVal_tab_1_1
W pierwszej kolejności podawany jest typ obszaru (Area): tutaj DSEG. Lokalizacja (Addr) znajduje się
pod adresem 0x0030 (0030) i obejmuje obszar 11 bajtów (000B). Istotna jest także tabela opisująca
alokacje szczegółową obiektów. I tak obiekt _maxp jest ulokowany pod adresem 0x0030. Wielkość
obiektu można rozpoznać na podstawie adresu następnego wpisu (tutaj 0032-0030 daje 2 bajty).
1.4.Wykonywanie kodu z określonej lokalizacji w pamięci.
Istnieją metody wywołania funkcji w C umieszczonej w określonej lokalizacji, w przypadku pakietu
SDCC najprostszą efektywną metodą jest utworzenie wstawki asemblerowej. W ramach pracy takiej
wstawki nie jest możliwa pełna kontrola nad lokalizacją docelowej funkcji. Możliwe jest taka
implementacja:
void exit(void){
_asm;
ljmp 0
_endasm;
}
W takim rozwiązaniu, nie możliwe jest proste zmienianie miejsca skoku (tutaj: 0x0000). Można też
używać odpowiedniej kombinacji instrukcji które odłożą w odpowiedniej kolejności dane na stos i
następnie wykonanie powrotu z procedury (RET). Po takiej instrukcji nastąpi „powrót” w miejsce
pożądane.

Podobne dokumenty