avr threads

Moczik Gabor pm at progzmaster.hu
Thu Sep 14 19:32:01 CEST 2006


Pal Lukacs wrote:
>  Valakinek mar jutott eszebe hasonlo?Lehetseges ilyen?
>  Vagy szerintetek ertemetlen?

Biztos meg lehet csinalni, van par minta a neten ilyen idoosztasos 
multitaszk dolgokhoz, de nekem erosen korlatosnak tunik az alkalmazhatosaga...
En annak a hive vagyok, hogy mindig a celfeladathoz megirom az arra 
legalkalmasabb megoldast.

Az univerzalis megoldasnak kb. annyi a lenyege, hogy egy timert 
felprogramoznak valamilyen eleg gyors idore, es a taskokhoz be van allitva 
hogy milyen idokozonkent kell lefutnia. Minden task-hoz van egy szamlalo, 
ami azt szamolja, miota _nem_ futott az a resz.
A timer interruptban noveled az osszes task szamlalojat, majd amelyik eleri 
a beallitott futasi idokozt, azt meghivod, es nullazod a szamlalot.

Ezzel nekem annyi a bajom, hogy a nagysebessegu timer eleve zabalja a 
prociidot. A masik, hogy ritkan kellett nekem ilyen jellegu multitaszkolas. 
Nalam altalaban az idokritikus dolokat megszakitas szolgalja ki (ezek nalam: 
RS232/I2C/SPI RX/TX, A/D inditas kiolvasas/egyszerubb feldolgozas, PWM, 
billentyukod pufferbe tarolas, RS232-n erkezo kituntetett parancsokra reagalas).
Minden nem-idokritikus pedig a foprogramban. (ezek: billentyuzet puffer 
olvasas, kijelzo kezeles, A/D meresi eredmenyek bonyolultabb feldolgozasa es 
megjelenitese, idoigenyes kulso RS232 parancsok vegrehajtasa...)

>  Nem reg karakteres LCD-n ket mozgo figurat akartam megjeleniteni egyszerre.Persze  mindket timerem foglalt volt.
>  Na hat nem talaltam ra megoldast, es mar majdnem beirtam hogy create_thread(..) :-))

Erre pl. tok eleg 1 timer is, ha fentebb emlitett idooasztasos uzemmodban.
Az LCD babralast nem tennem a megszakitasba, a timer-t en csak arra 
hasznalnam, hogy jelezzem a foprogramnak, hogy letelt a kert ido.
Pl. ket egymastol fuggetlen animaciot igy csinalnek:

volatile unsigned int cnt1,cnt2;
volatile unsigned char flag1, flag2;
unsigned int cnt1_threshold,cnt2_threshold;

void timer1_isr()
{
     cnt1++;
     if (cnt1==cnt1_threshold) {
         cnt1=0;
         flag1=1;
     }

     cnt2++;
     if (cnt2==cnt2_threshold) {
         cnt2=0;
         flag2=1;
     }
}

void main()
{
     // periodus ido beallitas
     cnt1_threshold=57;
     cnt2_threshold=79;

     enable_timer1();
     for(;;) {
         if (flag1) {
             flag1=0;
             // 1-es animacio egy lepese ide
         }
         if (flag2) {
             flag2=0;
             // 2-es animacio
         }

         // egyeb folyamatok...

     }
}

-- 
((( Móczik Gábor  )))--((( pm -> @ -> progzmaster -> . -> hu  )))
((( Skype: moczik )))--((( Website: http://www.progzmaster.hu )))



More information about the Elektro mailing list