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