Obsah
1. Nejvýkonnější MCU aneb architektura mikrořadičů s jádry ARM Cortex-M7
2. Interní struktura jader Cortex-M7
3. Volitelné moduly, které může výrobce čipu použít
7. Aritmetické operace se saturací
8. Instrukce pro násobení a dělení
9. Skoky, podmíněné skoky a prefix IT
10. Rozeskoky s využitím instrukcí TBB a TBH
11. Práce s čísly s plovoucí řádovou čárkou
13. Porovnání dvou hodnot, porovnání s nulou
14. Přesuny dat, načtení konstanty a konverzní instrukce
1. Nejvýkonnější MCU aneb architektura mikrořadičů s jádry ARM Cortex-M7
V prvním článku o procesorových jádrech s architekturou ARM, která jsou určena pro použití v mikrořadičích, jsme se seznámili s nejmenšími a současně i s nejméně výkonnými jádry. Tato jádra nesou označení buď Cortex-M0 (starší řada) nebo Cortex-M0+ (řada novější, která se interně od původní řady hned v několika ohledech odlišuje) a jejich aplikační oblastí je náhrada některých výkonnějších osmibitových a šestnáctibitových mikrořadičů (čipy ARM jsou samozřejmě plně 32bitové) i použití v zařízeních napájených z akumulátorů popř. dobíjených z malých solárních panelů. Minule byla naopak popsána poněkud výkonnější procesorová jádra Cortex-M3, která se díky příznivým poměrům cena:energetické nároky:výpočetní výkon používají v poměrně mnoha zařízeních. Typickým příkladem je Arduino Due s čipem Atmel SAM3X8E, jenž je na Cortexu-M3 založen.
Společnost ARM však navrhla i mnohem výkonnější procesorová jádra určená do těch aplikací, u nichž je důležitý jak výpočetní výkon, tak i rychlá reakce na přerušení. Tato jádra nesou označení Cortex-M7 a jsou založena na architektuře ARMv7E-M, na rozdíl od čipů Cortex-M0/Cortex-M0+ s jednodušší architekturou ARMv6-M či Cortex-M3 s architekturou ARMv7-M. V praxi to pro vývojáře znamená, že binární programy jsou dopředně přenositelné ve směru Cortex-M0 → Cortex-M3 → Cortex-M7, ovšem v opačném směru Cortex-M7 → Cortex-M3 → Cortex-M0 pouze za splnění několika předpokladů (v programech se například nesmí využívat instrukce matematického koprocesoru, instrukční prefix IT při přenosu na Cortex-M0/Cortex-M0+ apod.). Pro lepší ilustraci se opět (již naposledy :-) podívejme na tabulku obsahující ARMovská jádra určená pro použití v mikrořadičích:
# | Jádro | Architektura ARM | Architektura CPU/MCU | MPU |
---|---|---|---|---|
1 | Cortex-M0 | ARMv6-M | Von Neumann | ne |
2 | Cortex-M0+ | ARMv6-M | Von Neumann | volitelná |
3 | Cortex-M1 | ARMv6-M | Von Neumann | ne |
4 | Cortex-M3 | ARMv7-M | Harvardská | volitelná |
5 | Cortex-M4 | ARMv7E-M | Harvardská | volitelná |
6 | Cortex-M7 | ARMv7E-M | Harvardská | volitelná |
2. Interní struktura jader Cortex-M7
Interní struktura mikroprocesorových jader Cortex-M7 je v porovnání s poměrně minimalistickými jádry Cortex-M0/M0+/M3 již poměrně komplikovaná, protože obsahuje větší množství modulů, z nichž některé jsou volitelné. To v praxi znamená, že při konkrétním návrhu čipu se výrobce rozhodne, zda daný modul použije či nikoli (FPU, ECC), popř. kolik plochy čipu a energetických nároků „obětuje“ pro jeho implementaci (může se například měnit velikost datové a instrukční cache atd.). Ústředním prvkem každého mikrořadiče je samozřejmě vlastní jádro s architekturou ARMv7-M (toto jádro obsahuje násobičky i děličky). K tomuto jádru jsou připojeny další moduly či sběrnice stručně popsané v následující tabulce:
# | Modul | Význam | Stručný popis |
---|---|---|---|
1 | NVIC | Nested Vectored Interrupt Controller | řídí přerušení s až z 240 vstupy a 256 prioritami |
2 | WIC | Wake-up Interrupt Controller | umožňuje řídit přerušení, když CPU spí (je ve stavu SLEEP) |
3 | FPU | Floating Point Unit | matematický koprocesor |
4 | I-cache | I-cache | cache pro instrukce (binární programový kód) |
5 | D-cache | D-cache | cache pro data |
6 | Instr.TCM | Tightly-Coupled Memory | rozhraní pro komunikaci s TCM (velikost TCM je konfigurovatelná) |
7 | Data TCM | Tightly-Coupled Memory | rozhraní pro komunikaci s TCM (velikost TCM je konfigurovatelná) |
8 | MPU | Memory Protection Unit | jednotka pro řízení přístupu do paměti (počet oblastí je konfigurovatelný) |
9 | DWT | Data Watchpoint and Trace Unit | modul pro ladění a trasování |
10 | ECC | Error Correcting Code | ECC pro instrukční cache či volitelně pro TCM |
3. Volitelné moduly, které může výrobce čipu použít
Jak jsme si již řekli v předchozí kapitole, má výrobce konkrétního mikrořadiče či SoC poměrně mnoho možností, jak ovlivnit konfiguraci jednotlivých bloků:
# | Modul | Možnosti výrobce čipu |
---|---|---|
1 | NVIC | nedílná součást čipu umístěna mezi vstupy přerušení a CPU |
2 | WIC | volby: neimplementováno/implementováno |
3 | FPU | volby: neimplementováno/jen single/single i double |
4 | I-cache | volby: 4kB, 8kB, 16kB, 32kB, 64kB |
5 | D-cache | volby: 4kB, 8kB, 16kB, 32kB, 64kB |
6 | Instr.TCM | volby: neimplementováno popř. 4kB až 16MB |
7 | Data TCM | volby: neimplementováno popř. 4kB až 16MB |
8 | MPU | volby: 0, 8 či 16 regionů |
9 | DWT | volby: neimplementováno/implementováno |
10 | ECC | volby: neimplementováno/implementováno |
Na tomto místě je vhodné upozornit zejména na možnosti konfigurace matematického koprocesoru, protože s jeho existencí či naopak neexistencí se setká prakticky každý vývojář. Navíc může být koprocesor nakonfigurován takovým způsobem, že bude podporovat pouze numerické hodnoty typu float/single a nikoli double (což má význam pro mnoho aplikací).
4. Pipeline v jádru CPU
Zajímavé je uspořádání pipeline procesorů s jádry Cortex-M7. První tři řezy pipeline jsou shodné pro všechny typy operací: fetch, decode, issue. V posledním řezu se provádí rozhodnutí, který modul bude instrukci skutečně vykonávat (execute). K dispozici jsou čtyři popř. u některých konfigurací i pět paralelně běžících modulů (samostatných pipeline):
- Modul pro operace LOAD/STORE
- Integer ALU1 (zpracuje i složitější operace)
- Integer ALU2 (zpracuje jen základní operace)
- MAC (Multiply & Accumulate, pro DSP operace)
- FPP (pokud je na čipu implementován FPU)
Před vlastní pipeline se nachází ještě modul pro prefetch s frontou instrukcí o kapacitě 4×64 bitů.
5. Prediktor skoků
Důležitou součástí prakticky všech RISCových procesorů je i prediktor skoků, jehož úkolem je dodávat do pipeline tu sekvenci instrukcí, která odpovídá předpovězené větvi za podmíněným skokem. Prediktor by tedy měl dopředu odhadnout, zda se podmíněný skok provede či nikoli a to ještě předtím, než dojde k vyhodnocení podmínek. Jádra Cortex-M7 kombinují možnosti statického prediktoru s prediktorem dynamickým. Dynamický prediktor je založen na BTAC (Branch Target Address Cache) pamatující si pro již provedenou instrukci skoku (její adresu) příznak, zda byl skok proveden či nikoli. Zde se jedná o jednobitový příznak, i když existují i složitější prediktory. Statický prediktor skoků je použit v případě, že daný skok ještě nebyl proveden. Statický prediktor pracuje jednoduše: u podmíněných skoků s adresou směřující směrem k začátku programu se předpokládá, že se skok provede (jedná se o smyčku), u ostatních skoků se předpokládá, že se neprovede. Ihned poté, co je instrukce skoku vykonána, se informace o provedení/neprovedení skoku uloží do již zmíněné BTAC. Úspěšnost predikce této kombinace se uvádí okolo 90% (lze najít i vyšší hodnoty, ovšem větší úspěšnost mívají dvoubitové dynamické prediktory).
6. Instrukční sada
Podobně jako tomu bylo u procesorových jader řady Cortex-M3, podporují i jádra Cortex-M7 instrukční sady Thumb i Thumb-2. Navíc jsou podporovány i instrukce matematického koprocesoru, které jsou vykonávány na FPU, samozřejmě za předpokladu, že je FPU součástí čipu (jedná se totiž o jeho volitelnou část). V následujících kapitolách se zmíníme o některých zajímavých instrukcích, z nichž mnohé souvisí s jednou aplikační oblastí jader Cortex-M7 – zpracování digitálních signálů (typicky se zde používají instrukce typu Multiply & Accumulate apod.).
7. Aritmetické operace se saturací
Kromě běžných aritmetických operací je možné u čipů s jádry Cortex-M7 použít i operace se saturací. Při využití těchto operací nedojde k přetečení přes maximální či minimální 8bitovou, 16bitovou či 32bitovou hodnotu (se znaménkem či bez znaménka), ale výpočet se „zasekne“ na minimální či maximální hodnotě. Aritmetické operace se saturací jsou velmi užitečné pro mnoho algoritmů z oblasti digitálního zpracování signálu, což je ostatně vcelku dobře ilustrováno na obrázcích.

