 |

|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 12 23, 14:01. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » Interuptai
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 14:06 |
|
|
|
|
| Digix rašo: |
deja pertraukimai nevisada yra gerai, ju iskvietimas pareikalauja nemazai procesoriaus, kol issaugojami visi registrai, o paskui grazinami atgal. |
o kiek maždaug (eilės tikslumu) procesoriaus ciklų sunaudoja tas pertraukimas? per jį tik nukopijuojami registrai ar daroma kasnors daugiau? |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 14:28 |
|
|
|
|
manau issaugojimas ir atkurimas sudaro apie 10-20 komandu.
ant arm gana daug nes ten dar reikia tikrinti ar pertraukimas tikras.
ant kokio nors pic ar avr galima padaryti ir 3-5 ciklu pertraukima, jei registru nesaugosi |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 14:36 |
|
|
|
|
| Digix rašo: |
ant arm gana daug nes ten dar reikia tikrinti ar pertraukimas tikras.
|
pirmą kart girdžiu  |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 15:02 |
|
|
|
|
yra toks dalykas "spurious intrrerupt"
beje arm negali pertraukimu vykdyti viena kito viduje, kas dar apsunkina reikala |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 17:52 |
|
|
|
|
| Digix rašo: |
| beje arm negali pertraukimu vykdyti viena kito viduje, kas dar apsunkina reikala |
o galbūt išeina su kokiu asembleriu pasirašyt 'softvarinį' interuptų valdymą? |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2007 08 13, 22:39 |
|
|
|
|
zinoma galima, ir kadangi procesirius turi daug registru tai galima net nurodyti jam tisiog kazkuriu isvis nenaudoti ir tada net saugoti nereikes.
bet toks pertrauskmas tures mazai naudos nes nieko rimto ten nepadarysi.
ir siaip asambleris bent man neturi privalumo pries C, nes visdelto rezultatas gaunasi toks pat |
|
|
|
|
|
 |
 |
Interuptai |
Parašytas: 2008 06 12, 16:04 |
|
|
|
|
gaivinu tema - prireikė pagalbos dėl interuptų..
kurį ISR ARM7TDMI sistemai geriau naudoti - ar tą, kurį turi GCC (tikiuos kad turi ), ar pasirasyt savo? Dėl marmalo, kurį gali sukurt gcc man rodos geriau savas, bet bent jau aišku ir kas ir kur ir kaip.
stack pointerį interupt rėžimui (ir visiems kitiems) reikia initializuoti atskirai?
ar geras toks ISR kodas vectored interrupt rėžimui?
| Kodas: |
stmfd sp!, {r0-r12, lr}
mrs r0,cpsr
orr r0,r0,#I_BIT|F_BIT //isjungti IRQ ir FIQ,nors nebutina
msr cpsr,r0
ldr r0,=interuptu_funkcijos
add r0, r0, 0x018 //tam, kad susirast atitinkama f-ja
mov lr, pc
ldr pc, [r0] //vykdom f-ja
ldmfd sp!, {r0-r12, lr}
msr cpsr, spsr
bx lr
|
dabar ką daryti pabaigoje? bx lr yra bloga komanda, nes lr jau bus iš normal mode (as komanda prieš tai perėjau iš IRQ į buvusį rėžimą). Kaip grąžinti buvusi cpsr ir kontekstą, kartu paiimant lr. Ar tiesiog neisjungti IRQ rėžimo (ištrinti paskutine msr komanda)
kiek pastebėjau, kviečiant kitas funkcijas aplinka (=context) nėra išsaugojami. Interuptuose turėtų būti panašiai - juk čia tas pats, kas funkcija - ar būtina išsaugoti visus r0-r12?
kurie interuptai greiciau - ar FIQ (mano atveju procesorius turi atskirus 8 registrus FIQ vykdymui) ar vectored IRQ? |
|
|
|
|
|
 |
 |
Interuptai |
Parašytas: 2008 06 12, 16:35 |
|
|
|
|
abejoju kad apsimoka savo rasyti ir paskui galvotikas blogai.
tik jei tavo shema labai jau maza, ir pertraukimu daug nereikia, gilima isvis visus pertraukimus ant vienos funkcijos sumesti, taip sutaupant kelis ciklus.
del tavo programos tai jei nori cia pavyzdys is crossworks
irq_handler:
// check if I bit is set in SPSR to detect spurious interrupts
stmfd sp!, {r0}
mrs r0, spsr
tst r0, #0x80
ldmfd sp!, {r0}
subnes pc, lr, #4
// store the APCS registers in the non-tasking case
stmfd sp!, {r0-r4, r12, lr}
//((CTL_ISR_FN_t)VICVectAddr)();
ldr r4, =0xFFFFF030
ldr r3, [r4]
mov lr, pc
bx r3
// VICVectAddr = 0;
mov r3, #0
str r3, [r4]
// return from interrupt
ldmfd sp!, {r0-r4, r12, lr}
subs pc, lr, #4 |
|
|
|
|
|
 |
 |
