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 

Optimizacija algoritma / zanke
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Avg 11, 2009 9:46 pm    Naslov sporočila:   Odgovori s citatom

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

Mr. Green


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



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 11, 2009 9:52 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 11, 2009 9:53 pm    Naslov sporočila:   Odgovori s citatom

OK, Glitch, očitno prihaja do race condition-ov. Mr. Green
_________________
Question is more important than the answer.(Plato)
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Avg 11, 2009 10:00 pm    Naslov sporočila:   Odgovori s citatom

Speak to the hand (to je semafor)

oz.
Koda:

xSemaphoreHandle xSemaphore;

void vATask( void * pvParameters )

    vSemaphoreCreateBinary( xSemaphore );

    if( xSemaphore != NULL )
    {
    }
}


Mr. Green


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



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 11, 2009 10:17 pm    Naslov sporočila:   Odgovori s citatom

Glitch je napisal/a:
Speak to the hand (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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Avg 11, 2009 10:21 pm    Naslov sporočila:   Odgovori s citatom

Hm... Mr. Green Mr. Green 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 11, 2009 10:32 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Avg 11, 2009 11:07 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Avg 11, 2009 11:13 pm    Naslov sporočila:   Odgovori s citatom

Sem pogledal ja. Zanimivo branje, ni kaj. To moram pokazat nekomu, ki je strasno obcutljiv na gcc tematiko Mr. Green

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 Smile

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 Smile 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Tor Avg 11, 2009 11:41 pm    Naslov sporočila:  volatile troubles Odgovori s citatom

Smo se pa razpisali Smile.

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 Smile.

LP,G


Nazadnje urejal/a gregoral Tor Avg 11, 2009 11:57 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Avg 11, 2009 11:54 pm    Naslov sporočila:  Re: volatile troubles Odgovori s citatom

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



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Sre Avg 12, 2009 12:04 am    Naslov sporočila:  volatile troubles Odgovori s citatom

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



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Sre Avg 12, 2009 8:34 am    Naslov sporočila:  Re: volatile troubles Odgovori s citatom

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,

Brick wall d'oh!

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



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.04
Kraj: Ljubljana

PrispevekObjavljeno: Sre Avg 12, 2009 9:05 am    Naslov sporočila:  volatile troubles Odgovori s citatom

Zdravo!

Jaz res ne vem Think 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Sre Avg 12, 2009 9:11 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
Stran 2 od 3

 
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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group