Hlavní navigace

Čipy dsPIC a instrukce specifické pro jejich DSP modul

16. 5. 2017
Doba čtení: 14 minut

Sdílet

Dnes téma mikrořadičů řady PIC24 a dsPIC dokončíme. Budeme se zabývat převážně těmi instrukcemi, které jsou specifické pro čipy dsPIC a pro jejich DSP modul, nejprve si však popíšeme zbývající instrukce společné pro PIC24 i dsPIC.

Obsah

1. Přímé a nepřímé skoky

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

6. MCU násobička

7. DSP násobička

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

14. Odkazy na Internetu

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

root_podpora

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

  1. Stránky společnosti Microchip
    http://www.microchip.com/
  2. Mikrořadiče řady PIC10
    http://www.microchip.com/Pa­ramChartSearch/chart.aspx?bran­chID=1009
  3. Mikrořadiče řady PIC12
    http://www.microchip.com/Pa­ramChartSearch/chart.aspx?bran­chID=1001
  4. Mikrořadiče řady PIC16
    http://www.microchip.com/Pa­ramChartSearch/chart.aspx?bran­chID=1002
  5. Mikrořadiče řady PIC18
    http://www.microchip.com/Pa­ramChartSearch/chart.aspx?bran­chID=1004
  6. Šestnáctibitové mikrořadiče PIC
    http://www.microchip.com/Pa­ramChartSearch/chart.aspx?bran­chID=20
  7. Microchip's 32-bit MCUs
    http://www.microchip.com/design-centers/32-bit
  8. Development Tools (oficiálně dostupné nástroje pro PIC)
    http://www.microchip.com/development-tools/
  9. Vývojové nástroje pro osmibitové mikrořadiče PIC
    https://www.root.cz/clanky/vyvojove-nastroje-pro-osmibitove-mikroradice-pic/
  10. Mikroprocesory s architekturou MIPS
    https://www.root.cz/clanky/procesory-s-architekturou-risc-v-pracovnich-stanicich-a-serverech/
  11. gpsim Home Page
    http://gpsim.sourceforge.net/gpsim­.html
  12. Gpsim (Wikipedia)
    https://en.wikipedia.org/wiki/Gpsim
  13. Digital Signal Processors (stránky TI)
    http://www.ti.com/lsds/ti/pro­cessors/dsp/overview.page
  14. C674× Low Power DSP (stránky TI)
    http://www.ti.com/lsds/ti/pro­cessors/dsp/c6000_dsp/c674×/o­verview.page
  15. TMS320C30 (stránky TI)
    http://www.ti.com/product/tms320c30
  16. TMS320C6722B
    http://www.ti.com/product/tms320c6722b/des­cription
  17. Introduction to DSP
    http://www.ti.com/lit/wp/spry281/spry­281.pdf
  18. The Evolution of TMS (Family of DSPs)
    http://www.slideshare.net/mo­to_modx/theevo1
  19. ST10 16-bit MCUs
    http://www.st.com/en/micro­controllers/st10–16-bit-mcus.html?querycriteria=pro­ductId=LN1111
  20. XC800 family
    https://en.wikipedia.org/wi­ki/XC800_family
  21. C166 (stránky společnosti Infineon)
    https://www.infineon.com/cms/en/pro­duct/microcontroller/16-bit-c166-microcontroller/channel.html?chan­nel=ff80808112ab681d0112ab6b2e­af0759#ispnTab3
  22. C166 Family
    https://en.wikipedia.org/wi­ki/C166_family
  23. Zero-power Microcontrollers for Low-power and High-temperature Applications
    http://en.wikichip.org/w/i­mages/1/17/Atmel_MARC4_brochu­re.pdf
  24. MARC4 Micro-Controller (Wikipedia)
    https://en.wikipedia.org/wi­ki/MARC4_Micro-Controller
  25. MARC4 – Atmel
    https://en.wikichip.org/wi­ki/atmel/marc4
  26. MARC 4bit Microcontrollers Programmer's Guide
    https://en.wikichip.org/w/i­mages/4/44/MARC4_4-bit_Microcontrollers_Program­mer%27s_Guide.pdf
  27. MARC4 User's Guide qFORTH Compiler
    https://en.wikichip.org/w/i­mages/2/25/MARC4_User%27s_Gu­ide_qFORTH_Compiler.pdf
  28. Programovací jazyk Forth a zásobníkové procesory
    http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/
  29. Seriál Programovací jazyk Forth
    http://www.root.cz/serialy/pro­gramovaci-jazyk-forth/
  30. Programovací jazyk Factor
    http://www.root.cz/clanky/programovaci-jazyk-factor/
  31. PMOS
    https://en.wikipedia.org/wi­ki/PMOS_logic
  32. NMOS
    https://en.wikipedia.org/wi­ki/NMOS_logic
  33. CMOS
    https://en.wikipedia.org/wiki/CMOS
  34. Computer History Museum: TMS 1000 4-Bit microcontroller
    http://www.computerhistory­.org/collections/catalog/102711697
  35. Texas Instruments TMS1000 microcontroller family
    http://www.cpu-world.com/CPUs/TMS1000/
  36. Invention History of Microcontroller
    http://www.circuitstoday.com/mi­crocontroller-invention-history
  37. TMS1000 Series – TI
    https://en.wikichip.org/wi­ki/ti/tms1000
  38. TMX1795 – TI
    https://en.wikichip.org/wi­ki/ti/tmx1795
  39. Milton Bradley Microvision (U.S.) (1979, LCD, 9 Volt (1 or 2), Model# 4952)
    http://www.handheldmuseum­.com/MB/uVUS.htm
  40. 8051 Microcontroller
    http://www.circuitstoday.com/8051-microcontroller
  41. 4-bit (computer architectures)
    https://en.wikipedia.org/wiki/4-bit
  42. TMS 1000 Data Manual
    http://blog.kevtris.org/blog­files/TMS_1000_Data_Manual­.pdf
  43. Considerations for 4-bit processing
    http://www.embeddedinsights­.com/channels/2010/12/10/con­siderations-for-4-bit-processing/
  44. Are you, or would you consider, using a 4-bit microcontroller?
    http://www.embeddedinsights­.com/channels/2010/11/24/a­re-you-or-would-you-consider-using-a-4-bit-microcontroller/
  45. MARC4 Micro-Controller
    https://en.wikipedia.org/wi­ki/MARC4_Micro-Controller
  46. The Texas Instruments TMX 1795: the (almost) first, forgotten microprocessor
    http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html
  47. O2 Homepage
    http://www.the-nextlevel.com/odyssey2/
  48. Magnavox Odyssey2 (1978), Philips Videopac G7000 / C52 (1979)
    http://www.mess.org/sysinfo:odyssey2
  49. The Video Game Critic's Odyssey 2 Reviews
    http://videogamecritic.net/odd.htm
  50. Computer Closet Collection: Magnavox Odyssey2
    http://www.computercloset­.org/MagnavoxOdyssey2.htm
  51. PHILIPS Videopac C52
    http://old-computers.com/museum/compu­ter.asp?c=1060
  52. O2 Tech. Manual V.1.1 (PDF dokument)
    http://www.atarihq.com/dan­b/files/o2doc.pdf
  53. Magnavox Odyssey2
    http://www.game-machines.com/consoles/odyssey2.php
  54. Magnavox Odyssey2 (Wikipedia EN)
    http://en.wikipedia.org/wi­ki/Odyssey2
  55. Magnavox Odyssey2 Games (Wikipedia EN)
    http://en.wikipedia.org/wi­ki/List_of_Videopac_games
  56. TI 16-bit and 32-bit microcontrollers
    http://www.ti.com/lsds/ti/mi­crocontrollers16-bit32-bit/overview.page
  57. TMS 32010 Assembly Language Programmer's Guide (kniha na Amazonu)
    https://www.amazon.com/32010-Assembly-Language-Programmers-Guide/dp/0904047423

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