Obrázek 1: Zdrojový rastrový obrázek (známá fotografie Lenny), který tvoří zdroj pro jednoduchý konvoluční (FIR) filtr, jenž zvyšuje hodnoty pixelů o pevně zadanou konstantu (offset).
V následující tabulce jsou vypsány všechny aritmetické operace se saturací výsledků:
# | Instrukce | Typ | Šířka operandů | Poznámka |
---|---|---|---|---|
1 | SSAT | Signed | 32 bitů | posun operandu před výpočtem |
2 | SSAT16 | Signed | 2×16 bitů | posun operandu před výpočtem |
3 | USAT | Unsigned | 32 bitů | posun operandu před výpočtem |
4 | USAT16 | Unsigned | 2×16 bitů | posun operandu před výpočtem |
5 | QADD | Signed | 32 bitů | součet se saturací |
6 | QADD8 | Signed | 4×8 bitů | součet se saturací |
7 | QADD16 | Signed | 2×16 bitů | součet se saturací |
8 | QSUB | Signed | 32 bitů | rozdíl se saturací |
9 | QSUB8 | Signed | 4×8 bitů | rozdíl se saturací |
10 | QSUB16 | Signed | 2×16 bitů | rozdíl se saturací |
11 | QASX | Signed | 32 bitů | add + exchange |
12 | QSAX | Signed | 32 bitů | sub + exchange |
13 | QDADD | Signed | 32 bitů | druhý operand je před výpočtem vynásoben dvěma |
14 | QDSUB | Signed | 32 bitů | druhý operand je před výpočtem vynásoben dvěma |
15 | UQADD8 | Unsigned | 4×8 bitů | součet se saturací |
16 | UQADD16 | Unsigned | 2×16 bitů | součet se saturací |
17 | UQSUB8 | Unsigned | 4×8 bitů | rozdíl se saturací |
18 | UQSUB16 | Unsigned | 2×16 bitů | rozdíl se saturací |
19 | UQASX | Unsigned | 32 bitů | add + exchange |
20 | UQSAX | Unsigned | 32 bitů | add + exchange |

