www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

GNU C pomoč začetniku IV

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.03
Kraj: Dragomer

PrispevekObjavljeno: Ned Sep 25, 2011 8:13 am    Naslov sporočila:  GNU C pomoč začetniku IV Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.03
Kraj: Dragomer

PrispevekObjavljeno: Pon Sep 26, 2011 1:03 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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