Mapa pamięci mikrokontrolera Wykład 3 Mapa pamięci mikrokontrolera (Memory Map) SAB80C537 dr inż. Andrzej Przybył Katedra Inżynierii Komputerowej Politechnika Częstochowska
Mapa pamięci kontrolera Pamięć adresowana jest bajtowo 1, każdy bajt (podstawowa komórka pamięci) ma swój adres. Dzieli się na pamięć wewnętrzną i zewnętrzną mikrokontrolera Pamięć zewnętrzna jest opcjonalna – nie musi być stosowana Pewne obszary adresowe są współdzielone (ang. shared) przez pamięć wewnętrzną, zewnętrzną i obszar rejestrów specjalnych SFR (Special Functions Registers). Aby uzyskać dostęp do wybranej komórki pamięci wewnętrznej, zewnętrznej lub rejestru specjalnego, należy użyć właściwych dla danego obszaru trybów adresowania i/lub instrukcji procesora. 1 ) UWAGA – istnieje tez specjalny obszar pamięci wewnętrznej, który jest adresowalny bitowo.
Pamięć wewnętrzna – dolna połówka Dostęp do dolnej połówki pamięci wewnętrznej RAM jest wykonywany za pomocą trybu adresowania bezpośredniego (ang. Direct Addressing) oraz pośredniego (ang. Indirect Addressing). Przykład użycia trybu bezpośredniego mov A, 10 ;odczyt zawartości komórki 10 do akumulatora mov 20,A ; zapis zawartości A w komórce o adresie 20 Przykład użycia trybu pośredniego ;odczyt zawartości komórki 100 do akumulatora mov R0, #100 ;wpisanie adresu komórki do rejestru R0 (można użyć też R1) mov A,@R0 ;właściwy odczyt (tryb pośredni) ;możliwy jest też zapis mov @R0, A W dolnej połówce pamięci wewnętrznej RAM umieszczony jest również zestaw rejestrów uniwersalnych R0-R7. Położenie zestawu rejestrów może by zmieniane przez bity RS0, RS1 zawarte w słowie PSW na jedną z czterech lokacji (banków rejestrów): bank 0:adresy[ 0..7] bank 1:[8..15] bank 2:[16..23] bank 3:[24..31]) Przełączanie banków rejestrów jest wygodne w krytycznych czasowo procedurach obsługi przerwań i pozwala na szybkie przełączanie kontekstu realizowanych zadań (ang. fast context switching) . Domyślną lokalizacją rejestrów R0-R7 jest obszar pamięci wewnętrznej o adresach 0..7. Należy zadbać o to, aby nie wykorzystywać obszaru pamięci wewnętrznej zajętego przez rejestry R0-R7 do innych celów. poznane tryby adresowania: bezpośredni i pośredni UWAGA w pamięci wewnętrznej (dowolnej połówce) jest też umieszczony STOS. Jest to specjalnie traktowany obszar pamięci, który nie może być zajęty przez inne dane. Miejsce wierzchołka stosu wskazuje wskaźnik stosu SP (ang. Stack Pointer). Należy zadbać o właściwe (tj. niekolizyjne) umieszczenie stosu.
Pamięć wewnętrzna – górna połówka Dostęp do górnej połówki pamięci wewnętrznej RAM jest wykonywany wyłącznie za pomocą trybu adresowania pośredniego (ang. Indirect Addressing). W obszarze górnej połówki adresów (czyli w zakresie 128..255) umieszczone są rejestry specjalne (SFR). Rejestry te mają swoje dedykowane funkcje dotyczące sterowania urządzeniami peryferyjnymi mikrokontrolera (np. portami, przetwornikiem AC, układami czasowo-licznikowymi tip.). Dostęp do rejestrów specjalnych możliwy jest wyłącznie w trybie adresowania bezpośredniego. Przykład: zapisu portu P1 mov P1, A jest równoważny z mov 90h,A P1 jest zdefiniowane jako liczba 90h w pliku definiującym rejestry mikrokontrolera (w tym przypadku plik nazywa się REG517.INC)
Pamięć wewnętrzna – sposób użycia w assemblerze środowiska Keil uVision NAME PROGRAM $INCLUDE (REG517.INC) ;dolaczenie pliku definicji rejestrow procesora 80C537 PROGRAM SEGMENT CODE ;definicja segmentu o nazwie PROGRAM, zawierającego kod (CODE) programu IRAM SEGMENT IDATA ;definicja segmentu danych pamięci wewnętrznej RAM (zakres 0..0ffh) LOW_IRAM SEGMENT DATA ;definicja segmentu danych pamięci wewnętrznej RAM (zakres 0..07fh - dolna połówka) org 0x0000 ; = równoważne z dyrektywą "CSEG AT 0x0000" JMP START ;wlasciwa obsluga wektora przerwania RESET RSEG PROGRAM ;informacja dla linkera - następne dane to kod programu (Z tego miejsca uruchomi sie program) START: .... PETLA: mov A,ZMIENNA1 ;zwiekszenie zmiennej z pamięci LOW_IRAM o jeden add a,#1 mov ZMIENNA1, A mov R0,#ZMIENNA3 ;zwiększenie zmiennej z pamieci HIGH_IRAM o jeden mov A,@R0 mov @R0, A jmp PETLA RSEG LOW_IRAM ; zmienne W DOLNEJ POŁÓWCE pamieci wewnetrznej RAM (IRAM: 0..7fh) ; dostęp w trybie BEZPOSREDNIM lub posrednim ; np. MOV A,#ZMIENNA4 ;UWAGA - jest to najwygodniejszy sposób w assemblerze !!! ZMIENNA1: DS 1 ;rozmiar zmiennej to jeden bajt, slowo 'ZMIENNA1' bedzie oznaczalo adres przydzielonej komórki pamieci ze wskazanego obszaru ; zmienne w pamieci wewnetrznej RAM (IRAM) ; dostep w trybie posrednim (za pomoca rejestru R0 lub R1) ; np. MOV R1,#ZMIENNA1 ; MOV @R1,A RSEG IRAM ZMIENNA3: DS 1 END poznane słowa kluczowe: CODE, IDATA, DATA, DS poznana składnia: struktura projektu z segmentami
STOS Stos jest specjalnie traktowanym fragmentem pamięci wewnętrznej RAM. Jest to struktura typu LIFO (ang. Last In First Out). Adres wierzchołka stosu wskazywany jest rejestrem SP (ang. Stack Pointer). Domyślną wartością (po zresetowaniu procesora) SP jest liczba 7. Ze stosem związane są następujące instrukcje procesora: PUSH xx Zwiększa wskaźnik stosu o jeden a następnie zapisuje do komórki pamięci wskazywanej nową wartością SP zawartość rejestru xx xx – oznacza adres rejestru SFR (128..255). W takim zapisie należy użyć ACC zamiast A do wskazania akumulatora. POP xx odczytuje daną z komórki pamięci wskazywanej aktualną wartością SP do rejestru xx a następnie zmniejsza wskaźnik stosu o jeden CALL ETYKIETA (ACALL, LCALL) Odkłada na stos 2 bajty oznaczające 16-bitowy adres następnej instrukcji (po instrukcji CALL) oraz przekazuje sterowanie do miejsca oznaczonego jako ETYKIETA RET zdejmuje ze stosu dwa oznaczające 16-bitowy adres instrukcji i przekazuje sterowanie procesora do tego adresu RETI analogicznie jak RET ale informuje również procesor, że aktualnie wykonywana procedura obsługi przerwania została już zakończona. Instrukcja pozwala na obsługę kolejnego zgłoszenia o priorytecie niższym lub równym do aktualnie zakończonej procedury.
Stos – sposób użycia w assemblerze środowiska Keil uVision NAME PROGRAM $INCLUDE (REG517.INC) ;dolaczenie pliku definicji rejestrow procesora 80C537 PROGRAM SEGMENT CODE ;definicja segmentu o nazwie PROGRAM, zawierającego ;kod (CODE) programu IRAM SEGMENT IDATA ;definicja segmentu danych pamięci wewnętrznej RAM ;(zakres 0..0ffh) LOW_IRAM SEGMENT DATA ;definicja segmentu danych pamięci wewnętrznej RAM ;(zakres 0..07fh - dolna połówka) org 0x0000 ; = równoważne z dyrektywą "CSEG AT 0x0000" JMP START ;wlasciwa obsluga wektora przerwania RESET RSEG PROGRAM ;informacja dla linkera - następne dane to kod programu (Z tego miejsca uruchomi sie program) START: .... mov SP,#DNO_STOSU-1 ;ustawienie wskaźnika stosu na początek zarezerwowanego obszaru PETLA: ... jmp PETLA RSEG IRAM DNO_STOSU: DS 20h ;zarezerwowanie kolejnych 32 bajtów (20h) w pamiecie IRAM na STOS END poznane instrukcje: PUSH, POP, CALL, RET poznana struktura: struktura projektu z definicją stosu
Obszar pamięci bitowo-adresowalny Istnieje fragment pamięci wewnętrznej RAM o adresach bajtowych z zakresu 32-47 (20h-02fh), który może być bitowo-adresowalny Wybór (zaadresowanie) konkretnego bitu następuje poprzez podanie jego adresu bajtowego oraz numeru bitu po kropce, np. setb 32.3; ustawienie bitu nr 3 w komórce pamięci clr 40.7; skasowanie bitu nr 7 w komórce o adresie 40 cpl 32.7 ; zamiana stanu bitu na przeciwny jb 32.3, ETYKIETA ;skok warunkowy zależny od stanu ;wskazanego bitu jnb 32.5, ETYKIETA ; analogicznie Mechanizm adresowania bitowego może służyć jako wygodny sposób na wykorzystanie flag bitowych (tzw. zmiennych boolowskich) w programach
Obszar pamięci bitowo-adresowalny sposób użycia w assemblerze środowiska Keil uVision NAME PROGRAM $INCLUDE (REG517.INC) PROGRAM SEGMENT CODE ;definicja segmentu zawierającego kod programu BITS SEGMENT BIT ;definicja segmentu danych bitowo-adresowalnych (zakres 0..0ffh) org 0x0000 ; = równowazne z dyrektywa "CSEG AT 0x0000" JMP START ;wlasciwa obsluga wektora przerwania RESET RSEG PROGRAM ;informacja dla linkera - następne dane to kod programu ;(Z tego miejsca uruchomi sie program) START: clr flaga_1 PETLA: ... cpl flaga_1 jmp PETLA RSEG BITS flaga_1: DBIT 1 END poznane słowa kluczowe: BIT, DBIT poznana technika: wykorzystanie zmiennych z obszaru bitowo-adresowalnego
Obszar pamięci bitowo-adresowalny, c.d. Bity mogą być adresowane również za pomocą odpowiadających im analogicznych adresów: 00-7fh (rysunek z prawej), np: setb 20h.0 jest równoważne z setb 00h
Pamięć zewnętrzna Procesor SAB80C537 może komunikować się z pamięcią zewnętrzną (umieszczoną poza obudową mikrokontrolera) Istnieje dwa wyróżnione rodzaje pamięci zewnętrznej: pamięć kodu (ang. Code Memory) oraz pamięć programu (XRAM).
Pamięć zewnętrzna XRAM sposób dostępu Z punktu widzenia programisty ważny jest sposób dostępu do komórek w/w pamięci. Dostęp jest zawsze pośredni z użyciem 16-bitowego rejestru DPTR (ang .Data Pointer): Przykład, zapis zawartości akumulatora do komórki pamięci zewnętrznej XRAM o adresie 1000 mov DPTR, #1000 movx @DPTR, A Przykład 2, odczyt komórki o adresie 2000 do akumulatora mov DPTR, #2000 movx A, @DPTR
Pamięć zewnętrzna programu (Code Memory) sposób dostępu Możliwy jest tylko odczyt z pamięci programu co wynika z faktu, że jest to pamięć przewidziana do przechowywania niemodyfikowalnego kodu programu. Przykład 3, odczyt komórki o adresie 2000 z pamięci zewnętrznej programu do akumulatora: mov DPTR, #2000 movc A, @A+DPTR ;Instrukcja zaadresuje komórkę pamięci o adresie powstałym przez niejawne sumowanie 16-bitowego adresu zawartego w DPTR z 8-bitowa wartością zawarta w A) Uwaga: Instrukcje MOVX i MOVC mogą występować tylko w takiej składni jak podano w przykładach 1-3. Nie jest możliwy zapis do Code Memory.
Pamięć zewnętrzna – sposób użycia w assemblerze środowiska Keil uVision NAME PROGRAM $INCLUDE (REG517.INC) ; dolaczenie pliku definicji rejestrow procesora 80C537 PROGRAM SEGMENT CODE ;definicja segmentu zawierającego kod programu ZEWN_RAM SEGMENT XDATA ; pamięć zewnętrzna XRAM org 0x0000 ; = równowazne z dyrektywa "CSEG AT 0x0000" JMP START ;wlasciwa obsluga wektora przerwania RESET RSEG PROGRAM ;informacja dla linkera - następne dane to kod programu ;(Z tego miejsca uruchomi sie program) START: PETLA: mov DPTR, #zmienna_X1 mov A,#1 movx @dptr, A mov A,#0 mov DPTR,#zmienna_C1 movc A,@A+dptr mov DPTR,#zmienna_C2 jmp PETLA ;aktualny segment to segment kodu - mozna w nim umiescic wprost zmienne zmienna_C1: ds 1 ;zarezerwowanie 1 bajtu na zmienna zmienna_C2: db 22 ;zarezerwowanie jednego bajtu na zmienna i ustanowienie wartosci poczatkowej = 22 RSEG ZEWN_RAM zmienna_X1: DS 1 END poznane instrukcje: MOVC, MOVX poznane techniki: wykorzystanie stałych oraz zmiennych z obszaru zewnętrznej pamięci kodu oraz zewnętrznej pamięci danych
Pytania kontrolne Podać sekwencję instrukcji na dodanie zawartości dwu komórek pamięci wewnętrznej RAM o adresach 200 i 201. Wynik należy zapisać do komórki o adresie 202. Podać sekwencję instrukcji sumującą 100 kolejnych komórek z pamięci zewnętrznej XRAM. Adres początkowy = 2000, wynik zapisać do rej. R7 Opisać działanie STOS-u procesora w oparciu o instrukcje PUSH, POP, CALL i RET. Wyjaśnić podstawowe zakresy zastosowań stosu w systemie komputerowym Odczytać element (bajt) o indeksie 200 z tablicy zawartej w pamięci zewnętrznej programu. Adres tablicy wynosi 50000. 15