forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Jak umístit proměnnou na absolutní adresu v AVR+GCC ?
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR
 
pyrin
Nováček
Nováček


Založen: 19.4.2011
Příspěvky: 8

PříspěvekZaslal: 19 duben 2011, 14:49    Předmět: Jak umístit proměnnou na absolutní adresu v AVR+GCC ? Citovat

Nějak mi to nejde, poradí někdo jak na to ? Mám třeba pole 32 bajtů a ty bych chtěl mít v RAM třeba od adresy 0x0050. Potom bych chtěl mít třeba proměnou dvoubajtovou a tu bych chtěl mít třeba v RAM na adrese 0x0040. Předpokládám, že mám procesor, který má dostatečnou kapacitu RAM.
pyrin
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
piityy
Profesionál
Profesionál


Založen: 1.4.2008
Příspěvky: 2139

PříspěvekZaslal: 19 duben 2011, 18:22    Předmět: Citovat

Jaký by to mělo smysl?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Technik
Anonymní





PříspěvekZaslal: 19 duben 2011, 20:42    Předmět: Re: Jak umístit proměnnou na absolutní adresu v AVR+GCC ? Citovat

Můžeš to zkusit nadeklarovat jako periférii.
Návrat nahoru
 

 
pyrin
Nováček
Nováček


Založen: 19.4.2011
Příspěvky: 8

PříspěvekZaslal: 20 duben 2011, 7:53    Předmět: Citovat

Smysl to má v tom, že pokud kouknu třeba sériovou linkou do oblasti, kde předpokládám, že ta proměnná je, tak tam taky je a nemusím jí hledat. A mám jí pořád na stejném místě.
pyrin
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
piityy
Profesionál
Profesionál


Založen: 1.4.2008
Příspěvky: 2139

PříspěvekZaslal: 20 duben 2011, 8:43    Předmět: Citovat

K tomu nevidím žádný důvod. Jesli ti jde o ladění, tak to se dá zařídit i bez toho a na všechno ostatní(určitě včetně DMA na xmeze) stačej pointery nebo globální proměnná.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
pyrin
Nováček
Nováček


Založen: 19.4.2011
Příspěvky: 8

PříspěvekZaslal: 20 duben 2011, 12:17    Předmět: Citovat

Mno pokud v tom nevidíš důvod, tak já ano. Protože pokud mám stovky různých aplikací a v nich mám určité proměnné, které jsou pro všechny aplikace stejné a potom proměnné, které jsou svázány pouze s danou aplikací, tak proč bych měl hledat ty stejné proměnné na různých místech ? Hlavně jde o to, že mám pro sériovou linku aplikaci na PC a pokud tedy obsluha chce změnit třeba žádanou teplotu, tak jak to té aplikaci v procesoru řeknu ? Dnes mám v aplikaci, že žádaná hodnota je na určité adrese a fidli basta. Může k tomu přjít kdejakej Pepík nebo Jarin a klepne na talčítko a má hodnotu. Pokud budu mít proměnnou v každé aplikaci jinde, tak toho jednoduše nedosáhnu. Navíc mám třeba pole, kde mám nasázené teploty a to se periodicky vyčítá pro kalibraci. Kalibrační konstanty se zapisují též na absolutní adresu ale do EEPROM. Potom bych vždy musel jít do překladače, podívat se kam mi to šoupne a adresu zapsat do PC a následně překalibrovat. Nebo naopak, potřebuji se podívat, proč mi to špatně měří a tak kouknu na kalibrační konstanty, protože jsou pořád na svém stejném místě a to ve všech aplikacích, tak nemusím jít do linkru a hledat, kde jsou. Tak proto. pyrin
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
DragonSoul
Profesionál
Profesionál


Založen: 4.3.2010
Příspěvky: 521
Bydliště: Praha

PříspěvekZaslal: 20 duben 2011, 13:26    Předmět: Citovat

Taky to moc nechapu...
Z PC posilas do uC po seriovem portu retezec "SET SP_TEMP1 22.5" a uC si to prechrousta jak chce. Potom posles retezec "GET TEMP1" a uC ti to posle. Nevidim nikde problem s vycitanim nejake adresu. Pokud to mas dobre udelane funguje to pro jakykoliv uC, staci jenom prelozit program pro prislusny porcesor.

