AVR "Multitasking"
Moderátori: psichac, Moderátori
AVR "Multitasking"
Ako riesite robenie viacerich uloh naraz pri 8bit AVRkach ako napr. Atmega? Ako priklad uvediem V-USB pollovanie a cojaviem blikanie ledky kazdu sekundu.. Maju AVRka nieco ako deltatime?
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: AVR "Multitasking"
Pozri si DuinoOS pripadne nejaky iny RTOS
Ja osobne preferujem nieco taketo pripadne jeden iny RTOS
ktory som pouzil z jedneho ineho projektu.
pripadne si sprav viac funkcii a vnej stavovy stroj a tu akciu rozdel na viac krokov
pseudo kod aby si mal predstavu
potom v main
takto nejako mozes spravit viac taskov a najjednoduchsi cooperativny multitasking
pripadne pozri preemptive implementacie len tie uz asi nenapises musis prerusovat task odlozit ho a restornut cez asm
Ja osobne preferujem nieco taketo pripadne jeden iny RTOS
ktory som pouzil z jedneho ineho projektu.
pripadne si sprav viac funkcii a vnej stavovy stroj a tu akciu rozdel na viac krokov
pseudo kod aby si mal predstavu
Kód: Vybrať všetko
globalne premmene aby si nemusel to predavat cez parametre
uchar8_t tsk1,tsk2;//tolko kolko bude taskov
task1() {
switch (tsk1)
0: return;
1: {zisti_stav; break;}
2: spracuj_stav();break}
3: {zobraz_stav();break}
default: tsk1=1;
}
tsk1++;
} // koniec tsk1
}
// tsk1=0 ho zastavis ak by si poteboval nejako zastavit posielanie dat napr na serial
Kód: Vybrať všetko
main(){
for(;;){
task1;
task2;
task3;// a tak dalej
}
pripadne pozri preemptive implementacie len tie uz asi nenapises musis prerusovat task odlozit ho a restornut cez asm
0
Naposledy upravil/-a dxr v 08 Feb 2014, 13:00, upravené celkom 1 krát.
- bobor1992
- Ultimate člen
- Príspevky: 2761
- Dátum registrácie: 17 Apr 2007, 00:00
- Bydlisko: Zvolen
- Vek: 31
Re: AVR "Multitasking"
A čo tak čítače/časovače a prerušenia?
0
Väčšina ľudí z PC a Elektro fór zjavne potrebuje počítač, na ktorom cez deň konštruuje vesmírne lode v AutoCADe a zároveň pri tom hrá Crysis a potom celú noc renderuje 3D scény pre chystané pokračovanie Shreka a popri tom ešte strihá Full HD video.
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: AVR "Multitasking"
Ak to bola otazka na mna tak odpovedou je RTOS tam je to osetrene vratane mutexov que a messages
Felix ma 14.7r tak som zvolil ten relativne dobre dokumentovany ArduOS a ten uplne zakladny cooperativny(round-robin)
Hadam este niekto prispeje nejakym prikladom nech si vyberie co sa mu hodi a paci.
Felix ma 14.7r tak som zvolil ten relativne dobre dokumentovany ArduOS a ten uplne zakladny cooperativny(round-robin)
Hadam este niekto prispeje nejakym prikladom nech si vyberie co sa mu hodi a paci.
0
Re: AVR "Multitasking"
Neber to ako urazku, ale ako podnet k studiu: z charakteru otazky vyplyva, ze o AVR-kach, resp. mikrokontroleroch toho vela neviesFelix napísal:Ako riesite robenie viacerich uloh naraz pri 8bit AVRkach ako napr. Atmega? Ako priklad uvediem V-USB pollovanie a cojaviem blikanie ledky kazdu sekundu.. Maju AVRka nieco ako deltatime?
V AVR-ku mas to, co je v datasheete, pre toto vyuzitie je podstatne precitat si kapitolu o timeroch. Nie je to nic zazracne, len citac, do ktoreho sa nejakou rychlostou (odvodenou od taktovacieho kmitoctu) pripocitava jednotka. V najjednoduchsom pripade (a je ich viacero, to teraz nebudeme brat do uvahy), ked timer pretecie, nastavi sa nejaky flag a tento moze sposobit prerusenie - ale nemusi, mozes si ten flag kontrolovat rucne.
Ak si nastavis timer tak, ze pretecie kazdych trebars 10ms, mas casovu zakladnu, ktoru mozes pouzit trebars takto:
Kód: Vybrať všetko
unsigned char t1,t2;
while (1)
{
if (timer_hardwarovy_pretiekol())
{
t1++;
if (t1==25)
{
t1=0;
blik_led1();
}
t2++;
if (t2==30)
{
t2=0;
blik_led2();
}
}
}
Takto ti budu dve LEDky blikat "nezavisle od seba" kazdych 250 a 300ms. V tom while loope mozes este checkovat milion dasich softwarovych timerov alebo stavovych strojov, co len chces.
Ten zdrojak vyssie je len "ideovy", ale malo by z neho byt jasne o co ide. Skutocna implementacia nebude mat o viac nez 20 riadkov kodu navyse.
0
- Washu
- Power user
- Príspevky: 4521
- Dátum registrácie: 15 Apr 2010, 00:00
- Bydlisko: Multiverse
- Vek: -1998
- Kontaktovať používateľa:
Re: AVR "Multitasking"
Na vacsie veci http://www.freertos.org/
Kazdopadne RTOS a AVR, mi pride trochu nevyvazene riesenie. RTOS vseobecne sa hodia na trocha vybavernejsie architektury ako Cortex M3, 4, ARM7, 9 ci MIPS.
Pokial nepotrebujes plnohodnotny RTOS tak to sprav ako ti pisal jaromir.
Kazdopadne RTOS a AVR, mi pride trochu nevyvazene riesenie. RTOS vseobecne sa hodia na trocha vybavernejsie architektury ako Cortex M3, 4, ARM7, 9 ci MIPS.
Pokial nepotrebujes plnohodnotny RTOS tak to sprav ako ti pisal jaromir.
0
It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong
(Richard Feynman)
(Richard Feynman)
Re: AVR "Multitasking"
ja to riesim podobne ako pise jaromir
zapnem hw timer, napr s periodou 1ms
dalej si v preruseni spravim sw timre, napr 10ms, 100ms, 1sec, 1min... (podla poziadaviek), a k nim zodpovedajuce flagy /casove znacky
v hlavnom programe iba kontrolujem priznaky pre spominane sw timre a spustam prislusne funkcie...
zapnem hw timer, napr s periodou 1ms
dalej si v preruseni spravim sw timre, napr 10ms, 100ms, 1sec, 1min... (podla poziadaviek), a k nim zodpovedajuce flagy /casove znacky
v hlavnom programe iba kontrolujem priznaky pre spominane sw timre a spustam prislusne funkcie...
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
Re: AVR "Multitasking"
OT: jaromir kedy si mal 30? vyzera to tak, ze sme na tom velmi podobne, ja 6.feb
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
http://www.jk-elektronika.info/index.html
predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154
Re: AVR "Multitasking"
kado: tiez 6. feb
Este k tym timerom a interruptom - v ostatnej dobe som si zvykol robit taketo veci uplne bez preruseni, iba v main loop-e. Pre casovanie radovo v stovkach us a pomalsie to bohato staci. Mam zopar aplikacii, ktore su dost rozsiahle a mam tam trebars len dvazdroje preruseni.
Podmienkou je, aby v v hlavnej slucke vsetky funkcie boli "priechodzie", teda aby nic nebolokovali. Ak je treba cakat medzi dvomi akciami trebars 100ms, tak sa to nerobi nejakym delay-om, kde MCU iba zabija cas NOP-mi, ale sa spusti softwarovy timer, alebo sa od existujuceho timera vezme casovy udaj a druha akcia sa vykona az ked rozdiel toho timera a casoveho udaja je 100ms.
Este k tym timerom a interruptom - v ostatnej dobe som si zvykol robit taketo veci uplne bez preruseni, iba v main loop-e. Pre casovanie radovo v stovkach us a pomalsie to bohato staci. Mam zopar aplikacii, ktore su dost rozsiahle a mam tam trebars len dvazdroje preruseni.
Podmienkou je, aby v v hlavnej slucke vsetky funkcie boli "priechodzie", teda aby nic nebolokovali. Ak je treba cakat medzi dvomi akciami trebars 100ms, tak sa to nerobi nejakym delay-om, kde MCU iba zabija cas NOP-mi, ale sa spusti softwarovy timer, alebo sa od existujuceho timera vezme casovy udaj a druha akcia sa vykona az ked rozdiel toho timera a casoveho udaja je 100ms.
0
Re: AVR "Multitasking"
Ok, je mi to jasne..
da sa este nejako skontrolovat kolko trval jeden loop?
da sa este nejako skontrolovat kolko trval jeden loop?
0
Re: AVR "Multitasking"
Jaromir, ako by to bolo v ASM pre AVR?
Kód: Vybrať všetko
unsigned char t1,t2;
while (1)
{
if (timer_hardwarovy_pretiekol())
{
t1++;
if (t1==25)
{
t1=0;
blik_led1();
}
t2++;
if (t2==30)
{
t2=0;
blik_led2();
}
}
}
0
Nasliněný prst na svorkovnici domovního rozváděče: "Jó, paninko, máte tam ty Voltíky všecky"
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: AVR "Multitasking"
Napríklad takto. Neoveroval som to, takže ak to nebude fungovať treba si to odladiť. Predpokladá sa určitá inicializácia premenných a aj hw. Predpoklad je že prerušenia od časovača chodia okolo 1ms. Preto som použil 16 bitové počítadlo a aritmetiku.
Samozrejme že v MainLoop môžu byť ďalšie kontroly príznakov prerušení,napr od UART alebo testovanie tlačítok a podobne.
V takomto jednoduchom prípade by to šlo všetko urobiť iba v registroch, ale časom sa ukáže že je lepšie použiť SRAM.
Samozrejme že v MainLoop môžu byť ďalšie kontroly príznakov prerušení,napr od UART alebo testovanie tlačítok a podobne.
V takomto jednoduchom prípade by to šlo všetko urobiť iba v registroch, ale časom sa ukáže že je lepšie použiť SRAM.
Kód: Vybrať všetko
#define LED portd,0
.equ FLAG_TIMER = 0
.equ LED_TIME_ON = 500
.equ LED_TIME_OFF = 1000
.dseg
Flags: .byte 1
BlikCounter: .byte 2
.cseg
MainLoop:
lds xl,Flags
sbrs xl,FLAG_TIMER
rjmp NoTimer
andi xl,~(1<<FLAG_TIMER)
sts Flags,xl ;deaktivuj priznak
lds xl,BlikCounter
lds xh,BlikCounter+1
adiw xl,1
ldi zl, low (LED_TIME_ON)
ldi zh, high(LED_TIME_ON)
cp xl,zl
cpc xh,zh
brne NoLED_ON
sbi LED
NoLED_ON:
ldi zl, low (LED_TIME_OFF)
ldi zh, high(LED_TIME_OFF)
cp xl,zl
cpc xh,zh
brne NoLED_Off
cbi LED
ldi xl,0
ldi xh,0
NoLED_Off:
sts BlikCounter,xl
sts BlikCounter+1,xh
NoTimer:
rjmp MainLoop
;obsluha prerusenia casovaca
IntTimer: push xl
in xl,sreg
push xl
lds xl,Flags
sbr xl,(1<<FLAG_TIMER)
sts Flags,xl
pop xl
out sreg,xl
pop xl
reti
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.