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.