Obsah
2. Skoky do podprogramů a výskoky z podprogramů
3. Práce se zásobníkem, vytvoření a zrušení zásobníkového rámce
4. Instrukce specifické pro DSP modul mikrořadičů dsPIC
5. Formáty numerických hodnot zpracovávaných v DSP modulu
7. Instrukce určené pro práci s akumulátory DSP modulu
8. Akumulátory a podmíněné skoky
10. Instrukce REPEAT – jednoduchá forma počítané programové smyčky
11. Implementace programové smyčky s využitím instrukce DO
12. Zásobník umožňující vnořování smyček DO
13. Registry použité ve smyčkách
1. Přímé a nepřímé skoky
V předchozí části tohoto seriálu jsme si mj. popsali i skupinu skokových instrukcí BRA. Základní instrukce provádí nepodmíněný skok, další instrukce pak skok podmíněný. Všechny skoky BRA jsou však relativní, což zde konkrétně znamená, že pokud je podmínka splněna, je k obsahu registru PC přičtena šestnáctibitová konstanta se znaménkem, která je součástí instrukčního slova a která je navíc vynásobena dvěma:
Instrukce | Stručný popis |
---|---|
BRA | nepodmíněný skok |
BRA C | skok při Carry=1 |
BRA NC | skok při Carry=0 |
BRA Z | skok při Zero=1 |
BRA NZ | skok při Zero=0 |
BRA N | skok při Negative=1 |
BRA NN | skok při Negative=0 |
BRA OV | skok při Overflow=1 |
BRA NOV | skok při Overflow=0 |
BRA GE | skok při podmínce ≥ (signed) |
BRA GEU | skok při podmínce ≥ (unsigned) |
BRA GT | skok při podmínce > (signed) |
BRA GTU | skok při podmínce > (unsigned) |
BRA LE | skok při podmínce ≤ (signed) |
BRA LEU | skok při podmínce ≤ (unsigned) |
BRA LT | skok při podmínce < (signed) |
BRA LTU | skok při podmínce < (unsigned) |
Kromě toho však v instrukčním souboru nalezneme i několik instrukcí pro provedení přímých či nepřímých absolutních skoků. Tyto instrukce se mj. i z historických důvodů (osmibitové PICy) jmenují GOTO a mohou být použity buď s absolutní adresou či s adresou uloženou do buňky paměti adresované vybraným pracovním registrem (nepřímý skok). Poslední instrukce GOTO.L je zvláštní tím, že provádí skok na 24bitovou adresu uloženou v pracovním registru Wn (spodních šestnáct bitů adresy) a v registru Wn+1 (spodní polovina tohoto registru tvoří bity adresy s indexy 16 až 23):
Instrukce | Stručný popis |
---|---|
GOTO … | přímý skok na zadanou adresu |
GOTO Wn | nepřímý skok na adresu uloženou v pracovním registru Wn |
GOTO.L Wn | nepřímý „dlouhý“ skok na adresu uloženou v pracovním registru Wn a Wn+1 |
2. Skoky do podprogramů a výskoky z podprogramů
V instrukčním souboru nalezneme i několik instrukcí určených pro provedení skoku do podprogramu (zavolání podprogramu) a pro návrat z něj. Návratová adresa je samozřejmě ukládána na zásobník, a to konkrétně ve dvou slovech: nejdříve spodních šestnáct bitů návratové adresy následované osmi nejvyššími bity doplněnými nulami. Ukazatel na vrchol zásobníku je tvořen pracovním registrem W15. První tři instrukce pro zavolání podprogramu jsou vlastně obdobou instrukcí, o nichž jsme se zmínili v předchozí kapitole, samozřejmě s tím rozdílem, že se ještě před skokem uloží návratová hodnota na zásobník. Za zmínku stojí i instrukce RETLW, která je pro procesory PIC typická, protože podobná instrukce (návrat ze subrutiny s naplněním pracovního registru konstantou), se používala i u osmibitových čipů PIC (tam ovšem existoval jen jediný pracovní registr W):
Instrukce | Stručný popis |
---|---|
CALL … | přímý skok do podprogramu na zadanou adresu |
CALL Wn | nepřímý skok do podprogramu na adresu uloženou v pracovním registru Wn |
CALL.L Wn | nepřímý „dlouhý“ skok do podprogramu na adresu uloženou v pracovním registru Wn a Wn+1 |
RCALL … | relativní skok vůči PC |
RCALL Wn | relativní skok na adresu PC+Wn |
RETURN | návrat z podprogramu |
RETLW #konstanta, Wn | návrat z podprogramu s uložením konstanty do registru Wn |
3. Práce se zásobníkem, vytvoření a zrušení zásobníkového rámce
Další skupina osmi instrukcí slouží pro ukládání běžných dat na zásobník. Buď se ukládají jednotlivá slova do jediného prvku zásobníku, nebo je možné jedinou instrukcí uložit (popř. obnovit) dva po sobě následující pracovní registry. Připomeňme si, že termínem „file register“ je v kontextu mikrořadičů PIC24 a dsPIC myšlena libovolná přímá adresa 0×0000 až 0×1fff:
Instrukce | Stručný popis |
---|---|
PUSH f | uložení „file registru“ na zásobník |
PUSH Wn | uložení pracovního registru na zásobník |
PUSH.D Wn | uložení dvou pracovních registrů na zásobník |
POP f | obnovení „file registru“ ze zásobníku |
POP Wn | obnovení pracovního registru ze zásobníku |
POP.D Wn | obnovení dvou pracovních registrů ze zásobníku |
LNK | vytvoření zásobníkového rámce |
ULNK | zrušení zásobníkového rámce |
Poslední dvě instrukce si zaslouží bližší popis. Tyto instrukce totiž umožňují vytvořit s použitím pracovního registru W14 takzvaný „zásobníkový rámec“ (stack frame) využívaný při volání funkcí prakticky všemi vyššími programovacími jazyky. Instrukce LNK je zavolána s konstantou (operandem) určující, jak velký zásobníkový rámec se má vytvořit, tj. o kolik prvků se má posunout ukazatel na vrchol zásobníku. Opakem je funkce ULNK, která obnoví původní adresu ukazatele na vrchol zásobníku (z registru W14).
4. Instrukce specifické pro DSP modul mikrořadičů dsPIC
V následujících kapitolách se budeme zabývat převážně těmi instrukcemi, které se používají pro práci s DSP modulem. Ten nalezneme jen u čipů řady dsPIC30F, dsPIC33F a dsPIC33E, nikoli u řad PIC24F, PIC24H či PIC24E.
U čipů dsPIC30F, dsPIC33F a dsPIC33E se kromě pracovních registrů setkáme i s akumulátory pojmenovanými ACCA a ACCB, které se používají u mnoha operací pro zpracování signálu. Tyto akumulátory jsou dva a každý z nich má šířku 40 bitů, což je v oblasti DSP poměrně obvyklá hodnota (stačí si připomenout články o slavném digitálním signálovém procesoru TMS320C10). Z pohledu programátora je každý akumulátor složen ze tří registrů mapovaných do RAM:
Akumulátor | Horních 8 bitů | Prostředních 16 bitů | Spodních 16 bitů |
---|---|---|---|
ACCA | ACCAU | ACCAH | ACCAL |
ACCB | ACCBU | ACCBH | ACCBL |
Poznámka: akumulátory jsou mapovány do operační paměti, takže k nim lze přistupovat i nepřímo přes jejich adresu.
Navíc je u všech čipů dsPIC rozšířen i registr CORCON, a to konkrétně o následující bity:
- Řízení režimu saturace u akumulátorů ACCA a ACCB.
- Řízení zaokrouhlovacího režimu.
- Nastavení násobičky u DSP operací.
- Okamžité ukončení smyčky DO.
- Získání informací o počtu zanoření smyčky DO (jen u těch čipů, které to podporují).
5. Formáty numerických hodnot zpracovávaných v DSP modulu
V mnoha DSP operacích jsou podporovány dva formáty numerických hodnot a tři šířky zpracovávaných slov. Lze používat 16bitová slova, 32bitová slova i 40bitová slova (což přesně odpovídá šířce akumulátorů a jejich částí ACCAU+ACCAH+ACCAL). Jednodušší a všeobecně známý je samozřejmě celočíselný formát, při jehož použití jsou numerické hodnoty reprezentovány v systému dvojkového doplňku. U 16bitových a 32bitových slov je navíc podporován i formát čísel nazvaný fractional. Nejedná se vlastně o nic jiného, než o jednu z možností reprezentace hodnot v systému pevné řádové čárky (fixed point), ovšem tak, že čárka není ve slově umístěna libovolně, ale je vložena ihned za znaménkový bit (používá se běžný dvojkový doplněk).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |s , | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
40bitový formát s pevnou řádovou čárkou je poněkud odlišný, neboť nejvyšších osm bitů je celočíselných. Těchto horních osm bitů se někdy nazývá guard bits, protože skutečně slouží k tomu, aby nedošlo k přetečení u mnoha operací ani k saturaci.
Podívejme se nyní na rozsahy a přesnosti u jednotlivých způsobů reprezentace:
Šířka | Rozsah (integer) | Rozsah (fractional) | Rozlišení (fractional) |
---|---|---|---|
16 bitů | –32768 až 32767 | –1,0 až 1,0–2-15 | 3.052 × 10-5 |
32 bitů | –2147483648 až 2147483647 | –1,0 až 1,0–2-31 | 4.657 × 10-10 |
40 bitů | –549755813888 až 549755813887 | –256,0 až 256,0–2-31 | 4.657 × 10-10 |
6. MCU násobička
Jedním z nejdůležitějších částí DSP modulu je, podobně jako u prakticky všech dalších digitálních signálových procesorů, násobička. Kromě toho lze použít i násobičku, která je součástí MCU (všech řad). I z tohoto důvodu mají programátoři k dispozici následující čtveřici instrukcí (pro MCU násobičku), které vynásobí dva šestnáctibitové operandy a uloží výsledek (který může být až 32bitový) do jednoho z akumulátorů ACCA či ACCB:
Instrukce | Stručný popis |
---|---|
MUL.SS | vynásobení dvou operandů se znaménkem s uložením výsledku do akumulátoru |
MUL.SU | vynásobení operandu se znaménkem s operandem bez znaménka s uložením výsledku do akumulátoru |
MUL.US | vynásobení operandu bez znaménka s operandem se znaménkem s uložením výsledku do akumulátoru |
MUL.UU | vynásobení dvou operandů bez znaménka s uložením výsledku do akumulátoru |
Prvním z operandů je vždy pracovní registr Wn, druhým z operandů pak buď další pracovní registr nebo hodnota adresovaná následovně:
Zápis | Význam |
---|---|
[Ws] | buňka paměti adresovaná registrem Ws |
[Ws++] | dtto s post-inkrementem adresy (práce s poli) |
[Ws–] | dtto s post-dekrementem adresy (práce s poli) |
[++Ws] | dtto s pre-inkrementem adresy (práce s poli) |
[–Ws] | dtto s pre-dekrementem adresy (práce s poli) |
7. DSP násobička
Mezi instrukce prováděné na DSP násobičce patří především tato trojice:
Instrukce | Stručný popis |
---|---|
MPY | vynásobení dvou operandů s uložením výsledku do akumulátoru |
MPY.N | vynásobení dvou operandů (u jednoho z operandů se otočí znaménko) s uložením výsledku do akumulátoru |
MAC | operace typu multiply & accumulate |
MSC | operace typu multiply & subtract |
8. Instrukce určené pro práci s akumulátory DSP modulu
Další skupina instrukcí slouží pro manipulaci s obsahem akumulátorů. Jedná se jak o běžné aritmetické operace, tak o operace typické pouze pro DSP modul:
Instrukce | Stručný popis |
---|---|
ADD | součet obou akumulátorů |
ADD | přičtení 16bitové hodnot k akumulátor |
SUB | rozdíl obou akumulátorů |
NEG | negace hodnoty uložené v akumulátoru |
LAC | načtení hodnoty do akumulátor |
SAC | uložení hodnoty z akumulátoru |
SAC.R | dtto ale se zaokrouhlením |
SFTAC Acc, #konstanta | aritmetický posun hodnoty uložené v akumulátoru |
SFTAC Acc, Wn | aritmetický posun hodnoty uložené v akumulátoru |
Poznámka: instrukce SFTAC se sice jmenuje Arithmetic Shift Accumulator, ve skutečnosti však leží konstanta udávající posun v rozsahu –16 až 16, takže ve skutečnosti lze provést posun jak doprava tak i doleva. Totéž platí při použití pracovního registru Wn.
9. Akumulátory a podmíněné skoky
Další skupina instrukcí je poměrně malá. Nalezneme zde totiž podmíněné skoky, které jsou provedeny či naopak neprovedeny na základě výsledku poslední operace s vybraným akumulátorem. Lze otestovat přetečení hodnoty (pokud je povoleno) či fakt, že při poslední operaci došlo k saturaci:
Instrukce | Stručný popis |
---|---|
BRA OA, … | skok v případě, že došlo k přetečení hodnoty akumulátoru ACCA |
BRA OB, … | skok v případě, že došlo k přetečení hodnoty akumulátoru ACCB |
BRA SA, … | skok v případě, že došlo k saturaci hodnoty akumulátoru ACCA |
BRA SB, … | skok v případě, že došlo k saturaci hodnoty akumulátoru ACCB |
Poznámka: všechny tyto skokové instrukce jsou opět relativní, podobně jako další varianty instrukce BRA.
10. Instrukce REPEAT – jednoduchá forma počítané programové smyčky
Další dvě instrukce ve skutečnosti nepatří do DSP modulu, protože jsou k dispozici i na mikrořadičích řady PIC24. Tyto instrukce slouží k opakování následující instrukce, přičemž počet opakování je buď specifikován konstantou či obsahem vybraného pracovního registru Wn. Počet opakování je přitom vždy o jedničku větší než hodnota konstanty nebo hodnota získaná z pracovního registru:
Instrukce | Stručný popis |
---|---|
REPEAT #konstanta | opakování další instrukce (konstanta+1)× |
REPEAT Wn | opakování další instrukce (Wn+1)× |
Poznámka: s těmito instrukcemi jsme se již setkali při popisu instrukcí DIVF, DIV.S, DIV.SD, DIV.U a DIV.UD, které je nutné volat osmnáctkrát, protože výpočet je iterativní.
11. Implementace programové smyčky s využitím instrukce DO
Kromě instrukce REPEAT umožňující opakovat jen jedinou instrukci lze použít i instrukci nazvanou DO sloužící k realizaci skutečné programové smyčky, v jejímž těle se může nacházet hned několik jiných instrukcí. Instrukce DO se od REPEAT odlišuje především tím, že kromě specifikace počtu opakování obsahuje tato instrukce i druhý operand určující velikost těla programové smyčky. Tento operand se používá stejně jako operand u instrukce BRA – jeho hodnota se přičte k registru PC a výsledkem je adresa poslední instrukce ve smyčce:
Instrukce | Stručný popis |
---|---|
DO #konstanta, … | opakování kódu mezi touto instrukcí a PC+offset (#konstanta+1)× |
DO Wn, … | opakování kódu mezi touto instrukcí a PC+offset (Wn)× |
Poznámka: tyto instrukce využívají pomocné registry DCOUNT, DOSTART a DOEND, jejichž hodnoty „přežijí“ i vstup do přerušovací rutiny. To znamená, že smyčku DO je možné přerušit a poté se vrátit k jejímu provádění.
Příklad použití:
01C000 LOOP12: DO #0x160, END12 01C004 DEC W1, W2; First instruction in loop 01C006 ... 01C008 ... 01C00A ... 01C00C ... 01C00E ... 01C012 NOP 01C014 END12: NOP
12. Zásobník umožňující vnořování smyček DO
Na čipech dsPIC33E (ovšem nikoli na ostatních řadách) je kromě registrů DOSTART, DOEND a DCOUNT k dispozici minizásobník s několika úrovněmi (maximálně sedmi). Tento minizásobník je použit pro uložení zmíněných tří speciálních registrů a slouží tak k implementaci vnořených smyček DO. Vzhledem k tomu, že tento zásobník může obsahovat jen sedm prvků, je ukazatel na jeho vrchol pouze tříbitový (hodnota 000 značí, že je zásobník prázdný a mikrořadič tedy žádnou smyčku DO neprovádí). Jeho struktura je jednoduchá:
DL 000 prázdný 001 DOSTART DOEND DCOUNT 010 DOSTART DOEND DCOUNT 011 DOSTART DOEND DCOUNT ...
Poznámka: DL je ve skutečnosti tříbitové pole stavového registru CORCON, viz též následující kapitolu.
13. Registry použité ve smyčkách
V programových smyčkách implementovaných na úrovni zdrojového kódu se používají tyto registry či jejich části (mnohé jsme si již popsali v předchozích kapitolách):
Registr | Šířka | Význam |
---|---|---|
RCOUNT | 14b | počet opakování instrukce za REPEAT |
DCOUNT | 14b | počet opakování smyčky DO |
DOSTART | 24b | naplněn adresou první instrukce za DO (tj. první instrukce ve smyčce) |
DOEND | 24b | naplněn adresou PC+expr při vykonání instrukce DO |
CORCON.DA | 1b | pokud je nastaven na 1, provádí se smyčka DO |
CORCON.RA | 1b | pokud je nastaven na 1, provádí se smyčka REPEAT |
CORCON.DL | 3b | ukazatel na vrchol minizásobníku s obsahem DCOUNT, DOSTART a DOEND |
14. Odkazy na Internetu
- Stránky společnosti Microchip
http://www.microchip.com/ - Mikrořadiče řady PIC10
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1009 - Mikrořadiče řady PIC12
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1001 - Mikrořadiče řady PIC16
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1002 - Mikrořadiče řady PIC18
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1004 - Šestnáctibitové mikrořadiče PIC
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=20 - Microchip's 32-bit MCUs
http://www.microchip.com/design-centers/32-bit - Development Tools (oficiálně dostupné nástroje pro PIC)
http://www.microchip.com/development-tools/ - Vývojové nástroje pro osmibitové mikrořadiče PIC
https://www.root.cz/clanky/vyvojove-nastroje-pro-osmibitove-mikroradice-pic/ - Mikroprocesory s architekturou MIPS
https://www.root.cz/clanky/procesory-s-architekturou-risc-v-pracovnich-stanicich-a-serverech/ - gpsim Home Page
http://gpsim.sourceforge.net/gpsim.html - Gpsim (Wikipedia)
https://en.wikipedia.org/wiki/Gpsim - Digital Signal Processors (stránky TI)
http://www.ti.com/lsds/ti/processors/dsp/overview.page - C674× Low Power DSP (stránky TI)
http://www.ti.com/lsds/ti/processors/dsp/c6000_dsp/c674×/overview.page - TMS320C30 (stránky TI)
http://www.ti.com/product/tms320c30 - TMS320C6722B
http://www.ti.com/product/tms320c6722b/description - Introduction to DSP
http://www.ti.com/lit/wp/spry281/spry281.pdf - The Evolution of TMS (Family of DSPs)
http://www.slideshare.net/moto_modx/theevo1 - ST10 16-bit MCUs
http://www.st.com/en/microcontrollers/st10–16-bit-mcus.html?querycriteria=productId=LN1111 - XC800 family
https://en.wikipedia.org/wiki/XC800_family - C166 (stránky společnosti Infineon)
https://www.infineon.com/cms/en/product/microcontroller/16-bit-c166-microcontroller/channel.html?channel=ff80808112ab681d0112ab6b2eaf0759#ispnTab3 - C166 Family
https://en.wikipedia.org/wiki/C166_family - Zero-power Microcontrollers for Low-power and High-temperature Applications
http://en.wikichip.org/w/images/1/17/Atmel_MARC4_brochure.pdf - MARC4 Micro-Controller (Wikipedia)
https://en.wikipedia.org/wiki/MARC4_Micro-Controller - MARC4 – Atmel
https://en.wikichip.org/wiki/atmel/marc4 - MARC 4bit Microcontrollers Programmer's Guide
https://en.wikichip.org/w/images/4/44/MARC4_4-bit_Microcontrollers_Programmer%27s_Guide.pdf - MARC4 User's Guide qFORTH Compiler
https://en.wikichip.org/w/images/2/25/MARC4_User%27s_Guide_qFORTH_Compiler.pdf - Programovací jazyk Forth a zásobníkové procesory
http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/ - Seriál Programovací jazyk Forth
http://www.root.cz/serialy/programovaci-jazyk-forth/ - Programovací jazyk Factor
http://www.root.cz/clanky/programovaci-jazyk-factor/ - PMOS
https://en.wikipedia.org/wiki/PMOS_logic - NMOS
https://en.wikipedia.org/wiki/NMOS_logic - CMOS
https://en.wikipedia.org/wiki/CMOS - Computer History Museum: TMS 1000 4-Bit microcontroller
http://www.computerhistory.org/collections/catalog/102711697 - Texas Instruments TMS1000 microcontroller family
http://www.cpu-world.com/CPUs/TMS1000/ - Invention History of Microcontroller
http://www.circuitstoday.com/microcontroller-invention-history - TMS1000 Series – TI
https://en.wikichip.org/wiki/ti/tms1000 - TMX1795 – TI
https://en.wikichip.org/wiki/ti/tmx1795 - Milton Bradley Microvision (U.S.) (1979, LCD, 9 Volt (1 or 2), Model# 4952)
http://www.handheldmuseum.com/MB/uVUS.htm - 8051 Microcontroller
http://www.circuitstoday.com/8051-microcontroller - 4-bit (computer architectures)
https://en.wikipedia.org/wiki/4-bit - TMS 1000 Data Manual
http://blog.kevtris.org/blogfiles/TMS_1000_Data_Manual.pdf - Considerations for 4-bit processing
http://www.embeddedinsights.com/channels/2010/12/10/considerations-for-4-bit-processing/ - Are you, or would you consider, using a 4-bit microcontroller?
http://www.embeddedinsights.com/channels/2010/11/24/are-you-or-would-you-consider-using-a-4-bit-microcontroller/ - MARC4 Micro-Controller
https://en.wikipedia.org/wiki/MARC4_Micro-Controller - The Texas Instruments TMX 1795: the (almost) first, forgotten microprocessor
http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html - O2 Homepage
http://www.the-nextlevel.com/odyssey2/ - Magnavox Odyssey2 (1978), Philips Videopac G7000 / C52 (1979)
http://www.mess.org/sysinfo:odyssey2 - The Video Game Critic's Odyssey 2 Reviews
http://videogamecritic.net/odd.htm - Computer Closet Collection: Magnavox Odyssey2
http://www.computercloset.org/MagnavoxOdyssey2.htm - PHILIPS Videopac C52
http://old-computers.com/museum/computer.asp?c=1060 - O2 Tech. Manual V.1.1 (PDF dokument)
http://www.atarihq.com/danb/files/o2doc.pdf - Magnavox Odyssey2
http://www.game-machines.com/consoles/odyssey2.php - Magnavox Odyssey2 (Wikipedia EN)
http://en.wikipedia.org/wiki/Odyssey2 - Magnavox Odyssey2 Games (Wikipedia EN)
http://en.wikipedia.org/wiki/List_of_Videopac_games - TI 16-bit and 32-bit microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/overview.page - TMS 32010 Assembly Language Programmer's Guide (kniha na Amazonu)
https://www.amazon.com/32010-Assembly-Language-Programmers-Guide/dp/0904047423