Razlika med normalno funkcijo in ISR

B

bittware

Guest
Pozdravljeni strokovnjaki,
Ker sem videl skoraj vse ISR funkcijo opredelitev kot taka nična xxx (ničen).Zanima me, če je ISR (Interrupt Service Rutinska) lahko samo delež podatkov structrue prek globle opredeljene spremenljivke in ne more vrniti vrednost?
Bi lahko kdorkoli tam razloži to?
Thanks in advance.<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />
 
Ko normalno funkcijo lahko pokličete v programu, in lahko rečemo,
res = fun1 (x);
Ampak ti ne prekine klic res všeč = ISR.To je z nekaterimi Nesinkroni dogodek, kot Timmer overflow, pin sprememb ...Zaradi tega prekinjam se ne vrne, ali so parametri.

Ko delate z nekaj Nesinkroni dogodek, eden od načinov je anketa nekaj zastave in poglejte, če dogodek happend.To je popolno zapravljanje časa, ker program ne more storiti nič drugega.
To je bilo rešenih, da s motim.Ko dogodek occure, potem tvoj program, pojdite na ISR, izvrševanje njenih navodilih, in potem gre na naslednji pouk v glavni program.

 
tudi vaš glavni program lahko pokličete ISR rutinsko, kadar je treba z določitvijo ustreznih prekine zastavo

 
A funkcija se običajno imenuje v zelo predvidljiv način.Ko klic funkcije, funkcija sama spremeniti nekatere registre, za katere je vedel vsebine mora biti shranjena in restavrirana pred funkcijo izhoda.Vendar pa nekatere druge spremenljivke, kot so tisti, ki se uporablja predvsem za začasno hrambo, se ne shranijo.Na ta način je funkcija, se lahko javijo in vrne iz hitreje.V sestavljač define registri, ki so začasna in se prepričajte, da je klicalcev tudi zaveda, da ko se funkcija je pozval, da je vsebina teh registrov se bo undefined po klicu funkcije.

Tudi funkcijo, ko imenuje, že pričakujete nekatere registre, ki jih je treba predhodno določiti, kot je na primer segment podatkov.

Vendar pa ISR je tam, da se odzove na motim.An motim je dogodek, ki se običajno pojavljajo na nepredvidljivo trenutek.Na primer, ko uporabnik pritisnite tipko.V tem času, boste svoj sistem za iskanje ključnih kodo iz tipkovnice registra takoj.Similarely, če jo določite ure, ki se pojavijo, recimo, 100-krat na sekund, je lahko nujno, da če bo obravnavano takoj, in ne nekaj mili-sekund kasneje.Torej, namesto, da vaš program za preverjanje teh dogodkov neprekinjeno, pustite vaš program zagnati, ne zavedajo teh dogodkov.Ko pride do teh dogodkov, ideja je, da vaš program ustaviti kar je delal, potem je posebna funkcija se imenuje (v prekine storitve rednega ali ISR).The ISR storite karkoli je obdelava potrebna, in potem, ko je izhod, vaš program še vedno traja, niti vedela, da je bil na kratko prekinjen (na dejstvo, da ideja je, da ne tudi ni treba vedeti za to).Ta temelji na načelu, da so nekateri primeru jih je treba obdelati, takoj ko prispe, ne tako hitro, in imajo večjo prednost kot katerikoli tekoči proces.

Vendar pa se za zgoraj "čarobno" poteka, obstaja veliko več stvari, kot da sodelujejo v preprostih funkcij, kot so redno funkcijo.Prvič, ker ISR lahko imenovani v vsakem trenutku,
medtem ko prikazujejo vsak postopek, v ISR ne more vsakršnih predpostavk o katerem koli od registrov vsebino, ko je klicala.Torej, podatki odseka in vseh drugih državnih procesor lahko karkoli v tem času.In particular,
the ISR ne more ničesar mesto na prvi strani na stack (kot lokalne spremenljivke) od odvodnika kazalec sama je lahko tudi nič.Torej, stvar je, da vsak ISR mora storiti, je postaviti vse tiste, ki so potrebni registri, ko vstopijo.Torej, teh nastavitev registra je v redu, in ISR bo lahko postopek običajno, ne glede na stanje delovanja procesorja, je bil pred ISR dobila poziv.

