Přednáška 2 A4B38NVS - Návrh vestavěných systémů 2014, kat. měření, ČVUT - FEL, Praha J. Fischer A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 1
Modifikace bitů slova v SRAM nebo výstupní brány Funkce čtení modifikace bitů zápis (read modify write) do 1 OR 1 do 0 AND 0 v daném bitu, viz příklad na cvičení? riziko příchod přerušení v procesu čtení, modifikace a zápisu (read, modify, write), zákaz přerušení Pro ovládání jednotlivých vybraných bitů brány STM32 jediným zápisem viz funkce set, reset obr. viz. Hitex: Insiders Guide. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 2
Adresování Bit Banding Možnost adresovat jediný bit v oblasti bit banding zápisem celého slova (32 bitů) do oblasti bit band alias (analogie velké kl. + hrot. na bit) oblast 1MByte adres. prostoru bit band v paměti SRAM adresovaná jako 32 MByte v bit band alias oblast 1MByte bit band v prostoru I/O v STM32 adresovaná jako 32 MByte v bit band allias bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number 4) Bit B(0) slova na adr. 0x2000 0000 odpovídá slovu (4 B) na adr. 0x2000 0000 Bit B(1) slova na adr. 0x2000 0000 odpovídá slovu (4 B) na adr. 0x2000 0004 mapování bitu B(2) ze slova v SRAM na adrese, 0x2000 0300 do oblasti alias : 0x2200 0000 (zač. B.B. Alias)+ (0x300*32) + (2*4) = 0x2200 6008 Zápis na adresu 0x2200 6008 má stejný efekt jako čtení,modifikace bitu a zápis bitu 2 z byte v SRAM na adrese 0x2000 0300. význam má nejnižší bit B(0) ze slova (32 bitů) Čtení z adr. 0x2200 6008 vrátí hodnotu (0x000 0001 nebo 0x0000 0000) podle stavu bitu 2 ze slova v SRAM na adr. 0x2000 0300 A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 3
Adresování Bit Banding Bit banding obr. dle Hitex: Insiders Guide celá vnitřní SRAM a periferie v STM32 - dosažitelné pomocí Bit banding SRAM Bit band oblast (celkem 1 MByte) Bit Band Alias (celkem 32 MByte) od 0x2000 0000 do 0x200F FFFF, od 0x2200 0000 do 0x23FF FFFF Periferie Bit band oblast (celkem 1 MByte) Bit Band Alias (celkem 32 MByte) od 0x4000 0000 do 0x400F FFFF od 0x4200 000 do 0x43FF FFF A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 4
Adresový prostor ARM Cortex M3 - A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 5
Procesory s jádrem ARM, kódování instrukce Architektura ARM, postupný vývoj ARMv x Architektura ARM instrukce kódování 32 bitové Kódování instrukcí ve strojovém kódu ARM je pouze v jednom slovu 32 bitů, procesor načte kompletní kód instrukce naráz Za kódem instrukce ARM nenásledují další informace o datech či adrese skoku (jako to je např. u procesoru 8051 jedno, dvou, tří bajtové instrukce,signálových procesorů ADSP Blackfin a dalších) Všechny informace jsou součástí instrukčního kódu Instrukce operuje s jedním nebo více registry, V jedné instrukci je pouze jediný přístup k datům v paměti (není instrukce, kde by se dva operandy načítaly z paměti, nebo kde by se operand četl z paměti a do paměti by se ukládal) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 6
Procesory s jádrem ARM, instrukce skoku Dotaz? jak se řeší skoky, když adresní prostor je 32- bitový a současně se má celá instrukce kompletně zakódovat do 32 bitů? Skoky (kde je informace o cíli skoku součástí instrukčního kódu) jsou relativní (skok o danou vzdálenost dopředu, či dozadu tato vzdálenost je součástí instruk. kódu) vzhledem k aktuální adrese právě čteného instrukčního kódu Relativní skoky omezený rozsah skoku ( omezená vzdálenost ) Dotaz? jak se řeší delší skoky, když adresní prostor je 32- bitový a současně se má celá instrukce kompletně zakódovat do 32 bitů? Skok s větším rozsahem adresy (na větší vzdálenost ) s využitím adresy předem uložené v registru (32 bitů) (Pozn.: u ARM Cortex M3 musí být nejnižší bit adr. skoku uložené v registru = 1) Důvod nejnižší bit adresy A0 = 1 signalizuje činnost v režimu Thumb) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 7
Instrukční sady ARM a THUMB Kódování instrukcí ve strojovém kódu ARM nebo THUMB pouze v jednom slovu 32 bitů, nebo jednom polovičním slovu (za kódem instrukce nenásledují další informace o datech či adrese skoku jako to je např. u 8051, jedno, dvou, tří bajtové instrukce) Pokud je potřeba v instrukci zadat adresu 32 bitů, není to součástí instrukce,ale použití pseudoinstrukce. Instrukce se odkazuje na další slovo v paměti vygenerované uložené překladačem. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 8
Instrukční sady ARM a THUMB Pokud je potřeba v instrukci zadat adresu 32 bitů, není to součástí instrukce, ale použitím pseudoinstrukce. Instrukce se odkazuje na další slovo v pam. vygenerované (a uložené) překladačem. LDR R0, =RCC_CR ; toto je pseudoinstrukce po překladu bude ve výpisu 0x08000130 4828 LDR r0, [pc,#160] ; @0x0800 01D4 ulož do R0 hodnotu, která je umístěna v paměti na adrese, která se získá jako součet příští volné adresy (pro slovo 4 Byte) a čísla 160 dekadicky tato instrukce je uložena na adrese 0x0800 0130, další volná adresa (se zarovnáním na hranici 4 Byte) je od 0x0800 0130 + 4 = 0x0800 0134 s posunem 160 (dekadicky) = 0xA0 ( hex.) tedy hledaná hodnota je umístěna na adrese 0x0800 0134 + 0xA0 = 0x0800 01D4, což indikuje zápis adresy @0x0800 01D4 v protokolu o překladu, @ signalizuje, že adr. je získána rel. (možno pozorovat v okně disass. IDE Keil) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 9
Opakování názvosloví používané v dokumentaci ARM: Byte - 8 bitů 1B (jeden bajt) Halfword - 16 bitů 2 B (dva bajty) Word - 32 bitů 4 B (čtyři bajty) tedy instrukce ARM ( a 32 bitová instrukce Thumb2) je kódovaná ve word instrukce Thumb je kódovaná v halfword A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 10
Mapa paměti v STM32F100x od 0x00 paměť Flash od 0x4000 0000 periferie od 0x2000 0000 interní SRAM výkon programu začíná podle reset handler adresa uložena na 0x0000 0004 0x0000 0000 výchozí hodnota pro nastavení ukazatele zásobníku (stack) 0x0000 0004 reset handler ( v našem programu tam je 0x0800 00ED) 0x0000 0008 NMI handler??? proč 0x0800 00ED, program začíná na 0x0800 00EC 0x0800 00EC.1110 1100 0x0800 00ED.1110 1101??? nejnižší bit odlišný instrukce kódovány 16 bitově (THUMB) nebo 32 bitově (THUMB- 2) takže by bit 0 měl být vždy 0, historicky od ARM, bit 0, pokud je v 0, znamená to přechod do módu klasické instruce ARM (32 bitů) bit 0 = 1 znamená režim Thumb, zde i Thumb -2 nejnižší bit adresy skoku u CORTEX M3 musí být proto vždy 1 (význam pro jednotku dekódování instrukce) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 11
Instrukční sada THUMB-2 ARM CORTEX- M3, instrukční sada pouze Thumb- 2 obsahuje původní Thumb 16 bitové, doplněné 32 bitovými inst. nepodporuje sadu ARM Thumb efektivnější využití pam. programu, (také zrychlení při čtení z FLASH, čtení 32 bitů dvě instrukce, vysvětlení později) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 12
Kódování instrukcí Thumb příklad instrukce MOVS MOV (immediate) s nastavením příznaků je inst. MOVS MOVS <Rd>, #<imm8> MOVS R0, # 0x0 se přeloží jako 2000 ( hex strojový kód) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 13
Kódování instrukcí Thumb opcode Instruction or instruction class 00xxxx Shift (immediate), add, subtract, move, and compare 010000 Data processing 010001 Special data instructions and branch and exchange 01001x Load from Literal Pool, see LDR (literal) 0101xx Load/store single data item 011xxx 100xxx 10100x Generate PC- relative address, see ADR 10101x Generate SP- relative address, see ADD (SP plus immediate) 1011xx Miscellaneous 16-bit instructions 11000x Store multiple registers, see STM / STMIA / STMEA 11001x Load multiple registers, see LDM / LDMIA / LDMFD 1101xx Conditional branch, and supervisor call 11100x Unconditional Branch A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 14
Kódování Thumb, instrukce MOV opcode Instruction 000xx Logical Shift Left LSL (immediate) 001xx Logical Shift Right LSR (immediate) 010xx Arithmetic Shift Right ASR (immediate) 01100 Add register ADD (register) 01101 Subtract register SUB (register) 01110 Add 3-bit immediate ADD (immediate) 01111 Subtract 3-bit immediate SUB (immed.) 100xx Move MOV (immediate) 101xx Compare CMP (immediate) 110xx Add 8-bit immediate ADD (immediate) 111xx Subtract 8-bit immediate SUB (immediate) 5 bitů opcode umístěných do bitů D13 až D9 následuje za bity D15 =0, D14=0 pro MOV (immed.) 100xx bude kód instrukce 00 100xx x xxxx xxxx tedy 001 000 rrr iiii iiii rrr kodování registru iiii iiii přímá 8-bitová data A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 15
Kódování Thumb, příklad instrukce MOVS MOV (immediate) Thumb instrukce MOVS <Rd>, #<imm8> MOVS R0, # 0x0 se přeloží jako 2000 ( hex strojový kód) 5 bitů opcode umístěných do bitů D13 až D9 následuje za bity D15 =0, D14=0 pro MOV (immed.) 100xx bude kód instrukce 001 00 xxx xxxx xxxx tedy 001 000 rrr iiii iiii rrr kodování registru iiii iiii přímá 8-bitová data 001 00 rrr iiii iiii tedy binárně 000 0000 0000 0000 i rrr kodování registru (R0 je kódován jako 000 binárně) iiii iiii přímá 8-bitová data proto není možno v Thumb instrukci uložit přímá data větší než 8 bitů, ( viz proc. ARM Cortex M0) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 16
Kódování příklad určení strojního kód instrukce Thumb -2 32-bit Thumb kódování instrukce op1 musí být různé různé od 00, pokud je op1 = 00 (bin) jedná se o 16 - bitovou instrukci Thumb tak ARM Cortex M3 rozliší instrukce A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 17
Kódování příklad určení strojního kód instrukce Thumb-2 op1 op2 op Instruction class 01 00 xx0xx x Load Multiple and Store Multiple 01 00 xx1xx x Load/store dual or exclusive, table branch 01 01xxxxx x Data processing (shifted register) 01 1xxxxxx x Coprocessor instructions 10 x0xxxxx 0 Data processing (modified immediate) 10 x1xxxxx 0 Data processing (plain binary immediate) 10 xxxxxxx 1 Branches and miscellaneous control 11 000xxx0 x Store single data item 11 00xx001 x Load byte, memory hints 11 00xx011 x Load halfword, memory hints 11 00xx101 x Load word 11 00xx111 x UNDEFINED 11 010xxxx x Data processing (register) 11 0110xxx x Multiply, multiply accumulate, and absolute difference 11 0111xxx x Long multiply, long multiply accumulate, and divide 11 1xxxxxx x Coprocessor instructions podle operandů OP1 a OP2 vznikne kód instrukce použitelné i pro zpětný překlad disassembling) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 18
Kódování příklad určení strojního kód instrukce Thumb -2. OP1, OP2, OP se doplní na příslušná místa kódu instrukce, 10 x0xxxxx 0 Data processing (modified immediate) další bity představují kódování použitých registrů, podmínky a přímá data příklad LDR R0, =0x0 se přeloží do Thumb- 2 F04F 0000 (hex) (nalezne se v protokolu o překladu soubor xxx.lst) F 0 4 F 0 0 0 0 (hex) 1111 0000 0100 0000 0000 0000 0000 0000 bin) A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 19
Instrukce MOV pro instr. sadu Thumb a Thumb - 2 op1 op2 op Instruction class MOV (immediate) MOVS <Rd>,#<imm8> Thumb instrukce (dle jazyka UAL S. nastavuje příznaky (požadavek na Thumb, inst. která je pouze s nastavením příznaků, Thumb- 2 instrukce MOV{S}<c>.W <Rd>, #<const> ( S nast. přízn.), c- S instrukce má nastavit příznakové bity,.w chci kódovat do Thumb -2, 32 bit c- podmínky vykonání ínstrukce podle příznak. bitů Thumb- 2 MOV.W<c> <Rd>, #<imm16> A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 20
Instrukce skoku 32- bit Thumb kódování instrukce A 16-bit conditional branch instruction, with a branch range of 256 to +254 bytes. A 32-bit conditional branch instruction, with a branch range of approximately ± 1MB. B<c>.W <label> B<c>.W <label> kódování podmínky volba stavových bitů (cond) zabírá 4 bity, proto je menší rozsah adresy skoku 21 bitů, +/- 1 MByte A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 21
Kódování instrukcí do strojního kódu Pro detailní výklad problematiky viz lit ARM DDI 0403C_ARM v7-m Architecture Reference Manual, část Chapter A5 Thumb Instruction Set Encoding Poznámka: Pohled na způsob kódování instrukcí může částečně napomoci představě, jak v procesoru ARM probíhá dekódování instrukčního kódu a jeho provedení Může také napomoci vysvětlení způsobu zpětného překladu disassemblingu A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 22
Srovnání instrukce skoku v Thumb a Thumb - 2 16- bit Thumb kódování instrukce skoku A 16-bit conditional branch instruction, with a branch range of 256 to +254 bytes.. 16-bit Compare and Branch on Zero and Compare and Branch on Nonzero instructions, with a branch range of +4 to +130 bytes. See CBNZ, CBZ E7F3 B GPIO_CNF bez podmínky adresa 11 bitů 1110 0111 1111 0011 D0F2 BEQ GPIO_CNF s podmínkou adresa 8 bitů 1101 0000 1111 0010 A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 23
Možnosti využití analyzátoru v simulátoru Použití simulátoru, výklad na přednášce analysis window disassembly window setup přidat signál který se vyskytuje v programu např. gpio_odr zobrazí se 16- bitově možno nastavit rozsah setup Min/Max gpio_odr.8 zobrazí pouze bit 8 zobrazení analog, bit, state ( klik pravá myš na graf) v režimu state nastavení zobrazení hodnot dekadicky, hexadecimálně A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 24
. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 25
zadání masky pro zobrazení bitů zadání GPIOC_ODR.8 zobrazení pouze bitu 8 A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 26
Použití simulátoru Keil. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 27
. Použití log. analyzátoru je pouze při simulaci při běhu programu při break pointu zobrazení stavu pinů A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 28
. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 29
Simulace zobrazení velikosti čísla, analog. zobrazení (DAC). A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 30
.Posun o 8 bitů doprava jako dělení hodnotou 0x100 zobrazení kombinací bitů PC9 a PC8 jako čísel 0, 1, 2, 3 A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 31
. A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 32
. Zobrazení kombinace výstupů v režimu state jako hodnoty A4B38NVS, 2014, J.Fischer, kat. měření, ČVUT - FEL 33