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 Předchozí  1, 2
 
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
rnbw



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

PříspěvekZaslal: čt červen 05 2008, 16:27    Předmět: Citovat

AT91PS_PMC bude ta struktura.

Ten #define znamena, ze preprocesor kazdy vyskyt symbolu
kód:
AT91C_BASE_PMC

zmeni na
kód:
((AT91PS_PMC) 0xFFFFFC00)

takze riadok
kód:
AT91C_BASE_PMC -> PMC_PCER = 1<<AT91C_ID_UDP;

zmeni na
kód:
((AT91PS_PMC) 0xFFFFFC00) -> PMC_PCER = 1<<AT91C_ID_UDP;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



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

PříspěvekZaslal: pá červen 06 2008, 7:39    Předmět: Citovat

Tak jsem si to promyslel a i něco našel: http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html

Takže ten můj způsob 1 by šel taky, protože by překladač předpokládal, že ta adresa registru se může změnit, takže by ho četl znova, ale výsledek by nebyl optimální. Správné řešení je říci, že hodnota v tom registru se může změnit. A to jde udělat tak, že se volatile napíše do definice té struktury přímo k té položce PCM_PCER. Asi nějak takhle:

typedef struct
{
volatile int PMC_PCER;
...
} *AT91PS_PMC;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
rnbw



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

PříspěvekZaslal: pá červen 06 2008, 7:57    Předmět: Citovat

Ano, to vyzera dobre. Bolo by vhodne prelozit kratky kod a pozriet sa na vysledok disassemblerom.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



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

PříspěvekZaslal: pá červen 06 2008, 8:31    Předmět: Citovat

Teda, někdy je možná třeba tu strukturu použít i jinak, třeba pro kopii hodnot registrů, a tam to volatile nechci. Pak by to šlo třeba takhle:

typedef struct
{
int a;
} STRUKTURA;

#define IO ( (volatile STRUKTURA *) 0xABCDE )

void f(void)
{
STRUKTURA zaloha;
IO->a = zaloha.a;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
anonym






PříspěvekZaslal: pá červen 06 2008, 9:52    Předmět: Citovat

piitr napsal(a):
Tak jsem si to promyslel a i něco našel: http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html

Takže ten můj způsob 1 by šel taky, protože by překladač předpokládal, že ta adresa registru se může změnit, takže by ho četl znova, ale výsledek by nebyl optimální. Správné řešení je říci, že hodnota v tom registru se může změnit. A to jde udělat tak, že se volatile napíše do definice té struktury přímo k té položce PCM_PCER. Asi nějak takhle:

typedef struct
{
volatile int PMC_PCER;
...
} *AT91PS_PMC;


Přesně je to tam definováno takto:
kód:

typedef volatile unsigned int AT91_REG;// Hardware register definition

typedef struct _AT91S_PMC {
....
   AT91_REG    PMC_PCER;    // Peripheral Clock Enable Register
   AT91_REG    PMC_PCDR;    // Peripheral Clock Disable Register
....
} AT91S_PMC, *AT91PS_PMC;

Takže je to volatile a přesto to nefunguje Sad
Návrat nahoru
piitr



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

PříspěvekZaslal: pá červen 06 2008, 10:22    Předmět: Citovat

Hmm, to mi přijde dobře napsané. Alespoň podle té dokumentace.
Takže je to asi chyba překladače.
Nebo možná jede ten překladač podle nějaké starší specifikace, kde se to volatile nesmí používat tak bohatě. Možná je to blbost, ale mám dojem že to céčko se taky nějak postupně vyvíjelo a doplňovalo. Nevím. Já jsem tyhle věci vždy řešil v assembleru nebo funkcema outp() a tak.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
piitr



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

PříspěvekZaslal: pá červen 06 2008, 10:30    Předmět: Citovat

Teda, předpokládám, že to AT91C_BASE_UDP -> UDP_TXVC je definováno taky tak.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Jak21
Neregistrovaný





PříspěvekZaslal: pá červen 06 2008, 11:12    Předmět: Citovat

citace:
AT91C_BASE_PMC -> PMC_PCER = 1<<AT91C_ID_UDP;
#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address

Takže struktura je umístěná na pevné adrese 0xfffffc00?
To je víc než 4 miliardy.
Návrat nahoru
anonym






PříspěvekZaslal: pá červen 06 2008, 11:19    Předmět: Citovat

Jak21 napsal(a):
citace:
AT91C_BASE_PMC -> PMC_PCER = 1<<AT91C_ID_UDP;
#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address

Takže struktura je umístěná na pevné adrese 0xfffffc00?
To je víc než 4 miliardy.

ARM7 má adresní prostor 4GB a periferie jsou u AT91SAM7 na konci.
Návrat nahoru
piitr



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

PříspěvekZaslal: pá červen 06 2008, 12:19    Předmět: Citovat

Jenom pro jistotu: Je to AT91C_BASE_UDP -> UDP_TXVC taky volatile?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
anonym






PříspěvekZaslal: pá červen 06 2008, 13:04    Předmět: Citovat

piitr napsal(a):
Jenom pro jistotu: Je to AT91C_BASE_UDP -> UDP_TXVC taky volatile?

Ano, je to stejné, všechny ty struktury jsou složené z AT91_REG a ten je volatile.
Návrat nahoru
piitr



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

PříspěvekZaslal: pá červen 06 2008, 14:36    Předmět: Citovat

V tom případě si myslím, že to je chyba překladače. To je dost mrzuté.
Možná bych zkusil:
#define AT91C_BASE_PMC ((volatile AT91S_PMC *) 0xFFFFFC00)
Pokud to zapomíná v tom typedef nebo to nemá rád ve strukturách, tak by to mohlo pomoci.
Jinak nevím.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Jak21
Neregistrovaný





PříspěvekZaslal: so červen 07 2008, 20:50    Předmět: Citovat

Tento problém mne zneklidňuje.
Doposud jsem si myslel, že optimizátor může vynechat část kódu, ale že by přehodil pořadí příkazů, to je podle mne nepřípustné.

Zkusil bych (jenom pro test) vložit mezi příkazy krátký delay.

Stálo by za to poslat dotaz na http://www.avrfreaks.net/index.php?name=PNphpBB2&file=index
kde odpovídají experti na překladače.
Návrat nahoru
Fojtik



Založen: Jan 26, 2007
Příspěvky: 31

PříspěvekZaslal: po červenec 14 2008, 21:32    Předmět: Citovat

No jeste upresnim Wink - volatile se pouziva nejen pro staticke promenne, ale pro veskere typy promennych.

A jeste jeden napad - vy jste resili jen jednu stranu.

Co takhle resit i tu druhou:
volatile int i = 1<<AT91C_ID_UDP;
AT91C_BASE_PMC -> PMC_PCER = i;

Tohle se zcela jiste nezoptimalizuje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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 Předchozí  1, 2
Strana 2 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.17 sekund