Vendar pa
je drug * * ZELO pomembna stvar (in sem omenila v krepkem tisku), da ISR mora narediti.Kot je omenjen zgoraj, vse teče program lahko prekine kadarkoli.Čarobno delo na dejstvo, da ti programi ne smejo videti nobenega dokaza, da imam prekinjeno.Zdaj je ISR, tako kot vse druge naloge, krme na CPU registrov.Za CPU tudi imajo samo en velik nabor registrov.Vse registrov, ki jih uporabljajo ISR so iste registre, ki jih uporabljajo vse programe teče pred ISR dobila poziv.Če želite wour tekoče programe, da ne vidim nobenih glitches je ISR * * MORA obnoviti koli registrov se uporabijo za točno enakem stanju kot takrat, ko je dobil poziv.Če ste pozabili obnoviti tudi enostaven registra, zelo nepredvidljivo stvari se lahko zgodi, ko vaš ISR zameno za prekine postopek.Na primer, če proces želijo nekakšne enačbe izračuna in pošlje rezultat na nekatere druge spremenljivke, vendar je dobil prekine sredi način ocenjevanja izražanja, in da je slabo kodirano ISR pozabili obnoviti register, ki ga uporablja vaš program za enačbe, nato vaš program bo imel za posledico napačen rezultat.To bo zelo težko izslediti probleme, kot boste sumljivih vašem programu, če to ni nič narobe.Poleg tega se težave ponavadi nikoli ne zgodi dvakrat na istem mestu.Končni rezultat bo naključno program zruši sistem in nestabilnosti.

Torej, je ISR pretoka ponavadi sestavljena iz:
- Shrani vse registre in sistema navaja,
- Nastavite vse registre, ki jih potrebuje ISR, vključno s podatki in kazalci dimnika.
- Proces na primeru
- Obnovi vse registre
- Vrnite se na prekine postopek (isually z IRET pouk namesto preprostega RET navodilo, ki tudi obnovite CPU zastavice).

Samo, ko boste naučili, da to lahko zapleteno, tukaj prihaja nekoliko bolj substil pojma, tako kot je enako pomemben za razumevanje.Nekatere stvari je treba tudi upoštevati pri delu s ISR.To je tisto, kar
je običajno imenovane kot "ponovno entrancy".Nekatere funkcije niso ponovno vstopila na trg.Meening da ne smejo biti imenovani od znotraj ISR.Te so ponavadi naloge, ki so napisana, da se dostop do redne programe (niso ISR).Na primer, funkcijo, ki določi, in odvisno od tega, globalne spremenljivke, ne smejo biti imenovani s strani ISR.To je bilo več evedent v starih DOS dni, vendar so še vedno prisotne v sistemu Windows.

Let's sprejme enostaven primer.Denimo, da funkcija (da bomo klic "Obresti"):
- Shranite vsebino parameter za globalno spremenljivko.
- Kasneje v funkciji, preberite nazaj, da je vrednost.
- Povečanje je za 1%
- Vrnitev v novo vrednost.

Torej, recimo, da klicalca takih funkcijo klic funkcije s posebnim parameter.To bo pričakoval, da se funkcija, ki bo vrnil vrednost plus 1%.

Recimo, da je bančni program vzeti denar od vsake stranke, in dodamo obrestne mere.Denimo nekateri stranke (imenovane "Dummy") je 1000 $ na njegov račun:

- Get 'Dummy "stranke bilance (1000)
- Pokliči "Obresti" funkcijo.
- Shranjujte rezultat za njegov račun.

Jasno je,
da je "Obresti" funkcijo, da dodajamo od 1%, se bo vrnilo 1010.Vrednost 1010 bo torej treba določiti, da se v strankin račun.

Običajno je v tem trenutku, ko začnete s Tumarat whare kaj za to ...

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />

Za zabavo začeli (no, kot boste videli, ne za naše do-se-nesrečnih banki custommer) ...

Denimo, da je dogodek, ki je nastavljena na precess nekaterih transakcij v realnem času.Denimo, da na določenem trenutku v času dogodka, ki nastane zaradi posebnega računa je treba obravnavati.To potrebo upošteva njegove obrestne mere, ki jih je treba oceniti.Treba se pojavijo hitro, in tako je kodirana v ISR.

The ISR sprejmejo stranke (imenovane "VIP") podatke o računu in dodati obresti, razen če ga nazaj in se vrniti na kakršen je bil zagnan.Torej, ISR

- Vzemite račun stranke info (recimo, ima samo 100 $ levo).
- Razpis "Obresti" funkcijo.
- Če je rezultat nazaj na strankin račun (101 $).
- Vrnite se na prekiniti program.

Torej, zamisliti, da se zgoraj dogodek zgodi istočasno, da je prvi primer je bil, naredite naslednje:

