Hlavní navigace

Názor k článku Pohled programátora na mikroprocesory ARM od Pavel Píša - Zdravím do Brna a děkuji za články. Pro...

  • Článek je starý, nové názory již nelze přidávat.
  • 15. 3. 2012 0:07

    Pavel Píša (neregistrovaný)

    Zdravím do Brna a děkuji za články. Pro seznámení s architekturou ARM jsou podle mě pěkné.

    A ta nejlepší zpráva na konec – s využitím speciální instrukce skoku je možné se přepínat mezi instrukční sadou Thumb a původní instrukční sadou ARM, a to dokonce i v rámci jednotlivých funkcí.

    Tady jen stojí za to připomenout, že původní návrh ARM7TDMI potřeboval pro interoperabilitu 32-ARM a Thumb kódu striktně používat bx. Pokud tedy měl být 32-bit kód v režimu interworking, tak se přišlo o možnost elegantních návratů s ldm do r15/pc a všechna volání funkcí se buď strašlivě zkomplikují kvůli nutnosti samostatné instrukce pro uložení návratové hodnoty do r14/ld nebo nutnosti přidání přepínacích stub funkcí k 16-bit kódu. ARMv5 to již napravil přidáním BLX, ale pro přenositelný kód to již bylo pozdě.

    Dále se v této instrukční sadě neobjevují bity určené pro podmíněné provádění instrukcí, což znamená, že je nutné se vrátit k použití podmíněných skoků. Na druhou stranu se však délka všech instrukcí zkrátila na šestnáct bitů, což dovoluje dosažení větší „hustoty“ kódu.

    Díky instrukcím IT, ITT, ITTT, ITE, ITTE, ITEE ... vychází Thumb kód podle mě téměř stejně dobře/někdy i lépe než ARM32. Neztrácí se cenné bity na často nevyužitou podmínku v každé instrukci. Tím jsou instrukce kratší a jen tam, kde je to potřeba, se přidá instrukce z rodiny ITE, která podmíní následující T instrukce ITE podmínkou uvedenou za ITE a E instrukce podmínkou opačnou. Přitom skutečný efekt/vykonávání odpovídá tomu, že se následující instrukce o podmínkové kódy rozšíří na 32bit ekvivalenty. Na to je potřeba pamatovat, když některé instrukce v ITE bloku nastavují podmínkové bity, pak se třeba stane, že proběhne z ITTE jedna instrukce z T větve a E na konci. Jsou případy, kdy se to hodí, jsou případy, kdy je to k vzteku - ještě když původní Thumb-1 pro některé instrukce dovoluje jen variantu s nastavením příznaků (ADD pro LO registry bez varování přeloženo jako ADDS) aniž je to předepsané, protože druhá varianta neexistuje. Na Thumb-2 je to již řešeno lépe.

    Obecně si ale myslím, že ITE je správné řešené. Případ delší sekvence instrukcí blokovaných podmínkou stejně smysl nemá, protože je pomalejší než skok. Takže nápad se ARMům povedl, jen je škoda, že rovnou neoptimalizovali sadu Thumb jako plnohodnotnou (bez nutnosti ARM32 OS nebo alespoň obsluhy výjimek) a s rozumněji kódovanými registry a S variantami třeba i za cenu prokládání s 32-bit instrukcemi rovnou. Takto Thumb-2 již musí zachovávat některé obezličky z první verze.