|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.03 Kraj: Dragomer
|
Objavljeno: Ned Sep 25, 2011 8:13 am Naslov sporočila: GNU C pomoč začetniku IV |
|
|
Pozdravljeni,
Pri prehodu iz mikrokrmilnikov na Linux naletim na težave, ki seveda izvirajo iz neznanja, pa tudi ne najdem na spletu nekega recepta, zanje.
Zato prosim, da mi posredujete vaše recepte za moj problem, kako startati in programirati nekaj,
kar v mikrokrmilni tehniki imenujemo timer interrupt program in
serial interrupt podprogram.
Ker je Linux multitasking stroj je nekaj takega gotovo mogoče.
V C-u bi moralo to izgledati nekako tako:
Koda: |
int main()
{
/*
Moj program se običajno sestoji iz štirih delov:
1. uvodna programska veja, ki se izvede samo enkrat in to
neposredno po startanju programa. V njej sem, ko sem programiral
mikrokontrolerje definiral in startal
timer-prekinitveni podprogram -
le ta je bil zadolžen, da po preteku periode, običajno ene sekunde, postavi
bit, recimo periodabit na 1. S tem sem se lahko izognil zakasnitvenim zankam
(wait) ki jih ne maram, ker takrat je mikro 'v komi' in ne opazi nič, in bi
takrat lahko spregledal recimo, da je na vhodu prišlo do važne spremembe.
in serial input prekinitveni podprogram, ki je z glavnim programom nekako
paralelno in je prestregel vse informacije, ki si prišle preko serijskega
vhoda. Ko je bila informacija pripravljena za obdelavo, le ta postavi bit,
recimo prebranobit in da s tem glavnemu programu informacijo: prebrana vsebina
je pripravljena za obdelavo.
*/
while (1)
{
if (periodabit == 1)
{
periodabit = 0;
/*
2. drugi del programa se odvija periodično in v njej štejem
čas, kadar je potrebno, da se nekaj odvija po časovnem planu
Če recimo, samo za primer, želim, da se nek rele odklopi po
tolikem času, tukaj odštevam sekunde njegovega števca,
in ko pride do ničle, ga odklopim.
*/
}
if (prebranobit == 1)
{
prebranobit = 0;
/* 3. del
Tukaj obdelam prebrano informacijo dobljeno iz serijskega vhoda in
morebitno tudi odgovorim nanjo.
*/
}
/* in četrti del, ki se stalno odvija in nadzira vhodno/izhodne pine
in reagira. Ta del je običajno kratek in včasih ga sploh ni, če te
funckije lahko opravi prvi del, ki se odvija vsako sekundo
*/
} // end of while
} // end of main
|
|
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.03 Kraj: Dragomer
|
Objavljeno: Pon Sep 26, 2011 1:03 pm Naslov sporočila: |
|
|
Kot slepa kura, ki pokljuva veliko kamenčkov, a včasih le najde zrno, sem tudi jaz našel morda ne najbolj elegantno rešitev na enega od naštetih problemov:
Kako del programa izvajati periodično, ne da bi izpustil upravo iz rok, del programa se namreč izvaja stalno.
Nekje sem našel primere uporabe time.h funkcij in iz primerov pobral tisto, ki daje čas v sekundah (sekunde se začnejo šteti 1. jan. 1970, zato je podatek v spremenljivki tipa long.
No in sem definiral tudi jaz spremenljivko tipa long, in vanjo dal za periodo (=10 sekund) večji podatek, ki ga potem v if pogoju testiram:
Koda: |
// Program demonstrira, kako periodično izvajati nekatere dele programa
// med tem, ko se ostali deli programa izvajajo stalno
#include <stdio.h>
#include <time.h>
int main()
{
long sekunde =0;
int stevec = 0;
while (1) // glavna programska zanka se odvija v neskončnost
{
// ta del programa se odvija stalno,
// ................................
// in stalno nadziramo pretečeni čas:
time_t seconds;
seconds = time (NULL);
if (seconds > sekunde ) // če je pretečeni čas (recimo 10 sekund) potekel
{
sekunde = seconds + 10; // ponastavimo čas za sledečo periodo
// in ta del programa se bo izvajal samo periodično
printf ("To se izvaja samo na 10 sekund.\n");
stevec++;
} // end of if
// tudi ta del programa se izvaja stalno
if (stevec > 5) break; // če vseeno želimo zaključiti delo programa
} // end of while
return 0;
}
|
Prav verjetno pozna kdo elegantnejšo rešitev, in če jo, se zanjo priporočam. |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 75 dni
Powered by phpBB © 2001, 2005 phpBB Group
|