Interuptai |
Parašytas: 2008 06 12, 17:24 |
|
|
|
|
na va, sutvarkiau.
vieno dalyko nei vienam ISR pavyzdy nesuprantu - jie daro ne ta ka reikia. Pagal datashheta reikia atstatyti CPSR. Tas crossworksu neatstato (jo ir nenoriu naudot, nes neaisku, ka jis daro)
Pabaigtas kodas, gal kam reikes. Mano klaida buvo, nes nežinojau, kadLDM sugeba vienu metu ir spsr i cpsr nuskaityt, ir registrus.
| Kodas: |
stmfd sp!, {r0-r12, lr}
mrs r0,cpsr
orr r0,r0,#I_BIT|F_BIT //isjungti IRQ ir FIQ,nors nebutina
msr cpsr,r0
ldr r0,=interuptu_funkcijos
add r0, r0, 0x018 //tam, kad susirast atitinkama f-ja
mov lr, pc
ldr pc, [r0] //vykdom f-ja
ldmfd sp!^, {r0-r12, pc}
|
du klausimai vistiek liko:
stack pointerį interupt rėžimui (ir visiems kitiems) reikia initializuoti atskirai?
kurie interuptai greiciau - ar FIQ (mano atveju procesorius turi atskirus 8 registrus FIQ vykdymui) ar vectored IRQ? |
|
|
|
|
|
 |
 |
Interuptai |
Parašytas: 2008 06 13, 00:41 |
|
|
|
|
nieko ir be atskiro steko nenutiks nebent noretum grizti i programa dar nrbaiges pertraukimo.
C funkcijos ir taip issaugo steka nepakitusi.
FIQ ir IRQ panasu kad tas pats, tik jei reikia labai didelio greicio galima ant FIQ nesinaudoti vektoriais o tiesiai ant jo pakabinti norima funkcija.
o siap tai nepastebejau jokio skirtumo. |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2008 06 13, 10:55 |
|
|
|
|
| Vieną dalyką pastebėjau - tikrai neišsaugo r0-r3. Pagal kažkokį tai standartą šiais registrais perduodami duomenys f-jai (+ stack, jei daugiau, nei 4). Negi net jei f-ja be argumentu, ji elgiasi su registrais, lyg jie būtų jos? |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2009 06 13, 22:53 |
|
|
|
|
Iškilo dar klausimų. Kaip įjungti/išjungti tik tam tikrus pertraukimus? Pvz tik INT0 ir Timer1 persipildymo?
Atrodo, kad taimerių pertrauktim reikia naudoti TIMSK. |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2009 06 14, 17:41 |
|
|
|
|
| kiekvienas interrupt`as turi sau priklausiantį įijungimo/išjungimo flag`ą kuriam nors registre. Tokiu būdu gali visus atskirai valdyti. Jeigu nori visus iškarto išjungti įjungti, tai yra atitinkamas registras, tik vat senokai prie AVR`ų sėdėjau tai tiksliai neprisimenu, man atrodo SREG`o I flag`as. O šiaip tai sei ir cli funkcijos yra tam naudojamos, kurios užvardintos interrupt.h faile. |
|
_________________ nepamirškit, klysti žmogiška
privatas - privatiems klausimams
arch linux  |
|
|
|
 |
Interuptai |
Parašytas: 2009 06 14, 17:45 |
|
|
|
|
| Dovydas rašo: |
Iškilo dar klausimų. Kaip įjungti/išjungti tik tam tikrus pertraukimus? Pvz tik INT0 ir Timer1 persipildymo?
Atrodo, kad taimerių pertrauktim reikia naudoti TIMSK. |
O man atrodo, kad viskas labai aiskiai datasheete parasyta... |
|
|
|
|
|
 |
Interuptai |
Parašytas: 2009 11 09, 18:05 |
|
|
|
|
| Kam naudojami GIFR registro External Interrupt Flag (ClearFlagai)? |
|
Paskutinį kartą redagavo Dovydas, 2009 11 09, 19:28. Redaguota 1 kartą _________________ --- |
|
|
|
|
 |
Google paieška forume |
|
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Must have farming mods
Farming simulator modhub,
Best farming simulator mods |
|

|
 |