Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   176 / 840
(#) Ballage válasza janyjozsef hozzászólására (») Jan 10, 2010 /
 

Idézet:
„Nem inline! Hiszen várakozás. Miért legyen gyors?”


Bocsánat, nem szőrszálhasogatásként mondom, de adott esetben igenis van értelme a késleltetést inline függvényként fordítani!

Az inlining ugye arra jó, hogy a paraméterátadás/hívás/veremfoglalás/felszabadítás/visszatérés adminisztrációjával járó pluszmunkát kiiktassa egy függvénynél. Ez ugyan nem túl sok, de mégis nem nulla időt igényel, ami minden egyes híváskor hozzáadódik a függvényben eltöltött időhöz. Van amikor ez elhanyagolható, gyors függvények esetén azonban ez számottevő lehet (ezért is találták ki).

Egy _pontos_ időzítőfüggvénytől azt várjuk el, hogy benne a MCU n*m időt töltsön, 'n' a függvény paramétere, 'm' az időzítő felbontása, pl. 100 ns. Egy nem inline időzítőrutin viszont n*m + a időt vesz igénybe, ahol az 'a' a pluszadminisztráció ideje. Ha 'a' összemérhető n*m-el, akkor ennek az elvárásnak nem tesz eleget a függvényünk. Ekkor már csak azt mondhatjuk, hogy a függvény _legalább_ annyi időt emészt fel, mint amit a paraméter alapján megszabtunk, ami lényeges eltérés az elsőhöz képest! Pl., maradva a fenti felbontásnál, ha az adminisztráció ideje a=80 ns, akkor egy n=2 paraméter által megadott 200 ns időzítés helyettt 280 ns időt fog eltölteni a MCU a feldolgozással, ami 40%-os eltérés a kettő között!

Röviden, a pluszteher kiiktatásával tehát más követelményeknek tesz eleget a késleltetőrutin. Attól függően, hogy milyen működést vársz el tőle, úgy kell inlininggel vagy anélkül fordítanod a függvényedet.

Persze szép az elmélet, az igazság az, hogy az inline függvény is igényelhet járulékos adminisztrációt, és ráadásul a fordítótól függ, hogy mennyit, tehát nincs ráhatásunk, viszont az szinte biztos, hogy sokkal kisebb teherrel jár.

Szólottam. Uff!
(#) janyjozsef válasza Ballage hozzászólására (») Jan 10, 2010 /
 
Igazad van!

Amikor 1Wire RAM-ot használtam pontos időzítés kellett és ott így ment.

Viszont az említett példában egy buzzer csipogási idejét kellett meghatározni, ahol néhány us vagy ms nem volt lényeg.
És mivel sok helyen kellett csipogni...
(#) trudnai válasza Ballage hozzászólására (») Jan 10, 2010 /
 
Bocsanat, hogy en is kozbe kotyogok, de az inline kulcsszo csak egy jelzes a forditonak, hogy a fuggveny ha lehetseges inline-kent legyen forditva. De ettol fuggetlenul meg a fordito donthet ugy, hogy a fuggveny normal fuggveny lesz. Ha mindenkeppen inline kell, akkor jobb bemakrozni inkabb...
(#) gtk válasza trudnai hozzászólására (») Jan 11, 2010 /
 
Na pontosan ez az amiert en nem hasznalok inlinet, inkabb makrot. Igazabol nem is ertem ezt a -- jolenne ha a hivashoz beforditanad, de ha megsem, az sem gond -- dolgot. Igaz inlineal meg vannak mas trukkok is, pl externnel kozosen.
(#) trudnai válasza gtk hozzászólására (») Jan 11, 2010 /
 
Az inline-t legjobban ugy lehetne elkepzelni, mint egy udvarias felkerest a 19. szazadban:

Mr Programozo: "Uram, nagy oromomre szolgalna, ha ezt a fuggvenyt megsem fuggvanykent tenne be, hanem egyszeruen beszurna a kodot a megfelelo helyekre!"

Mr Compiler: "Mindent megteszek, hogy O meltosaga elegedett legyen!"

Aztan pl. ha nem fer bele a program memoriaba, mert 800 helyen kellene kibontani a fuggvenyt, akkor nyilvan inkabb meghagyja fuggvenynek es ezzel rengeteg helyet fog megtakaritani. Donthettek volna a C fejlesztoi ugy is, hogy a dontes meghozatalat a programozora bizzak, de valamilyen oknal fogva nem igy tettek...
(#) Ballage válasza janyjozsef hozzászólására (») Jan 11, 2010 /
 
"Viszont az említett példában egy buzzer csipogási idejét kellett meghatározni, ahol néhány us vagy ms nem volt lényeg. "

Na, erről lemaradtam... De mindegy, egy csipogónál persze, hogy nem számít.
(#) Ballage válasza trudnai hozzászólására (») Jan 11, 2010 /
 
Igen, ez így van, ez már annak a kérdése, hogy hogyan veszed rá a fordítót, hogy ne hívást használjon, hanem befordítsa a függvényt.
(#) Ballage válasza trudnai hozzászólására (») Jan 11, 2010 /
 
Ez nem véletlen, ugyanis annak eldöntése, hogy mi legyen inline és mi nem, nem is olyan triviális. Függ pl. attól, hogy milyen architektúrára fordítasz, mekkora a cache a CPU-ban illetve mellette (mikrovezérlőkben nem nagyon van), hány paramétert adsz át, az adott helyen adott regiszterszám és -kihasználtság mellett tényleg javít-e a futtatás sebességen, mekkora a befordítani kívánt függvény, hívja-e direkt vagy indirekt módon rekurzívan saját magát a függvény, vagy pontosan az amit te is említettél, hogy elférünk-e az adott eszközön, vagy sem. Az inlining elsősorban sebességoptimalizálásra kitalált módszer, és a sebesség sok mindentől függ. És persze nem követelmény csak cél, amire törekszünk adott feltételek mellett. A fordító elsődleges feladata a forráskódnak megfelelő működésű tárgykód létrehozása, a minél nagyobb sebesség vagy minél kisebb méret másodlagos.
(#) Topi hozzászólása Jan 11, 2010 /
 
Nagyon elkalandoztunk már az inline pókfonalán...
De sajnos az eredeti nem inline EEPROM kezelésem még mindig függőben van.
Sajnos a teljes fordítós noinline nem jó, mert van olyan függvényem, aminek inline-nak kell lennie. Ha törik, ha szakad...
És sajnos nem helyettesíthető #define makróval.
(#) Ballage válasza Topi hozzászólására (») Jan 11, 2010 /
 
És amit janyjozsef javasolt, az sem járható?
(#) trudnai válasza Topi hozzászólására (») Jan 11, 2010 /
 
Idezet a gcc doksibol:

Idézet:
„As required by ISO C++, GCC considers member functions defined within the body of a class to be marked inline even if they are not explicitly declared with the inline keyword. You can override this with -fno-default-inline; see Options Controlling C++ Dialect.

GCC does not inline any functions when not optimizing unless you specify the `always_inline' attribute for the function, like this:

/* Prototype. */
inline void foo (const char) __attribute__((always_inline));”


Nem probaltam ki WinAVR-el, de talan meger egy probat...
(#) labu01wx hozzászólása Jan 14, 2010 /
 
Sziasztok!
Valaki legyen szíves megmondani, hogy avr dragonnal lehet-e ATmega 8-at programozni, mert az avr studio nem engedi kiválasztani?
(#) Trovo válasza Topi hozzászólására (») Jan 14, 2010 /
 
Ha a sokat emlegetett inline függvény mondjuk csak néhány utasítást tartalmaz, akkor egy lehetőség a #define függvényszerű makrók használata is, abban az esetben, ha a függvénynek nincs sok bemenete. Ebben az esetben a kvázi függvény be lesz szúrva a programkódba és a függvény természete is megmarad.
(#) Topi válasza Trovo hozzászólására (») Jan 14, 2010 /
 
Ezt én értem, de fentebb tisztáztam, hogy sajnos nem jók nekem a define makrók erre.
(#) laci37 hozzászólása Jan 15, 2010 /
 
Sziasztok! Azt szeretném kérdezni hogy indulásnak szerintettek melyik AVR32-es uC lenne jó? először az AT32UC3A0128-at néztem ki magamnak, de az 2800Ft. Olcsóbb fajta nincs?
(#) mrbini hozzászólása Jan 15, 2010 /
 
Sziasztok!
Tudna valaki segíteni mega8 felprogramozásában?
(#) janyjozsef hozzászólása Jan 15, 2010 /
 
Sziasztok!

Nekem 1 kérdésem lenne.

Ki akart belépni a nevemben?

Be akartam lépni és azt mondta, hogy le vagyok tiltva, mert már 5 -ször elrontottam.

Na mindegy.
(#) janyjozsef válasza laci37 hozzászólására (») Jan 15, 2010 /
 


Egyébként MP3 lejátszás, videó, fat stb 2800HUF-rt nem drága + letölthető könyvtár DSP utasítások stb.

Én ezt ajánlanám: AT32UC3B0256-A2UT
Én is ezzel tervezek most egy É.K. LCD vezérlőt.
Viszont a hivatalos JTAG programozója kicsit drága.

Van olcsóbb. De az ARM7 maggal 900HUF-tól. (TEM)

Nem tudom, hogy itt nézted e?
Bővebben: Link
(#) raiman hozzászólása Jan 15, 2010 /
 
Sziasztok
Érdeklődni szeretnék, hogy tudna-e valaki segíteni egy olyan kapcsolásban/ programban amivel egy labortáp feszültségét és áramát tudnám kijelezni.
2*16-os vagy 1*16-os lcd-vel szeretném megoldani.
0-50V-ig és 0-5A-ig szeretném, hogy mérjen.
Kivitelezhető ez?
Köszönöm előre is
(#) Tomi20 válasza raiman hozzászólására (») Jan 16, 2010 /
 
Heló

Itt egy komplett projekt, én is megépítettem, és működik.
(#) zolee1209 válasza raiman hozzászólására (») Jan 16, 2010 /
 
Szia!
Az alábbi oldalt tekintem eredeti forrásnak, ezen több program is van a multiméterhez, igény szerint!
Bővebben: Link
(#) Melphi hozzászólása Jan 16, 2010 /
 
Sziasztok valaki megmondaná hogy mi a külömség az atmega8-16pc 16pu között mert az első kell, de a második kapható.
(#) Melphi válasza Melphi hozzászólására (») Jan 16, 2010 /
 
Bocs a kérdésért rájöttem
(#) zolee1209 válasza Melphi hozzászólására (») Jan 16, 2010 /
 
És mi a válasz?
(#) Melphi hozzászólása Jan 16, 2010 /
 
tokozás
(#) Melphi hozzászólása Jan 17, 2010 /
 
Sziasztok szeretném felprogramozni a Topi féle AVR-Doperben lévő Atmega8-at egy STK200-al és a Ponyproggal ,kérdésem a fuse biteknél mit kell beálítani? Előre is köszönöm
(#) labu01wx hozzászólása Jan 18, 2010 /
 
Sziasztok!
Az alábbi kapcsolásban rajt lehet hagyni az ic-t az avr-en programozás közben(isp-vel)?
Mi a feltétele annak, hogy ne kelljen kiszedni az áramkőrből?
A másik kérdés, hogy mit jelent az optimalizáció és mikor melyiket kell kiválasztani?
Miért hallatszik enyhe zúgás a labortápból, ha rádugom az isp-t az avr-re(nincs rajt semmi csak a programozó) és a számítógépregépre is?
A válaszokat köszönöm.

t45.gif
    
(#) (Felhasználó 4577) válasza labu01wx hozzászólására (») Jan 18, 2010 /
 
Szia!

Az említett IC-k nem fogják befolyásolni a programozást.
Az ISP rövidítése In-System Programmer, azaz "Rendszerben programozó", ami pont az ilyen esetekre utal.
Ha valami gond van a programozó szoftver kiírja, tehát nyugodtan kipróbálhatod.
Például ha a MISO és a MOSI láb közt egy dióda van, na akkor ki kell szedni.
Az optimalizációról bővebben az AVR Studio súgójában olvashatsz angolul, az alapbeállítást ajánlom.
Valószínűleg azért hallasz enyhe zúgást, mert a táp gerjed. Ugyan így jártam én is, a programozó pedig jelezte is, hogy valami gond van. Javaslom, hogy nézz rá oszcilloszkóppal, vagy próbáld ki egy 4.5V-os laposelemmel.
(#) Yshteee hozzászólása Jan 20, 2010 /
 
Sziasztok

Egy soreos kijelzőt szeretnék építeni, ehhez elkészítettem egy sematikus elrendezést, a képen látható is. Egy kijelző, amelyet a soros portról lehet vezérelni. A szoftverről csak elképzelésem van:

Elküldöm a kiirandó szám első karakterét PB0 - PB6 ig ezzel egyidőben bekapcsolom azt a tranzisztort, amelyik helyiértékhez tartozik. Ezt mindaddig míg az összes számot ki nem írattam. Jól gondolom? A hardverrésze jó vajon? Köszi a segítséget.
(#) (Felhasználó 4577) válasza Yshteee hozzászólására (») Jan 20, 2010 /
 
Szia!

A hardware része hibás, NPN tranzisztorokat kell használni és egy 1K Ohm körüli ellenállást kell a bázisukkal sorbakötni.

Egyszerűbb úgy megoldani, hogy soros porton az egész számot elküldöd!
Kell egy függvény, ami frissíti a kijelzőn látható számokat.
Először tölts fel egy 9 elemű tömböt úgy, hogy miután hozzárendelted a PORTx-hez a kijelződ lábait a 0. elemhez 0-t írjon ki, az 1. elemhez 1-et, a 9. elemhez 9-et.
Ezután a függvénynek adj egy paramétert, ez lesz a szám amit majd kiír, legyen egész típusú.
A bemeneti paramétert pedig a module-al és osztással szét tudod darabolni, például a 256-ot 2-es, 5-ös, 6-osra.
Írd ki az első számot a portx-re: PORTx = tombod[bemenetiparameter%10];
És az első digit tranzisztorának bázisát emeld magas szintre pár ms-ra, majd vissza alacsony szintre. Ha a kijelzett értéket villogni látod, módosítsd az időzítést, nekem 4ms eddig mindenhová elég volt.
Ha ezzel meg vagy jöhet a többi digit szépen sorban.

A soros portos adatátvitelről pedig az adatlapokban olvashatsz bővebben.
Következő: »»   176 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem