 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Okt 06, 2011 9:26 pm Naslov sporočila: najpreprostejša delay funkcija za ARM vC |
|
|
Č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 |
|
 |
Sadida Član


Pridružen-a: Pet 17 Apr 2009 12:53 Prispevkov: 636 Aktiv.: 3.22 Kraj: Zasavje
|
Objavljeno: Čet Okt 06, 2011 9:58 pm Naslov sporočila: |
|
|
Kaj se zgodi, če probaš kaj takšnega?
Koda: |
void delay()
{
long i;
for (i=0;i<100000;i++)
{
}
} |
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Okt 06, 2011 10:16 pm Naslov sporočila: |
|
|
Nic se ne zgodi lucka samo sveti . Aja delay funkcijo uporabim približno takole, da bo še to jasno
Koda: |
while(1){
GPIO_MODE0_RESET = 0x4000;
delay();
GPIO_MODE0_SET = 0x4000;
delay();
}
} |
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Okt 06, 2011 11:28 pm Naslov sporočila: Re: najpreprostejša delay funkcija za ARM vC |
|
|
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 |
|
 |
int47 Član


Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2105 Aktiv.: 8.86 Kraj: Ljubljana
|
Objavljeno: Čet Okt 06, 2011 11:46 pm Naslov sporočila: |
|
|
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 |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Okt 07, 2011 6:01 am Naslov sporočila: Re: najpreprostejša delay funkcija za ARM vC |
|
|
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 |
|
 |
|
|
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
|