_________________
Hodne se ucim (delam hodne chyb).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
kuto
Profesionál
Profesionál


Založen: 13.7.2010
Příspěvky: 121
Bydliště: Varnsdorf

PříspěvekZaslal: 20 duben 2011, 13:30    Předmět: Citovat

Podle me na to nejdes nejstastnejsim zpusobem. Drbani levou rukou za pravych uchem Smile Pokud komunikujes softwarem z PC pres seriak, tak je lepsi mit nejaky komunikacni protokol. PC nejdriv zasle pozadavek co chce a mcu mu vrati vysledek at lezi kdekoli. PC nemusi o umisteni promenne nic vedet, dokonce ani jestli lezi v ram nebo eeprom. Napr. prvni byte z pc znamena zadost o kalibracni hodnotu a druhy specifikuje kterou (jeji poradove cislo, nazev a pod.). Nebo textove retezce viz. predchozi prispevek. Pak uz si mcu vytahne spravnou hodnotu a posle ji zpet. Pak tenhle protokol musi umet mcu i pc samozrejme.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Divous
Profesionál
Profesionál


Založen: 24.4.2009
Příspěvky: 226
Bydliště: Valašsko

PříspěvekZaslal: 20 duben 2011, 13:37    Předmět: Citovat

Kdysi dávno jsem se o to samé také pokoušel,
ale taktéž bezvýsledně.
GCC prostě tyto "triky" nepodporuje.

_________________
AVR Studio 4.18 + WinAVR, AVR Studio 6.2
Elnec T51prog, ASIX PRESTO, AVR MKII
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Divous
Profesionál
Profesionál


Založen: 24.4.2009
Příspěvky: 226
Bydliště: Valašsko

PříspěvekZaslal: 20 duben 2011, 13:49    Předmět: Citovat

OPRAVA!!!!

Podařilo, ale stejně mi to bylo houby platné.
Můžeš definovat kam umístíš celý blok (funkci),
nikoliv samostatnou proměnnou.

Postup je jednoduchý.
Někam za globální proměnné musíš deklarovat funkci následujícím způsobem:

kód:

void MyBoot(void) BOOTLOADER_SECTION;


BOOTLOADER_SECTION pochází z knihovny boot.h,
takže si to můžeš najít.

_________________
AVR Studio 4.18 + WinAVR, AVR Studio 6.2
Elnec T51prog, ASIX PRESTO, AVR MKII
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
piityy
Profesionál
Profesionál


Založen: 1.4.2008
Příspěvky: 2139

PříspěvekZaslal: 20 duben 2011, 14:34    Předmět: Citovat

pyrin: Vymýšlíš s prominutím nesmysly. Ty z PC posíláš adresu do RAM a hodnotu pro zapsání??? Tobě asi moc o funkčnost programu nejde, jinak si to nedovedu vysvětlit. PC se v žádném případě nemá co vrtat v prostředcích mcu. To je takový problém z pc poslat příkaz "nastav teplotu" a v mcu, když ten příkaz přijmeš, nastavit hodnotu proměnné "teplota"? Konstrukce, kterou popisuješ, je velmi nevhodná a může být pro HW(pokud né pro životy lidí) velmi nebezpečná. Právě z toho důvodu, že "přijde pepík..." povrtá ti něco v ram a v lepším případě hw pouze skolabuje. Navíc pokud jsi vymyslel řešení tohoto typu, tak nečekám ani žádné kvalitní zabezpečení přenosu proti chybám.

Pokud trváš na určité formě adresace, tak si vytvoř pole a posílej si pouze indexy do něho, né adresy do RAM.

Co se týká přístupu do eeprom, je to úplně stejné. MCU ví, kde data má. PCéčku do toho ale vůbec nic není. Prostě pošli balík dat a mcu si s nima musí poradit sám. Tedy přesněji programátor musí zařídit aby si poradil.

Přímý přístup do paměti má jediné ospravedlnění pokud vím. Tím je ladění programu.

Divous napsal:
GCC prostě tyto "triky" nepodporuje.

Nemá k tomu důvod stejně tak jako jiné překladače.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Anonymní






PříspěvekZaslal: 20 duben 2011, 18:03    Předmět: Citovat

piityy napsal:
Přímý přístup do paměti má jediné ospravedlnění pokud vím. Tím je ladění programu.


Ani to ladenie nieje dovod. Ak treba tak potom JTAG alebo nieco podobne.
Kto (programator) ma ako strazit aby KAZDA premenna bola na konkretnej adrese?

Na prenos je vhodny napriklad protokol MODBUS.
Alebo hociaky iny, kde na zaciatku bude 1B prikaz (RD/WR) potom 2B subadresa (index do pola udajov) a 1B pocet prenasanych bajtov. Na konci spravy urcite daj aspon jednouchu kontrolnu sumu z dvoch bajtov. Niektore indexy mozu byt v RAM, ine indexy v EEPROM a niektore ine zase vo Flash, PC to nemusi vobec rozlisovat. Alebo si to rozlisuj v prvom bajte kde prenasas info ci RD alebo WR. Este tam je 7 bitov volnych.
Aj teraz predsa musis mcu povedat, z akej adresy a kolko bajtov sa ma posielat.
protokoly typu "POSLI_TEPLOTU1" Ti z celeho srdca neodporucam. Su velmi pomale, a text nenesie absolutne ziadnu pridanu hodnotu, akurat Ti komplikuje dekodovanie prijatej spravy velmi zlozitym parserovanim. Ak si spravis dalsie zariadenie musis v nom dorobit aj dalsiu cast parseru a dekodovanie dalsich vyziev k zapisu alebo k nacitaniu. Index do pola je jednoduchy a prakticky.

Subadresa je index do pola. Pole si pavidelne refresujes a tak vidis (napr. pole o velkosti 128B mozes do PC posielat castejsie ako 80x za sekundu 115200Bd, to uz zmeny hodnot pomaly ani ludske oko nezachyti), co sa Ti v systeme deje. Do pola si mozes kludne kopirovat na Tebou vybrane indexy aj obsah HW registrov.

No a este si mozes cisto do Flash ulozit tabulku kde prvy stlpec bude nazov premennej (napr. pevne 16B pole), v druhom bude jej index a v tretom bude atribut, ci PC moze na dany index aj zapisovat, alebo iba z neho citat. Potom Tvoj sw v PC moze automaticky zobrazit hodnoty a priradit im texty. Lebo ved ked Jozko/Janko/Ferko k programu sadne, odkial ma vediet na ktorom mieste je co?

Po spusteni SW sa tento najpr spyta na nazvy premennych a potom ich pravidelne nacitava a zobrazuje. K takemu sw do PC sa lahko spravi nejaky subor INI, v ktorom bude definovane, co sa ma na obrazovke kde zobrazovat.
Návrat nahoru
 

 
pyrin
Nováček
Nováček


Založen: 19.4.2011
Příspěvky: 8

PříspěvekZaslal: 20 duben 2011, 18:35    Předmět: Citovat

No nic, vidím, že jedině můj názor na věc je špatný. Netvrdil jsem, že všechny proměnné chci absolutně adresované. Chci jen ty, které mně zajímají. A vím proč to chci, ne každý má dostatečné nástroje, které mu umožňují prakticky cokoliv. Nesnažím se na AVR udělat operační systém typu Win, u kterýho se člověk musí modlit, aby nemusel vědět, co kde hledat, protože mu nepomůže ani svěcená voda.
Jestliže mám stejný systém pracující na 51 KEIL bez problémů, protože každej Pepík nebo Jarin je schopen mačkat tlačítko ve vokně na PC a nezajímá ho, že to tlačítko vyprdí na sériovku žádost o konkrétní dato z konkrétní buňky, tak jen chci stejného principu dosáhnout na AVR, ale jak to vidím, s GCC to tak nepůjde.
Jinak nevidím důvod proč nemít nad aplikací absolutní kontrolu a vědět co se kam umístí. Potom si mohu dovolit do toho hrabat bez následků.
Naopak vidím dost neohrabané posílat sériovkou příkaz typu "posli mi teplotu".
O protokolech a zabezpečení toho taky něco málo vím a modbus už jsem taky aplikoval. Nicméně právě proto, že modbus není z mého pohledu dost univerzální, tak jej nepoužívám.

