Hlavní navigace

Nejvýkonnější MCU aneb architektura mikrořadičů s jádry ARM Cortex-M7

15. 10. 2015
Doba čtení: 16 minut

Sdílet

Třetí článek o mikrořadičích s architekturou ARM je věnován nejvýkonnějším jádrům, která jsou v současnosti v této oblasti nabízena. Jedná se o jádra s názvem Cortex-M7. Čipy s těmito jádry se v mnoha ohledech odlišují od již popsaných čipů založených na Cortex-M0, Cortex-M0+ a Cortex-M3.

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

4. Pipeline v jádru CPU

5. Prediktor skoků

6. Instrukční sada

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

12. Instrukční sada FPU

13. Porovnání dvou hodnot, porovnání s nulou

14. Přesuny dat, načtení konstanty a konverzní instrukce

15. Odkazy na Internetu

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):

  1. Modul pro operace LOAD/STORE
  2. Integer ALU1 (zpracuje i složitější operace)
  3. Integer ALU2 (zpracuje jen základní operace)
  4. MAC (Multiply & Accumulate, pro DSP operace)
  5. 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.

UX DAy - tip 2

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

  1. A tour of the Cortex-M3 core:
    http://community.arm.com/grou­ps/processors/blog/2013/11/04/a-tour-of-the-cortex-m3-core
  2. Five things you may not know about ARM Cortex-M:
    http://community.arm.com/docs/DOC-6912
  3. Divide and Conquer:
    http://community.arm.com/docs/DOC-8059
  4. MCU market turns to 32-bits and ARM
    http://www.eetimes.com/do­cument.asp?doc_id=1280803
  5. Cortex-M0 Processor (ARM Holdings)
    http://www.arm.com/produc­ts/processors/cortex-m/cortex-m0.php
  6. Cortex-M0+ Processor (ARM Holdings)
    http://www.arm.com/produc­ts/processors/cortex-m/cortex-m0plus.php
  7. ARM Processors in a Mixed Signal World
    http://www.eeweb.com/blog/arm/arm-processors-in-a-mixed-signal-world
  8. ARM Architecture (Wikipedia)
    https://en.wikipedia.org/wi­ki/ARM_architecture
  9. Cortex-M0 (Wikipedia)
    https://en.wikipedia.org/wi­ki/ARM_Cortex-M0
  10. Cortex-M0+ (Wikipedia)
    https://en.wikipedia.org/wi­ki/ARM_Cortex-M#Cortex-M0.2B
  11. Improving ARM Code Density and Performance
    New Thumb Extensions to the ARM Architecture Richard Phelan
  12. The ARM Processor Architecture
    http://www.arm.com/produc­ts/processors/technologies/in­struction-set-architectures.php
  13. Thumb-2 instruction set
    http://infocenter.arm.com/hel­p/index.jsp?topic=/com.ar­m.doc.ddi0344c/Beiiegaf.html
  14. Introduction to ARM thumb
    http://www.eetimes.com/dis­cussion/other/4024632/Intro­duction-to-ARM-thumb
  15. ARM, Thumb, and ThumbEE instruction sets
    http://www.keil.com/suppor­t/man/docs/armasm/armasm_CEG­BEIJB.htm
  16. An Introduction to ARM Assembly Language
    http://dev.emcelettronica­.com/introduction-to-arm-assembly-language
  17. Processors – ARM
    http://www.arm.com/produc­ts/processors/index.php
  18. The ARM Instruction Set
    http://simplemachines.it/doc/ar­m_inst.pdf
  19. Instrukce typu SIMD na mikroprocesorech RISC
    http://www.root.cz/clanky/instrukce-typu-simd-na-mikroprocesorech-risc/
  20. Instrukce typu SIMD na mikroprocesorech RISC (2. část)
    http://www.root.cz/clanky/instrukce-typu-simd-na-mikroprocesorech-risc-2-cast/
  21. 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/

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.