Obrázek 2: Pokud je pro přičtení offsetu použita operace součtu se zanedbáním přenosu (carry), tj. když se počítá systémem „modulo N“, dochází při překročení maximální hodnoty pixelu (čistě bílá barva) k jasně viditelným chybám.

Obrázek 3: Při použití operace součtu se saturací sice taktéž dojde ke ztrátě informace (vzniknou oblasti s pixely majícími hodnotu 255), ovšem viditelná chyba je mnohem menší, než na předchozím obrázku.
8. Instrukce pro násobení a dělení
Již v předchozím textu jsme si řekli, že jádra Cortex-M7 obsahují hardwarovou násobičku a děličku. Násobička podporuje takřka nepřeberné množství instrukcí pro násobení celočíselných operandů typu signed či unsigned (se znaménkem, bez znaménka) s tím, že výsledek je buď 32bitová hodnota či hodnota 64bitová. Navíc je možné určit, zda se má výsledek násobení přičíst k mezivýsledku a provést tak v oblasti digitálního zpracování signálů velmi užitečnou operaci nazývanou „Multiply&Accumulate“:
# | Instrukce | Operandy | Výsledek | Operace |
---|---|---|---|---|
1 | MUL | 32bit×32bit | 32bit | násobení |
2 | MAL | 32bit×32bit | 32bit | násobení a přičtení výsledku (Multiply and Accumulate) |
3 | MLS | 32bit×32bit | 32bit | násobení a odečtení výsledku (Multiply and Subtract) |
4 | SMULL | 32bit×32bit | 64bit | násobení hodnot se znaménkem |
5 | SMLAL | 32bit×32bit | 64bit | Multiply and Accumulate (se znaménkem) |
6 | SMLAB | 16bit×32bit | 32bit | Multiply and Accumulate (se znaménkem) |
7 | SMLAT | 16bit×32bit | 32bit | Multiply and Accumulate (se znaménkem) |
8 | SMLALB | 16bit×32bit | 64bit | Multiply and Accumulate (se znaménkem) |
9 | SMLALT | 16bit×32bit | 64bit | Multiply and Accumulate (se znaménkem) |
10 | UMULL | 32bit×32bit | 64bit | násobení hodnot bez znaménka |
11 | UMLAL | 32bit×32bit | 64bit | Multiply and Accumulate (bez znaménka) |
12 | UMAAL | 32bit×32bit+32+32 | 64bit | Multiply and Accumulate long (bez znaménka) |
13 | SMLAD | 16bit×16bit | 32bit | násobení dvouprvkových vektorů |
14 | SMLADX | 16bit×16bit | 32bit | násobení dvouprvkových vektorů |
Následují další kombinace typů operandů, výsledků a konverzí po provedení operace násobení:
# | Instrukce | Operace |
---|---|---|
1 | SMLALD | Signed Multiply Accumulate Long Dual |
2 | SMLAWB | Signed Multiply Accumulate (word by halfword) |
3 | SMLAWT | Signed Multiply Accumulate (word by halfword) |
4 | SMLSD | Signed Multiply Subtract Dual |
5 | SMLSLD | Signed Multiply Subtract Long Dual |
6 | SMMLA | Signed Most Significant Word Multiply Accumulate |
7 | SMMLS | Signed Most Significant Word Multiply Subtract |
8 | SMUAD | Signed Dual Multiply Add |
9 | SMULB | Signed Multiply (word by halfword) |
10 | SMULT | Signed Multiply (word by halfword) |
11 | SMMUL | Signed Most Significant Word Multiply |
12 | SMULWB | Signed Multiply (word by halfword) |
Instrukce pro dělení zůstávají jednoduché a snadno pochopitelné. Připomeňme si, že dělička pracuje relativně pomalu, na rozdíl od klasické ALU:
# | Instrukce | Operandy | Výsledek | Operace |
---|---|---|---|---|
1 | SDIV | 32bit×32bit | 32bit | operace dělení hodnot se znaménkem |
2 | UDIV | 32bit×32bit | 32bit | operace dělení hodnot bez znaménka |
9. Skoky, podmíněné skoky a prefix IT
V instrukční sadě nalezneme prakticky úplný repertoár skoků, a to jak nepodmíněných skoků, tak i skoků s podmínkou. Samozřejmě nesmí chybět pro architekturu ARM typické skoky, které zachovají původní (návratovou) adresu v link registru. Podle toho, zda je adresa skoku součástí instrukce či zda je použita adresa v registru, lze použít následující kombinace instrukcí:
# | Instrukce | Adresa | Rozsah skoku |
---|---|---|---|
1 | B | konstanta | –16MB..16MB |
2 | B+cond | konstanta | –1MB..1MB |
3 | B+cond v bloku IT | konstanta | –16MB..16MB |
4 | BL | konstanta | –16MB..16MB |
5 | BL+cond | konstanta | –1MB..1MB |
6 | BX | registr | kamkoli |
7 | BX+cond | registr | kamkoli |
8 | BLX | registr | kamkoli |
9 | BLX+cond | registr | kamkoli |
Podobně jako u jader Cortex-M3, i zde nalezneme instrukci pro provedení skoku, pokud je vybraný registr nulový či naopak nenulový. K instrukcím lze přiřadit i další podmínku umožňující nastavit, zda se má vůbec instrukce provést:
# | Instrukce |
---|---|
1 | CBZ |
2 | CBZN |
3 | CBZ+cond |
4 | CBZN+cond |
Nesmíme zapomenout ani na minule zmíněný instrukční prefix IT. Tento prefix může být aplikován na jednu až čtyři instrukce následující za prefixem. Ihned za prefixem IT se (bez mezery) udává, zda má být daná instrukce provedena při splnění podmínky (T – then) či naopak při jejím nesplnění (E – else). U první instrukce je automaticky předpokládáno T, tudíž se uvádí maximálně tři kombinace znaků T/E. Samozřejmě je taktéž nutné zapsat i testovanou podmínku – může se jednat o kódy používané jak u podmíněných skoků, tak i v podmínkových bitech.
10. Rozeskoky s využitím instrukcí TBB a TBH
Zajímavé a vlastně i docela užitečné jsou instrukce TBB (Table Branch Byte) a TBH (Table Branch Halfword), které mohou být použity například při překladu aplikací napsaných ve vyšších programovacích jazycích, typicky céčka s jazykovou konstrukcí typu switch. První registr předávaný této instrukci obsahuje adresu tabulky skoků, přičemž platí, že pokud se použije PC, bude tabulka umístěná ihned za instrukcí (pěkný trik). Druhý registr obsahuje index do tabulky, z níž se přečte bajt či 16bitové slovo a na základě jeho hodnoty se provede skok relativně k hodnotě uložené v PC. Zajímavé je, že pokud se použije instrukce TBH, je načtený offset nejprve zdvojnásoben. Kdy je možné tyto instrukce použít? Nabízí se množství aplikací, například implementace interpretrů různých bajtkódů, skoková tabulka pro jednotlivé klávesy (u komplikovanějšího programu) apod.
11. Práce s čísly s plovoucí řádovou čárkou
Jádra Cortex-M7 mohou obsahovat samostatně pracující jednotku určenou pro provádění operací s hodnotami reprezentovanými v systému plovoucí řádové čárky. Tato jednotka může, opět v závislosti na konkrétní konfiguraci čipu zvolené výrobcem, pracovat pouze s čísly s jednoduchou přesností (single/float) nebo alternativně i s čísly s přesností dvojnásobnou (double). Přitom se operace provádí s pracovními registry nazvanými S0-S31 (single), na které se mapují aliasy nazvané D0-D15 (double). Mimochodem: ne vždy je výhodné používat FPU, protože zejména při příchodu přerušení je nutné uložit pracovní registry na zásobník, takže v případě, že je FPU detekován a používán, se musí kromě osmice R0, R1, R2, R3, R12, LR, PC, PSR navíc uložit i sedmnáct registrů S0..S15, FPSCR (poslední registr obsahuje řídicí a stavové příznaky FPU).
12. Instrukční sada FPU
Nyní se již dostáváme k popisu jednotlivých instrukcí FPU. Zajímavý je především fakt, že každá instrukce obsahuje příznak, zda se má provádět operace s hodnotami/registry typu single či double. Instrukce taktéž obsahují příznakové bity určující, za jakých podmínek se instrukce má provést. Význam těchto příznakových bitů je poněkud odlišný od bitů použitých v instrukční sadě ARM, a to především z toho důvodu, že příznak V má jiný význam (přetečení hodnoty celého čísla do znaménkového bitu versus dvě FP hodnoty nelze porovnat).
V následující tabulce jsou vypsány základní aritmetické operace:
# | Instrukce | Význam | Prováděný výpočet |
---|---|---|---|
1 | VADD Fd, Fn, Fm | součet | Fd := Fn + Fm |
2 | VSUB Fd, Fn, Fm | rozdíl | Fd := Fn – Fm |
3 | VNEG Fd, Fm | změna znaménka | Fd := – Fm |
4 | VABS Fd, Fm | absolutní hodnota | Fd := abs(Fm) |
5 | VSQRT Fd, Fm | druhá odmocnina | Fd := sqrt(Fm) |
6 | VDIV Fd, Fn, Fm | dělení | Fd := Fn / Fm |
7 | VMUL Fd, Fn, Fm | násobení | Fd := Fn * Fm |
8 | VMLA Fd, Fn, Fm | násobení + akumulace | Fd := Fd + (Fn * Fm) |
9 | VMLS Fd, Fn, Fm | odečtení součinu | Fd := Fd – (Fn * Fm) |
10 | VNMUL Fd, Fn, Fm | násobení + změna znaménka | Fn := – (Fn * Fm) |
11 | VNMLA Fd, Fn, Fm | kombinace VNMUL a VMLA | Fd := – Fd – (Fn * Fm) |
12 | VNMLS Fd, Fn, Fm | kombinace VNMUL a VMLS | Fd := – Fd + (Fn * Fm) |
Poznámka: povšimněte si především šesti různých variant násobení. To je zapříčiněno tím, že se FPU používá například i pro filtraci obrazu, FFT atd., kde lze tyto operace s výhodou použít.
13. Porovnání dvou hodnot, porovnání s nulou
Mezi další důležité operace prováděné matematickými koprocesory patří instrukce pro porovnání dvou hodnot (samozřejmě uložených ve dvojici registrů), popř. porovnání hodnoty jednoho registru s nulou. Porovnání je provedeno instrukcí VCMP, u níž lze navíc pomocí prefixu „P“ určit, ve kterých případech se má vyvolat výjimka. Porovnání nastaví všechny čtyři příznakové bity C, Z, N a V. Pro přesun příznakových bitů z registru FPSCR do registru CSR je nutné použít instrukci VMRS APSR_nzcv, FPSCR:
# | Instrukce | Význam | Prováděný výpočet |
---|---|---|---|
1 | VCMP Fd, Fm | Porovnání obsahu dvou registrů | Fd – Fm |
2 | VCMP Fd, #0.0 | Porovnání jednoho registru s nulou | Fd – 0.0 |
14. Přesuny dat, načtení konstanty a konverzní instrukce
V poslední tabulce jsou vypsány instrukce FPU provádějící různé přesuny dat s případnými konverzemi dat:
# | Instrukce | Význam |
---|---|---|
1 | VCVT{C}.F64.F32 Dd, Sm | Konverze single na double |
2 | VCVT{C}.F32.F64 Sd, Dm | Konverze double na single |
3 | VCVT{C}.F32/F64.U32 Fd, Sm | Konverze unsigned integer na float |
4 | VCVT{C}.F32/F64.S32 Fd, Sm | Konverze signed integer na float |
5 | VCVT{R}{C}.U32.F32/F64 Sd, Fm | Konverze float na unsigned integer |
6 | VCVT{R}{C}.S32.F32/F64 Sd, Fm | Konverze float na signed integer |
7 | VCVT.F32/F64.typ Fd, Fd, #bitů | Konverze fixed-point na float (volitelná pozice tečky) |
8 | VCVT.typ.F32/F64 Fd, Fd, #bitů | Konverze float na fixed-point (volitelná pozice tečky) |
9 | VCVTT.F16.F32 Sd,Sm | Konverze single na half (do horních 16 bitů registru) |
10 | VCVTB.F16.F32 Sd,Sm | Konverze single na half (do spodních 16 bitů registru) |
11 | VCVTT.F32.F16 Sd,Sm | Konverze half na single |
12 | VCVTB.F32.F16 Sd,Sm | Konverze half na single |
13 | VMOV.F32/F64 Fd, Fm | Fd := Fm (prostá kopie) |
14 | VMOV Sn, Rd | Sn := Rd (Rd = registr ARM procesoru) |
15 | VMOV Rd, Sn | Rd := Sn (Rd = registr ARM procesoru) |
16 | VMOV Sn, Sm, Rd, Rn | Sn := Rd, Sm := Rn (kopie dvou registrů) |
17 | VMOV Rd, Rn, Sn, Sm | Rd := Sn, Rn := Sm (kopie dvou registrů) |
18 | VMOV Dm, Rd, Rn | Dm[31:0] := Rd, Dm[63:32] := Rn (pro double jsou zapotřebí dva ARM registry) |
19 | VMOV Rd, Rn, Dm | Rd := Dm[31:0], Rn := Dm[63:32] (pro double jsou zapotřebí dva ARM registry) |
20 | VMOV Dn[0], Rd | Dn[31:0] := Rd (pouze spodní polovina double) |
21 | VMOV Rd, Dn[0] | Rd := Dn[31:0] (pouze spodní polovina double) |
22 | VMOV Dn[1], Rd | Dn[63:32] := Rd (pouze horní polovina double) |
23 | VMOV Rd, Dn[1] | Rd := Dn[63:32] (pouze horní polovina double) |
24 | VMRS APSR_nzcv, FPSCR | APSR flags := FPSCR flags (přenos příznaků) |
15. Odkazy na Internetu
- A tour of the Cortex-M3 core:
http://community.arm.com/groups/processors/blog/2013/11/04/a-tour-of-the-cortex-m3-core - Five things you may not know about ARM Cortex-M:
http://community.arm.com/docs/DOC-6912 - Divide and Conquer:
http://community.arm.com/docs/DOC-8059 - MCU market turns to 32-bits and ARM
http://www.eetimes.com/document.asp?doc_id=1280803 - Cortex-M0 Processor (ARM Holdings)
http://www.arm.com/products/processors/cortex-m/cortex-m0.php - Cortex-M0+ Processor (ARM Holdings)
http://www.arm.com/products/processors/cortex-m/cortex-m0plus.php - ARM Processors in a Mixed Signal World
http://www.eeweb.com/blog/arm/arm-processors-in-a-mixed-signal-world - ARM Architecture (Wikipedia)
https://en.wikipedia.org/wiki/ARM_architecture - Cortex-M0 (Wikipedia)
https://en.wikipedia.org/wiki/ARM_Cortex-M0 - Cortex-M0+ (Wikipedia)
https://en.wikipedia.org/wiki/ARM_Cortex-M#Cortex-M0.2B - Improving ARM Code Density and Performance
New Thumb Extensions to the ARM Architecture Richard Phelan - The ARM Processor Architecture
http://www.arm.com/products/processors/technologies/instruction-set-architectures.php - Thumb-2 instruction set
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Beiiegaf.html - Introduction to ARM thumb
http://www.eetimes.com/discussion/other/4024632/Introduction-to-ARM-thumb - ARM, Thumb, and ThumbEE instruction sets
http://www.keil.com/support/man/docs/armasm/armasm_CEGBEIJB.htm - An Introduction to ARM Assembly Language
http://dev.emcelettronica.com/introduction-to-arm-assembly-language - Processors – ARM
http://www.arm.com/products/processors/index.php - The ARM Instruction Set
http://simplemachines.it/doc/arm_inst.pdf - Instrukce typu SIMD na mikroprocesorech RISC
http://www.root.cz/clanky/instrukce-typu-simd-na-mikroprocesorech-risc/ - Instrukce typu SIMD na mikroprocesorech RISC (2. část)
http://www.root.cz/clanky/instrukce-typu-simd-na-mikroprocesorech-risc-2-cast/ - Instrukce typu SIMD na mikroprocesorech RISC (3.část – MIPS-3D a VIS)
http://www.root.cz/clanky/instrukce-typu-simd-na-mikroprocesorech-risc-3-cast-mips-3d-a-vis/