Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

_volatile_
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: pá květen 30 2008, 19:05    Předmět: _volatile_ Citovat

Mám dotaz na Cčkové programátory. Před časem se jako OT v jiném vlákně řešilo cosi o programování. Zmínila jsem tam, že přítel hledal několik hodin chybu způsobenou optimalizací gcc překladače. Překladač prohodil pořadí příkazů. A
Martin_ napsal(a):
A to "přítel" nezná direktivu _volatile_ ??? Asi ne ...

Znamená to že jde udělat volatile i kód? Jak se to zapíše?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jak21
Neregistrovaný





PříspěvekZaslal: ne červen 01 2008, 20:44    Předmět: Citovat

Slovo Volatile se používá při deklaraci globálních proměnných (případně ještě pointrů na ně).
Nařizuje optimizátoru, aby neměnil kód obsahující tuto proměnnou.
Typický příklad je globální proměnná, která se mění v obsluze přerušení.

Ale i bez přerušení hrozí někdy že optimizátor vyřadí kód, např. tuto časovou smyčku FOR:
kód:

int i;
main()
{

for (i=1; i<1000; i++)
       ;
}

Optimizátoru se zdá, že tento kód "nic nedělá".

Je na úsudku programátora, které proměnné označit jako volatile.
Pokud bychom tedy chtěli mít celý kód "volatile", označíme preventivně jako volatile všechny glob. proměnné.
To je ale špatně, protože tím silně omezíme optimizátor.

To je můj pohled na "volatile", doufám, že se příliš nemýlím.
Návrat nahoru
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: po červen 02 2008, 12:40    Předmět: Citovat

Abych to konkretizovala, jednalo se na ARMu o zapnutí hodin pro USB, zápis do řídicího registru USB a vypnutí hodin pro USB.

AT91C_BASE_PMC -> PMC_PCER = 1<<AT91C_ID_UDP;

AT91C_BASE_UDP -> UDP_TXVC = AT91C_UDP_TXVDIS;

AT91C_BASE_PMC -> PMC_PCDR = 1<<AT91C_ID_UDP;

C to zoptimalizovalo tak, že prohodilo první dva příkazy. A protože při zápisu do USB musí běžet hodiny, tak to nefungovalo. Jde v tomto konkrétním případě vysvětlit překladači, aby při optimalizaci neprohazoval příkazy?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mihal



Založen: Apr 06, 2005
Příspěvky: 1839
Bydliště: Zilina

PříspěvekZaslal: po červen 02 2008, 13:42    Předmět: Citovat

Prekladac by mal umoznit optimalization level = 0, ak to ani v tomto pripade nepomoze tak bude chyba v prekladaci. Niektore prekladace je mozne konfigurovat na rychlost kodu aj na dlzku. Ak by som postupne nastavoval flagy v jedinom registri, tak sa stavim ze v kode budu nastavene naraz uz pri minimalnej optimalizacii. Uz preto pouzivam zasadne nulovu optimalizaciu. O cakacich sluckach nehovoriac.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: po červen 02 2008, 16:14    Předmět: Citovat

Ale ten kod má být rychlý, krátký a funkční. S optimalizací je krátký a rychlý ale nefunguje, bez optimalizace je funkční ale nepoužitelně pomalý a dlouhý. V assembleru lze splnit všechny tři podmínky, ale bylo mi vysvětleno, že assembler je přežitek, tak by mě zajímalo jak ty tři podmínky splnit v Cčku.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MiLe



Založen: Oct 18, 2005
Příspěvky: 123

PříspěvekZaslal: út červen 03 2008, 7:07    Předmět: Citovat

Podla mna assembler nieje prezitok. Stale sa najdu aplikacie (vyzera to tak ze aj ta tvoja) kde je najlepsim riesenim... A bude ti to robit presne to, co si naprogramujes a nie to co ti z Cckoveho kodu spravi optimalizer...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mihal



Založen: Apr 06, 2005
Příspěvky: 1839
Bydliště: Zilina

PříspěvekZaslal: út červen 03 2008, 7:43    Předmět: Citovat