- Sprejeti "Dummy" strankin račun ballance (1000 $)
- Pokliči "Obresti" funkcijo.
> (Iz "Obresti" funkcijo)
> - Shranite vsebino parameter za globalno spremenljivko.
>-*** Motim pride do tukaj, "VIP" stranke potrebujejo izračun obresti ***
> - Kasneje v funkciji, preberite nazaj, da je vrednost.
> - Povečanje je za 1%
> - Vrnitev v novo vrednost.
- Shranjujte rezultat za njegov račun.

Zdaj je VIP stranko, bo izračunana na točki omenjen zgoraj.Naslednji bo prišlo do:

- Sprejeti "Dummy" strankin račun ballance (1000 $)
- Pokliči "Obresti" funkcijo.
> (Iz "Obresti" funkcijo)
> - Shranite vsebino parameter za globalno spremenljivko (Global = 1000).
>-*** Motim pride do tukaj, "VIP" stranke potrebujejo izračun obresti ***

Preklopi na ISR --- ---

- Pojdite na "VIP" strankin račun info (recimo, ima samo 100 $ v levo).
- Razpis "Obresti" funkcijo.
> (Iz "Obresti" funkcijo)
> - Shranite vsebino parameter za globalno spremenljivko (Global = 100).
> - Kasneje v funkciji, preberite nazaj, da je vrednost (Global = 100).
> - Povečanje je za 1%
> - Vrnitev v novo vrednost.
- Če je rezultat nazaj v "VIP" strankin račun (101 $).
- Vrnite se na prekiniti program.

--- Preklopi nazaj na program ---
> - Kasneje v funkciji, preberite nazaj, da je vrednost (Kaj je globalna spremenljivka zdaj? To je 100, kakor je bila nazadnje vrednost nastaviti na to, v tem primeru, ki ga je ISR !!)..
> - Povečanje je za 1%
> - Vrnitev v novo vrednost (101).
- Shranite rezultat "Dummy" strankin račun.(Ja, on ima sedaj 101 $ namesto
1.010 $!)

Zgornje vprašanje se pojavijo, ker na 3 stvari:
- The "Obresti" funkcijo zanaša na globalno spremenljivko.
- The "Obresti" funkcija se imenuje samovoljno program.
- The "Obresti" funkcija je poklicala nazaj (dejal, da je treba ponovno vnesti), ki ga je ISR, ki vijak globalno spremenljivko.

Havn't sem rekel, da ISR morate shraniti vsako Registrirajte vrednosti pred?No, čeprav so shranjene vse registre, ni (in jih ni), razen vseh globalnih spremenljivk.To lahko samo shranite registrov.Prav tako se ne pričakuje, da ISR bo vedel, ko je potrebno vpisati, vsak spomin lokacijah, ki jih uporablja kateri koli je pozval sub-funkcij.Torej, da "Obresti" funkcijo,
mimogrede je kodirana, je dejal, da se "brez ponovnega ponudnika", je stvar, ki je ISR * * morajo izogibati za vsako ceno.

Imel program zgoraj lahko prekine kadar koli drugih mestih kot v okviru "interesa" funkcijo, ne bi bilo nobenih vidnih bug.V veliki program, za katerega je problematična brez ponovnega udeleženec dobil funkcijo imenovan le del celotnega časa, je dobro, da forseable tak potencial bug ne sme obravnavati pred vožnjo za nekaj minut / ur / ...in celo leta.Prav tako morda nikoli ne pride, in potem naenkrat, ki jih naredite s spremembo svojega programa, in glej problem nikoli videl, pride dvakrat na dan, samo zaradi obstoječih dobrih časovni ...Torej, kdaj, v nekaterih primerih, to lahko zelo težko slediti.

Obstajajo načini, da gremo ven iz vsega tega nereda, vendar so funkcije, ki je ISR klic je treba vedeti vnaprej, če se ponovno vstopila na trg.Za naloge, ki jih je treba ponovno vstopila na trg, morajo biti kodirani tako, da se.To vključuje veliko globlje programing in debugging znanja.Ampak kot pravilo palca, če naredijo ISR, bodisi poklicati ponovno vstopajoči funkcije ali funkcije, ki jih poznate, se imenujejo samo v tem ISR (in ne z drugimi programi samovoljno).Točno isti problem pojavi pri večopravilnosti program, in ponavadi, nekatere od Višezadaćnost pravila se lahko uporabljajo za ISR, da se zagotovi, program stabilnosti, vendar če je Višezadaćnost program lahko počaka (a Semafor za primer), ki ISR ne more čakati programu ali vsaj, se morajo vrniti, in počakajte na naslednji dogodek, da vidite, če lahko pokliče posebne funkcije.

Big Boy

 

Welcome to EDABoard.com

Sponsor

Back
Top