Jinak nepotřebuju aby jakýkoliv uživatel věděl co na jaké adrese je, protože to má v konfiguračním souboru PC programu. A právě v tom je ta síla, že každý uživatel si může otevřít svojí aplikaci a načte se mu automaticky jeho konfiguračn soubor a zobrazí se mu právě jeho data. Konfigurák je obyčejný texťák, kde se říká o typu proměnné, adrese umístění, rozsahu, aditivní a multiplikativní konstantě a popis.
Nicméně můj názor se nemusí nutně shodovat s názory ostatních.
pyrin
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
piityy
Profesionál
Profesionál


Založen: 1.4.2008
Příspěvky: 2139

PříspěvekZaslal: 20 duben 2011, 20:32    Předmět: Citovat

Posílat jako příkaz řetězec by neohrabané bylo. Ovšem každý průměrně inteligentní bernardýn si jednotlivé příkazy nějakým způsobem označí a posílá jako identifikaci příkazu třeba jen 1 byte nebo i jen pár bitů což zajisté víš/umíš.

Když spustíš na PC program, také tě zajímá od které adresy v RAM se nachází? (Zajímat tě to může, ale k ničemu to nepotřebuješ). Když stahuješ soubor z netu, taky se server zajímá o číslo sekoru, na kterém bude soubor uložen nebo se pc zajímá o sektor na serveru?
V žádném případě. Je to totiž problém každého zařízení a jinému do toho nic není.
Jediné co potřebují komunikující stroje znát je formát dat.
Ve tvém případě je to úplně stejné.

Ale abysme vypotili alespoň něco konstruktivního když tě nepřesvědčíme o nevhodnosti tvého přístupu (nebo např. nemožnosti ho změnit z důvodu nutnosti změny pc sw).
S tvým požadavkem ti neporadím, ale můžeš tedy ty adresy použít pro identifikaci proměnné bez ohledu na to, kde se skutečně nachází.
Pokud mají všechny stejnou bitovou šířku, stačí pole a adresy po odečtení offsetu používat jako indexy.
Jesli jsou různě velké, naskládat proměnné do struktury.
Vytvořit pointer a do něho vložit adresu struktury. Potom už stejně jako u pole přičítat adresy (po odečtení offsetu) k pointeru a pracovat již s ram.
Offset: pokud jsou na x51 data např. od adresy 0x50, tak offset bude tato první adresa.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Martin
ATmega pouzivatel
ATmega pouzivatel


Založen: 5.1.2008
Příspěvky: 1496

PříspěvekZaslal: 20 duben 2011, 23:18    Předmět: Citovat

pyrin napsal:
No nic, vidím, že jedině můj názor na věc je špatný.


To nikto netvrdi Smile
Iba sa Ti snazime vysvetlit, ze to co potrebujes je jednoducho dosiahnutelne standartnymi postupmi. To, ze nejaky Jarin vie mackat tlacitko v PC a zaroven hovoris, ze nemusi vediet kde co je, nejako som nepochopil vyhodu absolutneho adresovania voci indexovanemu. Iba ze by bol este nejaky iny zatial utajeny dovod.

Ak uz predsa len chces vediet nastavit adresu premennej skus sa pohrat s "Project options" -> "Memory settings"

Volakedy som nieco take ako Ty chces skusal a tadialto sa to nejako dalo. Ale bolo to davno a nastastie som skoro pochopil, ze tadialto cesta nie je to prave orechove. Ale asi si si na to zvykol a chyba Ti to Smile
Treba sa ale este prehrabat cez nejake headre a dalsie info o GCC. GCC Ti vie inak okrem ineho poskytnut adresu konkretneho miesta v programe pomocou ukazatela na adresu &&navestie co s vyhodou vyuzivam.

Na druhej strane sa skus inspirovat, ako su zadefinovane adresy HW registrov. Tie su na pevnych dopredu danych adresach, tak to nejako okopci a zmen si pripadne hodnoty adries.

napriklad:
kód:

#define PCMSK2   _SFR_MEM8(0x6D)


bude asi malo veci, ktore by GCC nevedelo, ale ako vidis tebou vyzadovany postup sa mnohym javi ako nie vhodny.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR Časy uváděny v GMT + 2 hodiny
Jdi na stránku 1, 2  Další
 
Strana 1 z 2
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můž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.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2018 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)