Program v C sa este da zrychlit hodinami procesoru Wink no vazne, mam pripad a bezne sa to aj pouziva, kde koli spotrebe bezim na 32kHz, a ked potrebujem rychlost, zapinam DCO na 16mega Cool
V prípade, ked potrebujem mat rozsiahly program v C a urcite jeho casti su kriticke na cas spracovania, tak tie pisem v asm. Pri doslednej analyze situacie na zaciatku navrhu je potrebne volit aj vhodny pamatovy priestor, aby potom nebolo nutne premyslat nad kazdym bytom. Struktura programu ma tak isto velky vplyv na rychlost, treba sa vyvarovat napr. sw emulacie uartu a pod. Asi nie moc vhodny bude C pri programe pre prijem FSK radia, kde zalezi na kazdej us, naopak, asm by som urcite nevolil napr. pri FFT. Ale nakoniec aj tak zalezi hlavne na x-faktore (stabilita zadania, cas,zakaznik).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: út červen 03 2008, 12:35    Předmět: Citovat

mihal napsal(a):
Program v C sa este da zrychlit hodinami procesoru Wink no vazne, mam pripad a bezne sa to aj pouziva, kde koli spotrebe bezim na 32kHz, a ked potrebujem rychlost, zapinam DCO na 16mega Cool

Aneb, když je program pomalý, potřebujete rychlejší počítač Sad To je rada nad zlato.

To všechno jsou známé obecné věci. Mě by zajímala odpověď toho Martina_ co rejpal do mého přítele, že nezná _volatile_, nebo co na to třeba panové mtajovsky a piitr, když ohrnovali nos nad assemblerem a tvrdili, že v C to je jen o 25% pomalejší/delší. Co vy na to?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 34053
Bydliště: Bratislava

PříspěvekZaslal: út červen 03 2008, 14:48    Předmět: Citovat

Ako je deklarovane AT91C_BASE_PMC? Tam asi treba pridat volatile.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: út červen 03 2008, 16:06    Předmět: Citovat

rnbw napsal(a):
Ako je deklarovane AT91C_BASE_PMC? Tam asi treba pridat volatile.

#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
masar



Založen: Dec 03, 2005
Příspěvky: 12541

PříspěvekZaslal: út červen 03 2008, 16:54    Předmět: Citovat

...už se konflikt připravuje k vyhrocení,
panna bledá dva nožejčky hledá...

Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: út červen 03 2008, 17:11    Předmět: Citovat

Je hezké že ses přemohl
napsat krátkou ódu
lepší kdybys pomohl
rozchodit kus kódu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
anonym






PříspěvekZaslal: čt červen 05 2008, 6:53    Předmět: Citovat

citace:
Prekladac by mal umoznit optimalization level = 0, ak to ani v tomto pripade nepomoze tak bude chyba v prekladaci.

Překladač to jistě umožňuje, ale optimalizace je přece jedna z nejsilnějších vlastností překladače. Ve Winavr např. může zkrátit kód až třeba na polovinu.
Vzdát se jí je podobné jako strčit do F jedničky motor z trabanta.

V krajním případě bych kritickou část kódu ve formě funkce umístil do zvláštního .c souboru. Pak bych .c soubory kompiloval odděleně, tento bez optimalizace, všechny ostatní s plnou optimalizací.
Návrat nahoru
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: čt červen 05 2008, 10:21    Předmět: Citovat

Je pravda, že tady asi to volatile není moc k čemu napsat. Vidím asi tyto možnosti:
1) To AT91C_BASE_PMC nedefinovat pomocí define, ale jako globální proměnnou s konstantní hodnotou, a tu definovat jako volatile. Nevím ale jistě, že to pomůže, já s tím volatile moc nedělám. Taky ten kód asi nebude tak hezký a rychlý. To bych asi nepreferoval.
2) Do HW registrů zapisovat pomocí speciální fukce, třeba output(addr, value), která bude definována v jiném modulu a ke kódu se pak až přilinkuje. Pak nemá překladač šanci optimalizovat. Tohle bych udělal tehdy, pokud mi nejde o rychlost, ale chci to mít vážně celé v C.
3) Tu část kódu, která píše do HW registrů napsat v assembleru, zbytek v C a mezi tím udělat nějaké rozumné rozhraní. Nějak rozdělit zodpovědnosti. Pak to celé slinkovat. To bych použil, pokud mi jde o tu rychlost. Někdy je to i přehlednější než možnost (2).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Jak21
Neregistrovaný





PříspěvekZaslal: čt červen 05 2008, 14:38    Předmět: Citovat

Ten příklad mi není jasný.
citace:
AT91C_BASE_PMC -> PMC_PCER = 1<<AT91C_ID_UDP;
Tady je AT91C_BASE_PMC použito jako ukazatel na nějakou strukturu
citace:
#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00)
ale tady je totéž deklarováno jako konstanta.
???
Návrat nahoru
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.59 sekund