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 

najpreprostejša delay funkcija za ARM vC

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Čet Okt 06, 2011 9:26 pm    Naslov sporočila:  najpreprostejša delay funkcija za ARM vC Odgovori s citatom

Čaw zanima me, kako bi lahko na ARM napisal najpreprostejšo delay funkcijo. Poiskusil sem tole, pa nekaj ne stima. Poiskusal sem spreminjati int, pa lucka ne utripa :S
Koda:

void delay(void){
   int stej = 100000000;
   while(stej){
      stej = stej - 1;
   }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Sadida
Član
Član



Pridružen-a: Pet 17 Apr 2009 12:53
Prispevkov: 636
Aktiv.: 3.22
Kraj: Zasavje

PrispevekObjavljeno: Čet Okt 06, 2011 9:58 pm    Naslov sporočila:   Odgovori s citatom

Kaj se zgodi, če probaš kaj takšnega?

Koda:
void delay()
{
    long i;

   for (i=0;i<100000;i++)
   {
         
   }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Čet Okt 06, 2011 10:16 pm    Naslov sporočila:   Odgovori s citatom

Nic se ne zgodi lucka samo sveti Smile. Aja delay funkcijo uporabim približno takole, da bo še to jasno Smile
Koda:
while(1){
      GPIO_MODE0_RESET = 0x4000;
      delay();
      GPIO_MODE0_SET = 0x4000;
      delay();
   }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Čet Okt 06, 2011 11:28 pm    Naslov sporočila:  Re: najpreprostejša delay funkcija za ARM vC Odgovori s citatom

Poskusi tako:
Koda:

void delay(volatile int stej){
  while(stej--);


bistven je type-specifier volatile. To v bistvu prevajalniku pve, da mora predpostavljati, da se ta spremenljivka lahko spremeni oz. uporablja kje drugje, in ne sme optimizirati branj in pisanj spremenljivke.

Takšne dele kode, kot je tvoja (brez volatile), prevajalniki ponavadi preprosto zbrišejo in nastavijo končno vrednost, ker ni ničesar odvisno od te spremenljivke (pač optimizacija). Z volatile prevajalniku poveš, da tega ne sme narediti.

edit: še v tvoji obliki:
Koda:
void delay(void){
    volatile int stej = 100000000;
    while(stej){
       stej = stej - 1;
    }
 }



LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2105
Aktiv.: 8.86
Kraj: Ljubljana

PrispevekObjavljeno: Čet Okt 06, 2011 11:46 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
int stej = 100000000;

Max vrednost, ki jo int tip lahko shrani je ?
Bo treba uporabit več zank, ali večji tip spremenljivke.

Pri kasnitvah z odštevanjem, ti lahko nagaja vključena optimizacija kode.
Izključi optimizacijo za del kode s kasnitvijo (pragma), ali na splošno.
Spremenljivko lahko poskusiš deklarirat kot volatile.

Bolj točne kasnitve narediš s pomočjo prekinitev.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Pet Okt 07, 2011 6:01 am    Naslov sporočila:  Re: najpreprostejša delay funkcija za ARM vC Odgovori s citatom

chaos je napisal/a:
Takšne dele kode, kot je tvoja (brez volatile), prevajalniki ponavadi preprosto zbrišejo in nastavijo končno vrednost, ker ni ničesar odvisno od te spremenljivke (pač optimizacija). Z volatile prevajalniku poveš, da tega ne sme narediti.


Se pravi lahko napako popravim tudi tako, da izključim optimizacijo za GCC? Sam make file popravim in bi mogoce tudi to delovalo. Drugace pa vajina resitev deluje brezhibno. Chaos ti si mi itak ze tok veliko pomagal pri postavitvi razvojne verige, da sem ti zelo hvalezen in sem sedaj koncno dozivel nek uspeh s tem ARM9.

Mi lahko v grobem povesta, kako naj se sedaj lotim blinkerja, kjer bo timer vračal prekinitve. Nekako razumem, da ko pride prekinitev, se vrednosti Current Process Status Registra CPSR shranijo v shadow registre za nek interrupt in se po sprostitvi interrupta povrnejo. Za ARM9 popolnoma razumem, kako prižgem timer in ga nastavim, da mi vsakih 1,2s vrne interrupt, kar sem že naredil a ne vidim rezultata. Potreboval bi kak napotek, kaj moram sedaj definirati na vrhu programa in kako potlej sestavim blinker. Nekako se prvič srečujem z potrebo po interruptih in mi je vse novo. Mogoče kak primer preprostega C programa?

Hvala obema.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Č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: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group