Rdzeń Mikroprocesorowy CORTEX M0+ 1
Firma ARM Rok 1990 Porozumienie firm: Apple Computer, Acorn Computer Group, VLSI Technology Utworzenie firmy Advanced RISC Machines W Cambridge (Wielka Brytania) Ryzyko = RISC = Reduced Instruction Set Computer Rok 1998 Zmiana nazwy: ARM Holdings 2
Firma ARM Firma jedynie projektuje układy cyfrowe, nie jest producentem. Opracowuje i sprzedaje tzw. bloki własności intelektualnej IP (Intellectual Property). Najbardziej znanymi produktami są rdzenie mikroprocesorów i mikrokontrolerów. Szczególnie popularne to ARM7 i ARM9. Klienci: STMicroelectronics, Texas Instruments, Freescale, Toshiba, Zilog, Maxim itd. 3
Firma ARM Chaos w nazewnictwie: Nazwa rdzenia a nazwa architektury: Rdzeń ARM7 ARM9 ARM11 CORTEX Architektura ARMv4 ARMv5 ARMv6 ARMv7 4
Rodzina rdzeni CORTEX Trzy podrodziny CORTEX Ax-duże moce obliczeniowe Rx- systemy z krytycznym czasem reakcji Mx- minimalizacja ceny Cortex-Ax jest przeznaczona dla wymagających aplikacji z systemami operacyjnymi, takimi jak Symbian, Linux i Windows Embedded, które wymagają dużych mocy obliczeniowych, obsługi pamięci wirtualnej z MMU (Memory Management Unit) lub implementacji wirtualnej maszyny Javy, 5
Rodzina rdzeni CORTEX CORTEX- kora mózgowa Cortex-Rx przeznaczona do implementowania w systemach, w których krytyczny jest czas reakcji (np. ABS i inne aplikacje samochodowe), Cortex-Mx podrodzina zoptymalizowana pod kątem minimalizacji ceny przy zachowaniu dużej wydajności, przeznaczona do zastosowań konsumenckich i przemysłowych. 6
Rdzeń CORTEX Mx Rdzeń Cortex-M3 jest historycznie pierwszym opracowaniem z rodziny Cortex ów opracowanych przez firmę ARM Holdings. W chwili obecnej są dostępne cztery wersje rdzenia Cortex-M: M0, M1, M3 oraz M4. Zajmowana powierzchnia struktury CORTEX M1 Kompatybilność binarna, te same narzędzia CORTEX M0 CORTEX M3 CORTEX M4 Implementacj a w FPGA Tanie mikrokontrolery Szybkie mikrokontrolery z DSP 7
Rdzeń CORTEX Mx Porównanie listy rozkazów rdzeni CORTEX Mx 8
Rdzeń CORTEX Mx Rdzeń Cortex-M1 zaprojektowano specjalnie z myślą o implementacji w układach FPGA i jest łatwy do implementacji w układach FPGA największych producentów (Actel, Altera, Lattice, Xilinx). Rdzeń Cortex-M0 to najprostszy (i dzięki temu zajmuje najmniejszą powierzchnię na krzemie) i najbardziej energooszczędny rdzeń, jaki do tej pory zaprojektowano w firmie ARM. W założeniach jest to 32-bitowy konkurent dla mikrokontrolerów 8/16-bitowych w mniej zaawansowanych aplikacjach. Patrząc na dotychczasowe efekty działalności ARM Holdings możemy się spodziewać, że Cortex-M0 wywoła kolejną rewolucję w mikrokontrolerowym świecie. 9
Rdzeń CORTEX Mx W swoich mikrokontrolerach rdzenie Cortex-M0 stosują firmy Nuvoton oraz NXP. W ofercie firmy NXP można znaleźć bardzo ciekawe układy LPC4300, łączące w sobie dwa rdzenie: główny Cortex-M4, oraz koprocesor Cortex-M0. Stosowanie mikrokontrolerów dwurdzeniowych może być uzasadnione w aplikacjach wymagających cyfrowego przetwarzania sygnałów. Rdzeń Cortex- M4 jest zoptymalizowany pod kątem DSP, więc w układach z rodziny LPC4300 można wykorzystać jego całą moc, przerzucając zwykłe sterowanie na barki drugiego rdzenia (Cortex-M0). 10
Rdzeń CORTEX Mx Program wynikowy krótszy o 31% Szybkość wykonywania ARM Thumb-2 Thumb Wzrost szybkości wykonania do 38% Gęstość upakowania kodu Porównanie cech listy instrukcji ARM, Thumb i Thumb-2 11
Rdzeń CORTEX Mx- charakterystyka Rdzeń Cortex-Mx zaprojektowano z wykorzystaniem architektury harvardzkiej, co oznacza, że magistrale: pamięci programu i pamięci danych są od siebie oddzielone. Takie podejście pozwala na dostęp do pamięci programu i pamięci danych w tym samym czasie. Jednak pamięci te współdzielą tę samą przestrzeń adresową, a więc nie można zaadresować, jak mogłoby się wydawać np. do 8 GB, a tylko do 4 GB w każdym obszarze. Mikrokontrolery wyposażone w rdzenie Cortex mogą używać kodowania zarówno big endian jak i little endian, co oznacza różne kolejności zapisu bajtów do pamięci. 12
Rdzeń CORTEX Mx- charakterystyka Big Endian polega na tym, że najbardziej znaczący bajt jest zapisywany jako pierwszy, natomiast w Little Endian jako pierwszy zapisywany jest mniej znaczący bajt. 13
Rdzeń CORTEX Mx- charakterystyka W przypadku bardziej zaawansowanego i wymagającego systemu rdzenie z rodziny Cortex mogą być wyposażone w jednostkę ochrony pamięci ( MPU Memory Protection Unit). Architektura Cortex ów zawiera w swej strukturze już zaimplementowane bloki do debugowania z obsługą pułapek ( breakpoint) i punktów podglądu (watchpoint). Rdzenie Cortex obsługują dwa tryby pracy o różnych stopniach uprzywilejowania: tryb uprzywilejowany, tryb użytkownika. 14
Rdzeń CORTEX Mx- charakterystyka Po zerowaniu jednostka centralna zawsze uruchamia się w trybie uprzywilejowanym, a do jego zmiany służy najmłodszy bit rejestru specjalnego CONTROL. Praca w tym trybie umożliwia nieograniczony dostęp do zasobów rdzenia. Gdy program jest wykonywany w trybie użytkownika, niektóre zasoby rdzenia nie są dostępne, dzięki czemu aplikacja użytkownika nie ma dostępu do kluczowych ze względu na niezawodność elementów systemu, takich jak m.in. niektóre obszary pamięci. 15
Rejestry podstawowe Rdzeń Cortex wyposażono w szesnaście rejestrów podstawowych (R0 do R15), przy czym trzynaście z nich (od R0 do R12) jest rejestrami ogólnego przeznaczenia (General Purpose Register). 16
Rejestry podstawowe Rejestr R13 jest wskaźnikiem stosu. Podzielonego na dwa oddzielne rejestry bankowane, co oznacza, że w danym momencie jest widoczny tylko jeden. Rejestr R13 składa się z: MSP Main Stack Pointer domyślnego rejestru używanego przez przerwania i jądra systemów operacyjnych, pracujących w trybie uprzywilejowanym, PSP Process Stack Pointer używanego przez program użytkownika uruchomionym pod skrzydłami systemu operacyjnego. 17
Rejestry podstawowe Pozostałe rejestry: R14 tzw. Link Register zawiera w sobie adres powrotu, R15 PC (Program Counter) licznik rozkazów zawiera adres aktualnie wykonywanej instrukcji. Może być zapisywany w celu sterowania wykonywaniem programu. Oprócz wyżej wymienionych rejestrów rdzenie Cortex-Mx wyposażono także w rejestry specjalne: Program Status Register, Interrupt Mask Register, Control Register. Służą one do sterowania pracą rdzenia i sposobem wykonywania programu, a ich zawartość może być modyfikowana tylko za pomocą instrukcji specjalnych,nie mogą być modyfikowane podczas normalnej pracy rdzenia. 18
Przestrzeń adresowa Przestrzeń adresowa obsługiwana przez rdzenie Cortex-Mx jest podzielona na segmenty, m.in.: segment pamięci programu, pamięci SRAM pamięci zewnętrznej RAM, urządzeń peryferyjnych. 19
Przestrzeń adresowa 20
Przestrzeń adresowa Bit-band, czyli obszary o dostępie atomowym Wykorzystanie dostępu atomowego znacznie upraszcza wykonanie operacji ustawienia lub kasowania bitu. Należy wykonać tylko operację zapisu (lub odczytu) pod odpowiedni adres. Zapis musi się odbyć na adres obliczony na podstawie adresu interesującego słowa, adresu bazowego regionu bit-band, numeru bajtu oraz pozycji bitu w bajcie. W przestrzeni adresowej rdzenia Cortex Mx znajdują się dwa obszary bit-band. Pierwszy w regionie pamięci RAM, a drugi w regionie urządzeń peryferyjnych. Dla pamięci RAM obszar, w którym jest możliwy dostęp atomowy rozpoczyna się od adresu 0x20000000, natomiast dla urządzeń peryferyjnych jest to adres 0x40000000. 21
Kontroler przerwań NVIC (Nested Vectored Interrupt Celem stosowania NVIC jest: Controller) - po pierwsze uproszczenie obsługi (zagnieżdżonych) przerwań, - a po drugie skrócenie opóźnień w obsłudze przerwań. Rdzeń Cortex-Mx obsługuje do piętnastu przerwań (wyjątków) systemowych i do 40 przerwań zewnętrznych to ile tych przerwań będzie faktycznie obsługiwanych przez fizyczny układ zależy od producenta mikrokontrolera. Większość wyjątków systemowych i wszystkie przerwania zewnętrzne mogą mieć programowo ustalany priorytet. 22
Kontroler przerwań NVIC Fault= błąd 23
Kontroler przerwań NVIC Wyjątek SVCall W dobrze zaprojektowanym systemie operacyjnym, uruchomiona w nim aplikacja nie może bezpośrednio odwołać się do sprzętu. Odnosząc to zdanie do konkretnego przypadku można powiedzieć, że aplikacja użytkownika nie ma możliwości operowania na portach wejścia/wyjścia inaczej, niż za pośrednictwem systemu operacyjnego. Takie ograniczenia w stosunku do aplikacji uruchamianych w systemie operacyjnym mają bardzo istotne znaczenie ze względu na ograniczone zaufanie do programów użytkownika. W związku z tym musi istnieć mechanizm pozwalający na bezpieczne korzystanie ze sprzętu przez uruchomiony w systemie operacyjnym program użytkownika. Do realizacji tego zadania przeznaczono wyjątek SVC. Jeśli program użytkownika chce skorzystać ze sprzętu, to musi wywołać funkcję SVC, a dopiero ta realizuje zadanie z użyciem wymaganego sprzętu. 24
Kontroler przerwań NVIC Wyjątek PendSV Podczas realizacji zadanie (program użytkownika) może zostać zgłoszone przerwanie, które wywłaszczy dotychczasowy proces. Jeśli podczas obsługi zgłoszonego przerwania timer SysTick przerwie je i system operacyjny rozpocznie przełączanie kontekstów zadań, to wychodząc z funkcji obsługi przerwania od timera SysTick, OS będzie próbował zmusić mikrokontroler do rozpoczęcia realizacji nowego zadania. Jest to rzecz jasna zachowanie błędne, ponieważ obsługa pierwszego przerwania zostanie znacznie opóźniona. Rozwiązaniem tego problemu jest zastosowanie wyjątku PendSV. Jego programowalny priorytet jest ustawiany na najniższy możliwy, dzięki czemu przerwanie to nigdy nie wywłaszczy innych obsługiwanych przerwań. 25
Kontroler przerwań NVIC Wyjątek SysTick Do cyklicznego przełączania kontekstu zadań stworzono systemowy, 24 bitowy, timer SysTick. Jego zadaniem jest generowanie w określonych odstępach czasu przerwania, a funkcja jego obsługi może zajmować się właśnie przełączaniem kontekstu zadań. 26
Kontroler przerwań NVIC Obsługa przerwań zagnieżdżonych wszystkie zewnętrzne przerwania i większość przerwań systemowych mogą mieć ustawiane różne priorytety. W momencie wystąpienia przerwania kontroler NVIC porównuje priorytet tego przerwania z priorytetem obecnego zadania. Jeżeli priorytet nowego przerwania jest wyższy od dotychczasowego, wtedy nowe zadanie o wyższym priorytecie dokona wywłaszczenia poprzedniego i jest wykonywane w pierwszej kolejności. 27
Kontroler przerwań NVIC Obsługa wektorów przerwań NVIC oferuje również sprzętowe wsparcie dla wektorów przerwań. W momencie, kiedy przerwanie zostaje przyjęte do realizacji adres funkcji obsługi przerwania (ISR) jest pobierany z wektora w pamięci. Nie ma potrzeby programowego wyznaczania adresu ISR, dzięki temu czas potrzebny na obsłużenie przerwania jest krótszy. Dynamiczne zmiany priorytetów przerwań - priorytety przerwań mogą być zmieniane programowo podczas pracy mikrokontrolera. Zmniejszenie opóźnień związanych z przerwaniami rdzeń Cortex- Mx zoptymalizowano pod kątem możliwie najkrótszych opóźnień czasowych obsługi przerwania. Jedną z podstawowych czynności mających na celu skrócenie tego czasu jest automatyczne zapisywanie i przywracanie kontekstu zadania, czyli zawartości kluczowych dla tego zadania rejestrów. 28
Kontroler przerwań NVIC Maskowanie przerwań przerwania i wyjątki (exceptions) mogą być maskowane na podstawie ich priorytetów lub maskowane całkowicie poprzez odpowiednie użycie rejestrów maskujących. Ma to szczególne znaczenie dla zadań, w których wykonaniu czas jest parametrem krytycznym. 29
Lista rozkazów Thumb-2 Jedną z najważniejszych zalet rdzenia Cortex-Mx jest zdolność do obsługi instrukcji na danych 16- i 32-bitowych bez konieczności stosowania jakichkolwiek zabiegów (lista instrukcji Thumb-2). Takie rozwiązanie pozwoliło na zmniejszenie objętości wynikowego kodu oraz na zwiększenie wypadkowej prędkości wykonywania programu. W celu możliwie jak najlepszego wykorzystania możliwości drzemiących w zestawie instrukcji Thumb-2, stworzono pewną dedykowaną do tego celu odmianę asemblera Unified Assembler Language ( UAL) zunifikowany język asemblera. Dzięki temu operowanie instrukcjami 16- i 32-bitowymi stało się dużo prostsze i bardziej przejrzyste. W zestawie instrukcji Thumb-2 niektóre operacje mogą być wykonywane zarówno jako 16- jak i 32-bitowe. 30
Lista rozkazów Thumb-2 Wszystkie rozkazy wykonują się w ściśle określonym czasie zwykle 1 cykl. 4 bitowy kod warunkowy na początku każdej instrukcji. Łączenie operacji przesunięcia i obrotu w rejestrze z instrukcjami arytmetycznymi, logicznymi, przesyłania danych. 31
Cortex-M0+ to zoptymalizowana odmiana rdzenia Cortex-M0. Jest to najbardziej energooszczędny rdzeń firmy ARM (11,21 µw/mhz), a jednocześnie cechuje się wyższą wydajnością obliczeniową niż Cortex-M0 (2,15 CoreMark/MHz). Osiągnięcie takich parametrów było możliwe dzięki wprowadzonym modyfikacjom do rdzenia Cortex-M0. Są to między innymi: Zredukowane przetwarzanie potokowe (pipeline) z 3- do 2-stopniowego, co umożliwia szybsze wykonywanie instrukcji, Dostęp do portów I/O i krytycznych zasobów w jednym cyklu, Zoptymalizowany dostęp do pamięci, Jednolita przestrzeń pamięci 4 GB, Rdzeń ARM Cortex-M0+ Bufor MTB (Micro Trace Buffer) pozwalający na śledzenie wykonywania instrukcji, Blok MPU (Memory Protection Unit). 32
Rdzeń ARM Cortex-M0+ SAM D20 to jedna z pierwszych na rynku rodzin mikrokontrolerów z rdzeniem ARM Cortex-M0+. Obecnie analogiczne układy oferuje tylko firma Freescale (Kinetis L) oraz NXP (LPC800), a w najbliższym czasie dostępne będą kolejne dwie, zapowiedziane już rodziny, opracowane przez firmę Fujitsu (FM0+) oraz Energy Micro (EFM32 Zero). Inni producenci obecnie opracowują swoje rodziny mikrokontrolerów z rdzeniem ARM Cortex-M0+ (jest to między innymi rodzina STM32L0 firmy ST Microelectronics). 33
Porównanie rdzeni M0 i M0+ 34
CORTEX M0+ ochrona danych Rdzeń Cortex-M0+ wyposażono w blok MPU, dzięki któremu systemy operacyjne mogą chronić dane przypisane poszczególnym zadaniom wykonywanym przez mikrokontroler. 35
Przetwarzanie potokowe (Pipeline) 36
Zysk energetyczny 37
Kontrolery z rdzeniem CORTEX M0+ Schemat blokowy mikrokontrolerów Kinetis L pierwszej produkowanej rodziny z rdzeniem Cortex-M0+ 38
39
Cortex-M0+ CPU Core 40
Overview Cortex-M0+ Processor Core Registers Memory System and Addressing Thumb Instruction Set References DDI0419C Architecture ARMv6-M Reference Manual 41
Różnice między mikroprocesorem a mikrokontrolerem Oba zawierają rdzeń mikroprocesorowy Mikrokontrolery zawierają układy peryferyjne Analog Non-logic level signals Timing Clock generators Communications point to point network Reliability and safety 42
Rdzeń Cortex-M0+ 43
Architektura wewnętrzna rdzenia CORTEX M0 Przerwania Składniki Cortex-M0 Procesor Cortex-M0 Sprzętowy kontroler przerwań Rdzeń M0 Układy wspomagania uruchamiania programu Jednostka ustawiania pułapek i punktów podglądu Kontroler szybkiego przełączania ze stanu uśpienia Matryca magistral Interfejs Debugera Port Debugera Pamięć programu i danych, jednostki wykonawcze, interfejsy urządzeń we-wy Port szeregowy lub JTAG 44
Architektura jądra CORTEX M0+ Load/Store Architecture Developed to simplify CPU design and improve performance Memory wall: CPUs keep getting faster than memory Memory accesses slow down CPU, limit compiler optimizations Change instruction set to make most instructions independent of memory Data processing instructions can access registers only 1.Load data into the registers 2.Process the data 3.Store results back into memory More effective when more registers are available Register/Memory Architecture Data processing instructions can access memory or registers Memory wall is not very high at lower CPU speeds (e.g. under 50 MHz) 45
Rejestry wewnętrzne 46
Opis rejestrów (każdy 32 bitowy) R0-R12 - General purpose registers for data processing SP - Stack pointer (R13) Can refer to one of two SPs Main Stack Pointer (MSP) Process Stack Pointer (PSP) Uses MSP initially, and whenever in Handler mode When in Thread mode, can select either MSP or PSP using SPSEL flag in CONTROL register. LR - Link Register (R14) Holds return address when called with Branch & Link instruction (B&L) PC - program counter (R15) 47
ARM Processor -Rejestry Program Status Register (PSR) is three views of same register Application PSR (APSR) Bity znaczników: Negative, Zero, overflow, Carry Interrupt PSR (IPSR) Przechowuje numer aktualnie obsługiwanego przerwania- ISR Execution PSR (EPSR) Stan wykonania instrukcji 48
ARM Processor Core Registers PRIMASK - Exception mask register Bit 0: PM Flag Set to 1 to prevent activation of all exceptions with configurable priority Access using CPS, MSR and MRS instructions Use to prevent data race conditions with code needing atomicity CONTROL Bit 1: SPSEL flag Selects SP when in thread mode: MSP (0) or PSP (1) Bit 0: npriv flag Defines whether thread mode is privileged (0) or unprivileged (1) With OS environment, Threads use PSP OS and exception handlers (ISRs) use MSP 49
Mapa pamięci dla Cortex M0+ and MCU KL25Z128VLK4 SRAM_U (3/4) SRAM_L (1/4) 16 KB SRAM 0x2000_2FFF 0x2000_0000 0x1FFF_F000 0x0001_FFFF 128KB Flash 0x0000_0000 50
Instruction Set Cortex-M0+ core implements ARMv6-M Thumb instructions Only uses Thumb instructions, always in Thumb state Most instructions are 16 bits long, some are 32 bits Most 16-bit instructions can only access low registers (R0-R7), but some can access high registers (R8-R15) Thumb state indicated by program counter being odd (LSB = 1) Branching to an even address will cause an exception, since switching back to ARM state is not allowed Conditional execution only supported for 16-bit branch 32 bit address space Half-word aligned instructions See ARMv6-M Architecture Reference Manual for specifics per instruction (Section A.6.7) 51
Format asemblera <operation> <operand1> <operand2> <operand3> Pierwszy operand to typowo rejestr przeznaczenia (<Rd>) Pozstałe operandy wskazują na źródła (<Rn>, <Rm>) Przykłady ADDS <Rd>, <Rn>, <Rm> Add registers: <Rd> = <Rn> + <Rm> AND <Rdn>, <Rm> Bitwise and: <Rdn> = <Rdn> & <Rm> CMP <Rn>, <Rm> Compare: Set condition flags based on result of computing <Rn> - <Rm> 52
Miejsca przechowywania danych W rejestrach ogólnego przeznaczenia- R Przeznaczenie: Rd Źródło: Rm, Rn Źródło a zarazem przeznaczenie: Rdn Przeznaczenie: Rt Źródło przy operacjach z przesunięciem: Rs Dane natychmiastowe w kodzie instrukcji Rejestr bitów warunkowych W pamięci Tylko dla instrukcji load, store, push and pop 53
Rejestr bitów warunkowych S litera S oznacza iż instrukcja modyfikuje bity warunkowe APSR ADD vs. ADDS ADC vs. ADCS SUB vs. SUBS MOV vs. MOVS 54
Lista instrukcji Instruction Type Move Load/Store Add, Subtract, Multiply Compare Logical Shift and Rotate Stack Conditional branch Extend Reverse Processor State No Operation Hint Instructions MOV LDR, LDRB, LDRH, LDRSH, LDRSB, LDM, STR, STRB, STRH, STM ADD, ADDS, ADCS, ADR, SUB, SUBS, SBCS, RSBS, MULS CMP, CMN ANDS, EORS, ORRS, BICS, MVNS, TST LSLS, LSRS, ASRS, RORS PUSH, POP IT, B, BL, B{cond}, BX, BLX SXTH, SXTB, UXTH, UXTB REV, REV16, REVSH SVC, CPSID, CPSIE, SETEND, BKPT NOP SEV, WFE, WFI, YIELD 55
Load/Store Register ARM dysponuje architekturą załaduj i wykonaj (load/store architecture), dlatego wykonuje operacje na argumentach zawartych w rejestrach a nie pamięci LDR: Załaduj daną z pamięci do rejestru LDR <Rt>, source address STR: Wyślij zawartość rejestru do pamięci STR <Rt>, destination address 56
Adresowanie pamięci Offset Addressing mode: [<Rn>, <offset>] accesses address <Rn>+<offset> Base Register <Rn> Can be register R0-R7, SP or PC <offset> is added or subtracted from base register to create effective address Can be an immediate constant Can be another register, used as index <Rm> Auto-update: Can write effective address back to base register Pre-indexing: use effective address to access memory, then update base register with that effective address Post-indexing: use base register to access memory, then update base register with effective address 57
Other Data Sizes Load and store instructions can handle half-word (16 bits) and byte (8 bits) Store just writes to half-word or byte STRH, STRB Load a byte or half-word: What do we put in the upper bits? How do we extend 0x80 into a full word? Unsigned? Then 0x80 = 128, so zero-pad to extend to word 0x0000_0080 = 128 Signed? Then 0x80 = -128, so sign-extend to word 0xFFFF_FF80 = -128 Signed Unsigned Byte LDRSB LDRB Half-word LDRSH LDRH 58
Data Size Extension Can also extend byte or half-word already in a register Signed or unsigned (zero-pad) How do we extend 0x80 into a full word? Unsigned? Then 0x80 = 128, so zero-pad to extend to word 0x0000_0080 = 128 Signed? Then 0x80 = -128, so sign-extend to word 0xFFFF_FF80 = -128 Signed Unsigned Byte SXTB UXTB Half-word SXTH UXTH 59
Load/Store Multiple LDM/LDMIA: load multiple registers starting from [base register], update base register afterwards LDM <Rn>!,<registers> LDM <Rn>,<registers> STM/STMIA: store multiple registers starting at [base register], update base register after STM <Rn>!, <registers> LDMIA and STMIA are pseudo-instructions, translated by assembler 60
Load Literal Value into Register Assembly instruction: LDR <rd>, =value Assembler generates code to load <rd> with value Assembler selects best approach depending on value Load immediate MOV instruction provides 8-bit unsigned immediate operand (0-255) Load and shift immediate values Can use MOV, shift, rotate, sign extend instructions Load from literal pool 1. Place value as a 32-bit literal in the program s literal pool (table of literal values to be loaded into registers) 2. Use instruction LDR <rd>, [pc,#offset] where offset indicates position of literal relative to program counter value Example formats for literal values (depends on compiler and toolchain used) Decimal: 3909 Hexadecimal: 0xa7ee Character: A String: 44?? 61
Operacje przesłań (pseudo) Copy data from one register to another without updating condition flags MOV <Rd>, <Rm> Assembler translates pseudoinstructions into equivalent instructions (shifts, rotates) Copy data from one register to another and update condition flags MOVS <Rd>, <Rm> Copy immediate literal value (0-255) into register and update condition flags MOVS <Rd>, #<imm8> 62
Operacje na stosie Push some or all of registers (R0-R7, LR) to stack PUSH {<registers>} Decrements SP by 4 bytes for each register saved Pushing LR saves return address PUSH {r1, r2, LR} Pop some or all of registers (R0-R7, PC) from stack POP {<registers>} Increments SP by 4 bytes for each register restored If PC is popped, then execution will branch to new PC value after this POP instruction (e.g. return address) POP {r5, r6, r7} 63
Operacje dodawania Add registers, update condition flags ADDS <Rd>,<Rn>,<Rm> Add registers and carry bit, update condition flags ADCS <Rdn>,<Rm> Add registers ADD <Rdn>,<Rm> Add immediate value to register ADDS <Rd>,<Rn>,#<imm3> ADDS <Rdn>,#<imm8> 64
Operacje dodawania do wskaźnika stosu Add SP and immediate value ADD <Rd>,SP,#<imm8> ADD SP,SP,#<imm7> Add SP value to register ADD <Rdm>, SP, <Rdm> ADD SP,<Rm> 65
Dodawanie adresu do PC Add immediate value to PC, write result in register ADR <Rd>,<label> How is this used? Enables storage of constant data near program counter First, load register R2 with address of const_data ADR R2, const_data Second, load const_data into R2 LDR R2, [R2] 66
Odejmowanie Subtract immediate from register, update condition flags SUBS <Rd>,<Rn>,#<imm3> SUBS <Rdn>,#<imm8> Subtract registers, update condition flags SUBS <Rd>,<Rn>,<Rm> Subtract registers with carry, update condition flags SBCS <Rdn>,<Rm> Subtract immediate from SP SUB SP,SP,#<imm7> 67
Mnożenie Multiply source registers, save lower word of result in destination register, update condition flags MULS <Rdm>, <Rn>, <Rdm> <Rdm> = <Rdm> * <Rn> Note: upper word of result is truncated 68
Operacje logiczne Bitwise AND registers, update condition flags ANDS <Rdn>,<Rm> Bitwise OR registers, update condition flags ORRS <Rdn>,<Rm> Bitwise Exclusive OR registers, update condition flags EORS <Rdn>,<Rm> Bitwise AND register and complement of second register, update condition flags BICS <Rdn>,<Rm> Move inverse of register value to destination, update condition flags MVNS <Rd>,<Rm> Update condition flags by ANDing two registers, discarding result TST <Rn>, <Rm> 69
Instrukcje porównań Compare - subtracts second value from first, discards result, updates APSR CMP <Rn>,#<imm8> CMP <Rn>,<Rm> Compare negative - adds two values, updates APSR, discards result CMN <Rn>,<Rm> 70
Przesunięcia i obroty Common features All of these instructions update APSR condition flags Shift/rotate amount (in number of bits) specified by last operand Logical shift left - shifts in zeroes on right LSLS <Rd>,<Rm>,#<imm5> LSLS <Rdn>,<Rm> Logical shift right - shifts in zeroes on left LSRS <Rd>,<Rm>,#<imm5> LSRS <Rdn>,<Rm> Arithmetic shift right - shifts in copies of sign bit on left (to maintain arithmetic sign) ASRS <Rd>,<Rm>,#<imm5> Rotate right RORS <Rdn>,<Rm> 71
Zamiana bajtów REV - reverse all bytes in word REV <Rd>,<Rm> REV16 - reverse bytes in both half-words REV16 <Rd>,<Rm> REVSH - reverse bytes in low half-word (signed) and signextend REVSH <Rd>,<Rm> MSB MSB MSB MSB MSB Sign extend MSB LSB LSB LSB LSB LSB LSB 72
Skoki Unconditional Branches B <label> Target address must be within 2 KB of branch instruction (-2048 B to +2046 B) Conditional Branches B<cond> <label> <cond> is condition - see next page B<cond> target address must be within of branch instruction B target address must be within 256 B of branch instruction (-256 B to +254 B) 73
Warunki skoków Append to branch instruction (B) to make a conditional branch Full ARM instructions (not Thumb or Thumb- 2) support conditional execution of arbitrary instructions Note: Carry bit = notborrow for compares and subtractions 74
Wywołania i powroty z procedur Call BL <label> - branch with link Call subroutine at <label> PC-relative, range limited to PC+/-16MB Save return address in LR BLX <Rd> - branch with link and exchange Call subroutine at address in register Rd Supports full 4GB address range Save return address in LR Return BX <Rd> branch and exchange Branch to address specified by <Rd> Supports full 4 GB address space BX LR - Return from subroutine 75
Special Register Instructions Move to Register from Special Register MSR <Rd>, <spec_reg> Move to Special Register from Register MRS <spec_reg>, <Rd> Change Processor State - Modify PRIMASK register CPSIE - Interrupt enable CPSID - Interrupt disable 76
Other No Operation - does nothing! NOP Breakpoint - causes hard fault or debug halt - used to implement software breakpoints BKPT #<imm8> Wait for interrupt - Pause program, enter low-power state until a WFI wake-up event occurs (e.g. an interrupt) WFI Supervisor call generates SVC exception (#11), same as software interrupt SVC #<imm> 77
Wymienialność mikrokontrolerów z rodziny KINETIS 78