. : New eShop! - Mobilní verze - Pandatron.cz - Pandatron.sk - Diskuzní fórum - Zakázkový vývoj : .
 
AT91SAM7S - 5.díl: Interrupt
1. května 2009 | Pandatron | AT91SAM7S - 5.díl: Interrupt | Komentářů: 7  

AT91SAM7S - 5.díl: Interrupt

Nabízené možnosti přerušení jsou díky jádru ARM a integrovanému obvodu AIC skutečně široké. Je tak možné zvolit nejen prioritu konkrétního zdroje událostí, ale například i výhradní přednost a řadu dalších možností.

Nabízené možnosti přerušení jsou díky jádru ARM a integrovanému obvodu AIC skutečně široké. Je tak možné zvolit nejen prioritu konkrétního zdroje událostí, ale například i výhradní přednost a řadu dalších možností.

Interrupt, neboli česky přerušení patří mezi funkci používanou snad v každé větší aplikaci. Představuje odskok mikrokontroléru z právě vykonávané funkce na jinou, obsluhující nejčastěji právě zdroj vyvolaného přerušení. Po vykonání příslušné funkce je řízení následně vráceno do místa, kde přerušení vzniklo a odkud program pokračuje dál.

V obvodech řady AT91SAM7S je integrován tzv. Advanced Interrupt Controller (AIC). Ten disponuje až 8-úrovňovou prioritou přerušení, individuálním maskováním, úrovňovým řadičem a až 32 zdroji přerušení. Je navržen s ohledem na co nejnižší zatížení jádra obvodu při real-time operacích.


Obr. 1: Logické uspořádání obvodu přerušení

Samotný AIC řídí signály nFIQ (Fast Interrupt Request) a nIRQ (Standard Interrupt Request) umístěné na jádru ARM. Vstupy do AIC mohou být buď vnitřní, nebo vnější podle typu konkrétného zdroje signálu.

Rozdělení priority přerušení až na osm úrovní umožňuje přesné nastavení priority pro každý zdroj použitý v konkrétní aplikaci. Tím je minimalizována doba reakce na nejdůležitější podněty pozdržením méně prioritních procesů. Navíc je možné dynamicky a velice rychle měnit úroveň priority například u momentálně důležitých signálů na vyšší a naopak.

U interních zdrojů lze nastavit úroveň citlivosti či reakci na provedenou akci. U vnějších zdrojů lze poté definovat reakci na náběžnou či sestupnou hranu signálu či citlivost.


Obr. 2: Blokové schéma jednotky AIC

IRQ či FIQ:
V běžné aplikaci je na většinu zdrojů přerušení, jako jsou například klávesnice, časovače či komunikační linky používány výhradně pouze standardní žádosti o přerušení, tedy IRQ. Jediné dostupné přerušení typu FIQ je využíváno pouze v případech, kdy je potřeba velice rychle a pouze krátkým strojovým kódem obsloužit časově náročný proces, jako například přenos dat prostřednictvím DMA a podobně.

Dalším zásadním rozdílem je možnost násobného přerušení. Je-li tak aktuálně vykonáváno libovolné IRQ, je možné ho přerušit FIQ. Opačně však nikoliv, není možné právě vykonávané FIQ přerušit vyvoláním IRQ.

Funkce IRQ a jeho zpracování:
IRQ představuje základní typ přerušení. K dispozici je osm úrovní priority kanálu v závislosti na typu a časové náročnosti zdroje. K těm je možné přiřadit až 31 (0 představuje FIQ) zdrojů přerušení.
Každý zdroj přerušení má nastavenu požadovanou úroveň priority v rozsahu 0 až 7 a to v registru AIC_SMR (bity PRIOR). Hodnota 7 přitom odpovídá nejvyšší prioritě, a takové přerušení má poté přednost před všemi ostatními, naopak 0 odpovídá nejnižší důležitosti.

Jakmile dojde například vlivem vnějšího zdroje ke stavu přerušení, je podle nastavení bitů SRCTYPE v registru AIC_SMR, dále podle typu vnitřní/vnější zdroj a úrovně hrany rozhodnuto, zda má být vykonáno.
Při následném vyvolání přerušení je jeho vektor, uložený u konkrétního zdroje v registrech AIC_SVR uložen do registru AIC_IVR, kde je k dispozici ke čtení. Jeho vyčtení je navíc předáno AIC jako oznámení o vykonávání aktuálního přerušení. Pokud je při vykonávání přerušení zaznamenán další požadavek se stejnou či nižší prioritou, je tento uložen a vykonán až po ukončení právě probíhajícího, což je AIC oznámeno zápisem do registru AIC_EOICR.

Prodlení při přerušení:
Zpoždění přerušení závisí na několika parametrech, včetně:

  • Okamžiku, kdy software maskuje přerušení
  • Událostí na úrovni procesoru či AIC
  • Délce aktuálně vykonávané instrukce
  • Ošetření přerušení s vyšší prioritou a obnova běhu a hardwarových bitů

