AVR "Multitasking"

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
Felix
Pokročilý člen
Pokročilý člen
Príspevky: 568
Dátum registrácie: 09 Sep 2013, 13:36
Bydlisko: Košeca
Vek: 24

AVR "Multitasking"

Príspevok od používateľa Felix » 08 Feb 2014, 07:59

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

Používateľov profilový obrázok
dxr
Ultimate člen
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"

Príspevok od používateľa dxr » 08 Feb 2014, 08:22

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

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
potom v main

Kód: Vybrať všetko

main(){
   for(;;){
      task1;
      task2;
      task3;// a tak dalej
   }

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
0
Naposledy upravil/-a dxr v 08 Feb 2014, 13:00, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
bobor1992
Ultimate člen
Ultimate člen
Príspevky: 2761
Dátum registrácie: 17 Apr 2007, 00:00
Bydlisko: Zvolen
Vek: 31

Re: AVR "Multitasking"

Príspevok od používateľa bobor1992 » 08 Feb 2014, 09:48

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.

Používateľov profilový obrázok
dxr
Ultimate člen
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"

Príspevok od používateľa dxr » 08 Feb 2014, 10:24

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.
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: AVR "Multitasking"

Príspevok od používateľa jaromir » 08 Feb 2014, 11:50

Felix 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?
Neber to ako urazku, ale ako podnet k studiu: z charakteru otazky vyplyva, ze o AVR-kach, resp. mikrokontroleroch toho vela nevies ;-)

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();
  }
 }
}
Teda od casovej zakladne si si odvodil dva dalsie softwarove timery t1,t2, ktore ti riadia LED.
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

Používateľov profilový obrázok
Washu
Power user
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"

Príspevok od používateľa Washu » 08 Feb 2014, 12:30

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.
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)

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: AVR "Multitasking"

Príspevok od používateľa Kado » 08 Feb 2014, 15:48

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...
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

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: AVR "Multitasking"

Príspevok od používateľa Kado » 08 Feb 2014, 15:51

OT: jaromir kedy si mal 30? vyzera to tak, ze sme na tom velmi podobne, ja 6.feb :D
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

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: AVR "Multitasking"

Príspevok od používateľa jaromir » 08 Feb 2014, 16:12

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.
0

Používateľov profilový obrázok
Felix
Pokročilý člen
Pokročilý člen
Príspevky: 568
Dátum registrácie: 09 Sep 2013, 13:36
Bydlisko: Košeca
Vek: 24

Re: AVR "Multitasking"

Príspevok od používateľa Felix » 09 Feb 2014, 08:34

Ok, je mi to jasne..

da sa este nejako skontrolovat kolko trval jeden loop?
0

DJ_Edo
Pokročilý člen
Pokročilý člen
Príspevky: 775
Dátum registrácie: 23 Aug 2013, 16:07
Bydlisko: LV

Re: AVR "Multitasking"

Príspevok od používateľa DJ_Edo » 09 Feb 2014, 08:48

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"

peterple
Ultimate člen
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"

Príspevok od používateľa peterple » 09 Feb 2014, 10:42

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.

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í.

Napísať odpoveď