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

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Avg 11, 2009 9:46 pm Naslov sporočila: |
|
|
Res sem ga spregledal, zato sem prvotni post zbrisal in povzel ugotovitve, ki so bile podane v razlicnih postih. Si ravno pisal odgovor med mojo spremembo
Citiram: |
Iz vidika samega namena sicer trapastega primera, optimizacija dela prav.
Se pa vsaj nama s Sokratom postavlja vprašanje, ali c prevajalnik
res legitimno eliminira refresh spremenljivke c, ki je deklarirana kot volatile... |
Eliminacija je pravilna, saj si tudi sam povedal: c lokalna in je na stacku in po izhodu iz main se z njo nic ne zgodi, stack se zgubi, torej, koga briga kaksno vrednost ima. Zakaj se pa i spreminja? Ja zato, ker se vmes klice se ena funkcija in kaj se v funkciji dogaja pa nic ne vemo (crna skatla) in ta funkcija se mora izvest i-krat. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free.
Nazadnje urejal/a Glitch Tor Avg 11, 2009 9:53 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.61 Kraj: Ljubljana
|
Objavljeno: Tor Avg 11, 2009 9:52 pm Naslov sporočila: |
|
|
Glitch je napisal/a: |
Lokalne spremenljivke nimajo nobene uporabne vrednosti, ce se jih ne uporabi in prevajalnik jih optimizira oz. odstrani kar je prav. Volatile gor, dol, levo, desno, ... |
Ma, tole ne bo čisto držalo... Kar je deklarirano kot volatile, prevajalnik ne sme! opletati s tem po svoji presoji.
Iz članka, katerega link sem podal zgoraj:
Citiram: |
The volatile qualifier is intended to provide a reliable anchor between variables and the memory system. Briefly stated, when a storage location is marked as volatile, the C compiler must ensure that every use (read or write) of that location in the source program is realized by an appropriate memory operation (load or store) in the compiled program. Ac- cesses to volatiles are considered to be side-effecting operations, and they are therefore part of the observable behavior of a program that must not be changed by an optimizing compiler. |
_________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.61 Kraj: Ljubljana
|
Objavljeno: Tor Avg 11, 2009 9:53 pm Naslov sporočila: |
|
|
OK, Glitch, očitno prihaja do race condition-ov.  _________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Avg 11, 2009 10:00 pm Naslov sporočila: |
|
|
(to je semafor)
oz.
Koda: |
xSemaphoreHandle xSemaphore;
void vATask( void * pvParameters )
{
vSemaphoreCreateBinary( xSemaphore );
if( xSemaphore != NULL )
{
}
}
|
Kakor jaz razumem je ravno point v vidnosti. c je deklariran lokalno, od zunaj ga ne mores spremenit, na ven ga ne vrnes in to je zadosten razlog za odstranitev. Kaj je tu memory system oz. storage?
P.S.
Resnico mi je zal, ampak nimam dev. orodja tu. Probaj deklarirati c v mainu kot static.
Aja, semaforju manjka take in give, ampak ... saj ves kaj sem hotel. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.61 Kraj: Ljubljana
|
Objavljeno: Tor Avg 11, 2009 10:17 pm Naslov sporočila: |
|
|
Glitch je napisal/a: |
(to je semafor) |
Jaz pa še vedno mislim, da je to race condition. Semafor oz. bolje mutex pa bi rešil zagato.
Citiram: |
Mutexes and binary semaphores are very similar but have some subtle differences: Mutexes include a priority inheritance mechanism, binary semaphores do not. This makes binary semaphores the better choice for implementing synchronisation (between tasks or between tasks and an interrupt), and mutexes the better choice for implementing simple mutual exclusion. |
Citiram: |
Kakor jaz razumem je ravno point v vidnosti. c je deklariran lokalno, od zunaj ga ne mores spremenit, na ven ga ne vrnes in to je zadosten razlog za odstranitev. Kaj je tu memory system oz. storage? |
Ni point v vidnosti. Point je v tem, da prevajalnik ne sme odstraniti branja ali pisanja volatile spremenljivke. Pa jo vseeno je...
Citiram: |
The proper behavior of a volatile-qualified variable is this:
For every read from or write to a volatile variable that
would be performed by a straightforward interpreter
for C, exactly one load from or store to the memory lo-
cation(s) allocated to the variable must be performed.
|
_________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Avg 11, 2009 10:21 pm Naslov sporočila: |
|
|
Hm... Don't let me download and install dev. tools here man!!!!!!
Kdo lahko proba static?
Tisto o semaforju, hotel sem povedati, da tisti smajli pomeni semafor, pa sem se spomnil kar na konkretno kodo. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.61 Kraj: Ljubljana
|
Objavljeno: Tor Avg 11, 2009 10:32 pm Naslov sporočila: |
|
|
Rezultat prevajanje z deklaracijo static volatile int c; :
Koda: |
9: for(i = 0; i < 9999; i++)
10: {
11: c = mult_int(i, 10);
12: }
13:
14: for(;;)
15: ;
16:
17: return 1;
18: }
19:
20: int mult_int(int a, int b)
21: {
0x000001E8 E3A0300F MOV R3,#0x0000000F
0x000001EC E3A00000 MOV R0,#0x00000000
0x000001F0 E2833C27 ADD R3,R3,#0x00002700
22: return a * b;
0x000001F4 E0801100 ADD R1,R0,R0,LSL #2
0x000001F8 E1A01081 MOV R1,R1,LSL #1
0x000001FC E5821000 STR R1,[R2]
0x00000200 E2800001 ADD R0,R0,#0x00000001
0x00000204 E1500003 CMP R0,R3
0x00000208 BAFFFFF9 BLT 0x000001F4
14: for(;;)
0x0000020C EAFFFFFE B 0x0000020C |
Logično je, da je v tem primeru, ko je c globalna spremenljivka, situacija drugačna. Logično se mi tudi zdi, da dejansko nima pomena pisat v lokalno spremenljivko (ki se nahaja na stacku)...
Vse to lepo in prav. Problem pa je še vedno enak. Prevajalnik vseeno nima pravice eliminirati read/write access-a do katerekoli spremenljivke deklarirane z volatile...
A si kaj pogledal tisti članek? _________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Tor Avg 11, 2009 11:07 pm Naslov sporočila: |
|
|
Da ne bo cisto iztrgano iz konteksta: za "..." si lahko predstavlja vsak svoje. Napisi cel prevedeni listing, ki je v bistvu lahko podoben zdjasnjemu, seveda bos pa tudi c uporabil nekje v glavnem programu (sicer je razumljivo da njo in vse kar se nanasa nanjo prevajalnik odoptimizira stran, ce ni uporabljena, zanko pa pac pusti, ker je i volatile in jo mora obravnavati).
Na podlagi takega konkretnega (nic oskubljenega) listinga se potem pogovarjamo dalje. Ni treba tvojega celega programa, samo toliko konkreten naj bo, da se prikaze napaka. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Avg 11, 2009 11:13 pm Naslov sporočila: |
|
|
Sem pogledal ja. Zanimivo branje, ni kaj. To moram pokazat nekomu, ki je strasno obcutljiv na gcc tematiko
Kakorkoli ze, kot jaz vidim problematiko tega je, da c ni tretiran kot memory system variable. Je v registru, tudi stack se mi tudi zdi samo virtualni pomnilniski hranilnik, ki virtualno prevzame vlogo globalno vidnost za vse kar sledi po deklaraciji znotraj {}.
Kot je v claniku tudi povedano, nekako sploh ni jasno definirano kaj to je, kako se tretira itd. Se mi zdi, da je najbolj pomembna tocka clanka ravno poglavje 7.5.
Zato sem toliko spraseval kaj to je memory system. V primeru globalnik spremenljiv in registrov pa to dejansko so pomnilniske lokacije, nekje tam... Here be dragons lokacija, pazi kaj delas
V primerih v clanku so spremenljivke deklarirane z volatile vedno izven funkcij, kjer se jih uporablja, vidnost pa ceprav na stacku se postavi kot lokalno globalna (kot sem napisal prej). Se vedno pa ostaja problem, da tudi v teh primerih pride do napak, kjer je ocitno, da ne sme mesetarit po pomnilniku, ceprav je stack.
Ampak... ne da mi miru ta primer. Moram rect, da je res nesrecno zloben Je realna koda taka? Spremenljivko c bos menda uporabil. Mogoce bi se razvijalci prevajalnikov izvlekli s tem, da recejo, da je prevajalnik namenjen realni in uporabni kodi. Hehe.
Drugace pa, novi gcc ima atribut za funkcije s katerim za vsako funkcijo posebej definiras nivo optimizacije. Ohranjas modularno/logicno strukturo in kontroliras kriticne dele hkrati. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Tor Avg 11, 2009 11:41 pm Naslov sporočila: volatile troubles |
|
|
Smo se pa razpisali .
Ja volatile je zelo pomembna zadeva še posebaj pri embedded projektih in kadar pišemo gonilnike.
Kot sem že enkrat napisal in smo že ugotovili na praktičnem primeru, je volatile namenjen globalnim spremenljivkam.
Po mojem je uporaba volatile pri lokalnih spremenljivkah v "twilight zone". Nekateri prevajalniki v takem primeru tudi javijo napako.
Torej jaz mislim da je škoda zgubljat čas z razglabljanjem če je to prav ali ne. Ker se mi zdi da se strinjamo, da je volatile namenjen globalnim spremenljivkam, bi se osredotočil na ta primer uporabe.
Pravilo bi se torej glasilo: Uporabljaj volatile le z globalnimi spremenljivkami.
Če kljub temu pride do težav zaradi optimizacije, pa nemudoma poročat .
LP,G
Nazadnje urejal/a gregoral Tor Avg 11, 2009 11:57 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Avg 11, 2009 11:54 pm Naslov sporočila: Re: volatile troubles |
|
|
gregoral je napisal/a: |
Pravilo bi se torej glasilo: Uporabljaj volatile le z globalnimi spremenljivkami.
|
Pozabil si na tisti i. Ta je lokalen in mora biti obvezno volatile. Nesmiselno je imeti tak tip spremenljivke globalen. Pravzaprav, globalnih spremenljivk naj bo cim manj.
OK, sedaj sem sel se enkrat pogledat primere v clanku, vklucno s asm kodo. Ze dva primera sta mi dala jasno vedeti, da so popolnoma nerealni in ce sem iskren, gre samo za problematiko natacne definicije in interpretacije besede volatile, kar je povzeto proti koncu clanka.
Figure 1: x je konstanta in se po definiciji nima kaj spreminjat, kjerkol kadarkoli. V cem je problem, ce prevajalnik predvidi nesmiselno kodo, saj bo rezulat ne glede na karkoli enak. Pise, da bi se moral x naloziti trikrat. Zakaj, ce bo koncni rezultat enak. Ce mene vprasas, bi to bolj veljalo, da to ni bug, je feature. Podobno Figure 3.
IMHO, bi se zadeva pokazala za drugacno, ce bi bil tudi primer drugacen, realen.
Hja, kdo bo koga. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free.
Nazadnje urejal/a Glitch Sre Avg 12, 2009 12:04 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Sre Avg 12, 2009 12:04 am Naslov sporočila: volatile troubles |
|
|
Uporaba volatile za števec znotraj zanke mi je čudna. Kdaj bi to zares rabil?
Glitch, če v volatile spremenljivko 10x zapišeš isto konstanto tega prevajalnik ne bi smel optimizirat, ker je HW lahko narejen tako, da ob vsakem pisanju na določeno lokacijo recimo nekaj naredi. Tega prevajalnik ne more vedeti, zato ne sme optimizirat.
Mislim pa, da je bil volatile dodan v C kasneje in ni ravno najbolj posrečeno definiran, saj obstaja precej sivih lis v specifikaciji, ki niso natančno določene.
Glede globalnih spremenljivk se strinjam, da se jih je treba izogibat. Samo če je to dejansko kontrolni register, ali pa se spremnljivka uporablja za komunikacijo / sinhronizacijo med main in isp, pa je uporaba smiselna. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Sre Avg 12, 2009 8:34 am Naslov sporočila: Re: volatile troubles |
|
|
gregoral je napisal/a: |
Uporaba volatile za števec znotraj zanke mi je čudna. Kdaj bi to zares rabil?
Glitch, če v volatile spremenljivko 10x zapišeš isto konstanto tega prevajalnik ne bi smel optimizirat, ker je HW lahko narejen tako, da ob vsakem pisanju na določeno lokacijo recimo nekaj naredi. Tega prevajalnik ne more vedeti, zato ne sme optimizirat.
|
To je res in na to nisem pomislil oz. sem povrsno prebral alesev post od prej.
alessio je napisal/a: |
Če si predstavljaš, da bi bil to lahko data register od recimo UART periferije, |
Prevec ozko sem gledal na problem. Videl sem le neko "nepomembno" lokacijo v pomnilniku oz. delovnem registru. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
gregoral Član

Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.04 Kraj: Ljubljana
|
Objavljeno: Sre Avg 12, 2009 9:05 am Naslov sporočila: volatile troubles |
|
|
Zdravo!
Jaz res ne vem kdaj bi bilo dobro imeti števec v zanki volatile:
Koda: |
int volatile i;
for(i = 0; i < 9999; i++) { ... } |
Ali ve kdo za realen primer kjer bi to potrebovali? |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Sre Avg 12, 2009 9:11 am Naslov sporočila: |
|
|
Podobno kot prejsni problemi. Vzami primer, ko v zanki samo nekaj preverjas in ne zelis neskoncnega izvajanja oz. zelis imeti stevec dogodkov, spremenljivka v zanki pa je taksna kot je in nimas kontrole nad njo.
Ampak ne zelim povedati, da i mora biti volatile. So samo doloceni primeri, ki pomagajo, da zadeve ne zoptimizira. Odvisno od sistema in prevajalnika, v dolocenih primerih bo i namesto v registru postavljen nekam v pomnilnik. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|