Z následujících obrázku je patrné, že navíc závisí například i na zvoleném typu události pro vyvolání přerušení. Rozdíl mezi reakcí na náběžnou a sestupnou hranu či libovolnou změnu stavu signálu je jeden takt hlavních hodin.


Obr. 3: Reakce na náběžnou či sestupnou hranu
 
Obr. 4: Reakce na libovolnou hranu

Registry dostupné pro práci s AIC jsou:


Obr. 5: Přehled AIC registrů (AT91SAM7S Series Preliminary 12/08)

Příklad použití přerušení:
Následující kód demonstruje použití přerušení od interního čítače/časovače TIMER0. Nejprve je v hlavní smyčce main() provedena inicializace portu PIOA a následně inicializace čítače a AIC. Následně je globálně aktivováno přerušení. Dále program ve funkci main() pokračuje jednoduchou smyčkou, zajišťující blikání diodou LED2 na pinu PA1.

  PMC_PCER = (0x1 << AT91C_ID_TC0);                   /* First, enable the clock of the TIMER */
  TC0_CCR = AT91C_TC_CLKDIS;                          /* Disable the clock and the interrupts */
  sr = TC0_SR;                                        /* Clear status bit */
  sr = sr + 1;                                        /* Suppress compiler warning */
  TC0_CMR = TC_CLKS_MCK128;                           /* Set the Mode of the Timer Counter */
  TC0_CCR = AT91C_TC_CLKEN;                           /* Enable the clock */
  AIC_IDCR = (0x1 << AT91C_ID_TC0);                   /* Disable the interrupt on the interrupt controller */
  AIC_SVR12 = (unsigned int) Timer0_CIrqHandler;      /* Set IRQ handler routine */
  AIC_SMR12 = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | TIMER0_INTERRUPT_LEVEL; /* Store the Source Mode Register */
  AIC_ICCR = (0x1 << AT91C_ID_TC0);                   /* Clear the interrupt on the interrupt controller */

  TC0_IER = AT91C_TC_CPCS;                            /* IRQ enable CPC */
  AIC_IECR = (0x1 << AT91C_ID_TC0);                   /* Enable the interrupt on the interrupt controller */
  TC0_CCR = AT91C_TC_SWTRG;                           /* Start timer0 */
  AIC_ISCR = (0x1 << AT91C_ID_TC0);                   /* Generate interrupt by software */
  __ARMLIB_enableIRQ();                               /* Global enable the interrupt */

Samotná funkce přerušení je uvedena nad hlavní funkcí, neboť pro nastavení přerušení je potřeba mít již k dispozici její pointer. Ve funkci je kromě základního obsloužení přerušení vždy provedena i periodická změna stavu diody LED1 na pinu PA0.

  sr = TC0_SR;                                        /* Read timer status register to clear interrupt */
  AIC_ICCR = (0x1 << AT91C_ID_TC0);                   /* Clear  timer #0 interrupt */

  if(PIOA_ODSR & 0x1) {                               /* Read status of LED1 */
    PIOA_CODR = LED1;                                 /* Switch LED1 OFF */
  } else {
    PIOA_SODR = LED1;                                 /* Switch LED1 ON */
  }
  AIC_EOICR = 0;                                      /* Signal end of interrupt */

Závěr:
Uvedený příklad je samozřejmě možné velice snadno přepsat na libovolný jiný zdroj přerušení. Kromě toho je pro vnější signály možné použít i zmíněný typ FIQ, dostupný například na pinu PA19.

Stáhněte si prosím Flash Player pro přehrávání videí.

Použitá literatura:
AT91SAM7S Series Preliminary 12/08

Odkazy & Download:
Domovská stránka firmy Kramara s.r.o. - http://kramara.com
ATM91SAM7S256-KIT - http://kramara.com/?q=node/16

USB JTAG Adaptér - http://kramara.com/?q=node/15

CrossWorks for ARM - http://www.rowley.co.uk/arm/index.htm
ARM pro začátečníky (BEN) - http://shop.ben.cz/cz/121300-arm-pro-zacatecniky.aspx

Ukázkový program využívající přerušení od TIMER0 - DOWNLOAD







GooglePlus1 FaceBook Twitter del.icio.us DiGG Google StumbleUpon Google Buzz Email RSS PDF Tisk

Komentáře (7):

Zobrazit starší 30 dnů (7)...



Název příspěvku: Vaše jméno: host
                 
  Zakázat formátování [Zakáže kódování a nahrazování smajlíky.]
Připojit soubory
reklama:
XPort XE
Síťový převodník řady Xport, integrovaný do konektoru RJ45
Skladem od 850 Kč

Informace uvedené v článcích jsou platné v době jejich vydání a samotné články jsou určeny pouze jako zdroj informací. Autor článku ani správce webu nenesou žádnou zodpovědnost za případné újmy na majetku a zdraví. Názvy společností a výrobků, loga a další multimediální materiál mohou být ochrannými známkami příslušných společností.
RSS kanály: | |
+420 723 846 377
info@pandatron.cz
Všechna práva vyhrazena | mobilní verze | © Copyright 2000 - 2016 ISSN 1803-6007