IAR

Z MediaWiki SPŠ a VOŠ Písek
Skočit na navigaci Skočit na vyhledávání

IAR Embedded Workbench

Prostředí IAR Embedded Workbench jsem si vybral, kvůli jeho velké profesionalitě, propracovanosti a mnoha dalším vylepšením, díky kterým jednoznačně překonává základní vývojové prostředí od domovské firmy čipu, AVR. Dalším z mnoha faktorů je to, že pro aplikace do 32kbytů kódu je bezplatný. Začínáme v IAR Po zapnutí vývojového prostředí si necháme několik minut na zorientování. Zjistíme, že program je intuitivně přívětivý a není třeba nějak pečlivěji probírat, kde se program uloží a kde se vytvoří nový projekt. Obsluha programu je už složitější. Začneme založením nového workplace (chcete-li pracovní plochy), který bude obsahovat všechna naše snažení na dané téma. obr. č. 15 IAR Workspace

Dále vytvoříme projekt, na kterém budeme chtít pracovat. Jako programovací jazyk zvolíme klasické konzolové C, které bude na naši práci vcelku bohatě stačit. Jak je vidět, program za nás vytvořil hlavní soubor, main. To je ale asi tak vše. Na osmi-bitové procesory stačilo krátké seznámení s prostředím a mohlo se jít programovat. U ARM procesorů to je trošku o něčem jiném. Zjišťuji, že program na obyčejné rozblikání LEDky nefunguje. A nejen ten. U AVR procesorů se kód automaticky spouštěl na jeho reset vektoru. U ARM procesorů je to úplně jiné. ARM je potřeba nejprve na úplném začátku nainicializovat. Nastavit mu rozsah oblastí paměti, inicializace hlavního oscilátoru a PLL.

Na domovské stránce firmy Atmel jsem našel jak je úvodní inicializace reálizována v IAR. Na úrovni assemblerovského souboru spouštěného přes konfigurační soubor linkeru. Informace o velikosti paměti a lowLevel inicializaci jsou uvedeny v linkeru:

Linker má v podstatě nadefinovaný svůj základní jazyk.Výpis konfiguračního souboru:

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x100000;
define symbol __ICFEDIT_region_ROM_end__ = 0x10FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x200000;
define symbol __ICFEDIT_region_RAM_end__ = 0x203FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_startup__ = 0x100;
define symbol __ICFEDIT_size_vectors__ = 0x100;
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_sysstack__ = 0x60;
define symbol __ICFEDIT_size_irqstack__ = 0x60;
define symbol __ICFEDIT_size_heap__ = 0x0;
/*-Exports-*/
export symbol __ICFEDIT_region_ROM_start__;
export symbol __ICFEDIT_region_ROM_end__;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_startup__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_sysstack__;

export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region STA_region = mem:[from __ICFEDIT_region_ROM_start__ size __ICFEDIT_size_startup__];
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__+__ICFEDIT_size_startup__ to __ICFEDIT_region_ROM_end__];
define region VEC_region = mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_vectors__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
initialize by copy { section .vectors };
do not initialize { section .noinit };
place in STA_region { section .cstartup };
place in ROM_region { readonly };
place in VEC_region { section .vectors };
place in RAM_region { readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };

Z výpisu je patrno, kde se ve skutečnosti zadávají oblasti pamětí jako je zásobník, halda a zásobník návratových adres z přerušení. U AVR procesorů se tyto informace o velikosti haldy a zásobníku uváděly přímo v konfiguraci. Taktéž je vidět definice regionu (oblasti) pro inicializaci .. cstartup.

Možná by stálo na tomto místě také uvést výpis kódu asembleru, který má za úkol spouštět Cčkovou lowlevel inicializaci. Ale výpis souboru je na přiloženém CD. Je součástí zdrojového kódu. U AVR byl vstupním bodem aplikace skok na nulté adrese (vektor Reset). U ARMu je tento bod definován opět v linkeru, tak jak je vidět na následujícím obrázku:

export symbol __ICFEDIT_size_irqstack__;

Z výše popsaného je patrno, že základní nastavení není věc úplně jednoduchá. Připočtu – li odlišnou filozofii popisného souboru pro ARM a AVR (popisný soubor pro ARM je realizován přes ukazatele struktur), ani se nedivím, že rozblikání ledky trvalo tak dlouho.

Nejrychlejším způsobem, jak začít je použití načtení prostředí z nějaké v IAR publikované aplikace na testovací desku a použít ATMELovské knihovny. Jediné, co je potřeba, tak upravit konfigurační soubor board.h, kde jsou definice připojených ledek, tlačítek a dalších periférií včetně ladícího kanálu a USB. Tento způsob používá právě ATMEL jako API rozhraní. Určitě je to jedna z cest, jak programovat ARM procesor. Já tuto cestu použil při programování právě USB komunikace. Nemám naprostou kontrolu nad USB, ale využívám služeb USBFrameWork, což je oficiální API rozhraní pro USB. Po rozlousknutí tohoto oříšku už práce s IAR nečinila žádné potíže. Byla intuitivní a překladač přesně rozpoznával mé chyby. Mohu říci, že i zkušenost s API rozhraním zlepšila můj pohled na seskupování dat do struktur a jejich ošetřování a práci s nimi. Podobnou, co umožňuje C++.


Předmět: MIT AplMIT

čerpáno z: Přemysl Houdek Vývoj demo aplikací s ARM7 (32 bit. MCU) dMP