Arduino függvények ciklusideje

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
prmpec
DrótVégénSzéndarab
Hozzászólások: 46
Csatlakozott: 2009. december 2. szerda, 7:00

Arduino függvények ciklusideje

HozzászólásSzerző: prmpec » 2013. január 1. kedd, 17:39

Helló!

Bár már egy fórum téma már pedzegette (viewtopic.php?f=23&t=1052), de még mindig nem látok tisztán. Milyen költségekkel járnak az Arduino bizonyos funkciói?

Megaherz közeli működést kellene produkálnom, de egyelőre nagyon messze vagyok ettől.

Számításaim szerint a 16MHz-es CPU 1250 mikroszekundumos ciklusidőt jelent.
Kb. 20 kódsoros a kódom, a kérdés persze az, hogy milyen könyvtári függvényeket hívok benne. Mérésem szerint jelenleg 460 órajelcikus a kódom, ami bizony alig üti a Kiloherzes tartományt. :(

Mit tartalmaz a kódom?:
2 függvényhívást
1 micros() hívást
5 értékadást pointerre vagy unsigned long-ra
7 feltétel vizsgálatot pointerre vagy unsigned long-ra
2 artimetrikai műveletet unsigned long-ra

Akárhogy is nézem ez nem lenne szabad száz órajelnél több legyen.
Beraktam mégegy micros() függvényhívást, ezt +48 óraciklus büntetés volt.

Miért mégis ilyen sok? Van erről valami ötletetek, vagy leírás valahol?

Kössz,
Balázs

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino függvények ciklusideje

HozzászólásSzerző: Robert » 2013. január 1. kedd, 17:54

Az Arduino függvények a core.h és core.cpp állományban vannak.
Időkritikus és erőforrás-igényes alkalmazások fejlesztésére nagyjából alkalmatlan.

Csak közelítőleg:
Amit kiszámoltál időt az ASM (gépi) kódra igaz. Magasszintű függvények esetén jóval több is lehet.
A micros() pl:
- timer megszakításba belépés INT alapon
- regiszterek és visszatérési címek mentése
- long változó növelése (4 byte) (SRAM memória -> regisztermásolással indítva, mert a processzor nem ér el SRAM-t csak regisztert!)
- regiszterek és visszatérési címek visszaállítása
- kilépés a megszakításból

A 48 órajel kb. reális...

feltételvizsgálatnál a leggyorsabb: if érték == 0... Erre van ASM kód.

Függvényhívás:
- visszatérési cím mentése/végén visszaállítás
- belső változók lefoglalása/végén felszabadítás. Vagy másolása.
És ekkor semmit sem tettél még...

Long értékadás:
- 4 byte, azaz 4 regiszter értékadás (byte-ra átszámolás/számábrázolás)
- regiszter SRAM másolás
Ez is 8-12 órajel minimum...


MHz körüli működés esetén van 16 órajeled _az összes funkcióra_. Hát, esélytelen:(. Még ASM alapon is...

I/O kezelés eléggé pazarló. Erre van javított függvény (Digit I/O beállítás, írás)
Alapban max 150 kHz jel állítható elő, ASM-ben ~4 MHz lehetne...

Avatar
prmpec
DrótVégénSzéndarab
Hozzászólások: 46
Csatlakozott: 2009. december 2. szerda, 7:00

Re: Arduino függvények ciklusideje

HozzászólásSzerző: prmpec » 2013. január 1. kedd, 19:48

Nem. Valamit elszámoltam... Minjárt rájövök, hogy mit...
65536x futtattam le a függvényemet és ezt 1059068 microszekundum alatt tette meg. Vagyis egy hívás 16micros.
Ráadásul 16MHz az 0,0625 microszekundumos órajelidőt jelent. Vagyis a kódom 258 ciklus alatt fut le. Hmm... Ez még mindig egy picit sok.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino függvények ciklusideje

HozzászólásSzerző: Robert » 2013. január 1. kedd, 19:59

Kód kapható lenne? Nem kellene ötletelni...
Legalább funkció szinten....

Avatar
prmpec
DrótVégénSzéndarab
Hozzászólások: 46
Csatlakozott: 2009. december 2. szerda, 7:00

Re: Arduino függvények ciklusideje

HozzászólásSzerző: prmpec » 2013. január 1. kedd, 20:09

Sajnos két könyvtár együttműködéséről van szó, most próbálom szintetizálni a problémát. Elég érdekes patasztalatokat szerzek, mindjárt megosztom.

Avatar
prmpec
DrótVégénSzéndarab
Hozzászólások: 46
Csatlakozott: 2009. december 2. szerda, 7:00

Re: Arduino függvények ciklusideje

HozzászólásSzerző: prmpec » 2013. január 1. kedd, 22:24

Elvégeztem egy szintetikus sebességmérő tesztet. Egy nagyon meglepő eredményt tapasztaltam: Ha nem engedem a loop() függvénynek, hogy ő csinálja a ciklust, hanem magam csinálok végtelen ciklust, akkor 40 (!) órajelet spórolok. Következő további mérések születtek:

- Loop bünti: 40 órajel
- micros() függvény 47 ciklus
- Függvényhívás pointer paraméterrel: 8 ciklus
- Unsigned long feltétel vizsgálat: 14 órajel
- Unsigned long összeadás (++ művelet): kb. 20 ciklus
- "Portregiszteres" output művelet: 12 ciklus

Egy órajel ciklusideje 0,0625 mikroszekundum.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 676
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Arduino függvények ciklusideje

HozzászólásSzerző: csabeszq » 2013. január 5. szombat, 20:16

prmpec, furcsa amit írsz. Én C-ben (nem Arduino C++) szoktam programozni. A generált kódot alaposan megvizsgáltam és max 10%-kal lassabb, mintha asm-ben írnám meg. Egy komoly hibát találtam eddig, hogy bizonyos műveleteket 16 biten számolt 8 helyett, de azt is javították már.

Nem látom semmi értelmét az asm-nek, arról fogalmam sincs, hogy az Arduino mit csinál, de a sima C hasít rendesen.

Persze ha 2 tizedes pontossághoz 256-tal szorzás helyett float-ot használsz int helyett, annak ára van, de ez már nem a C hibája.

dezs
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2013. február 16. szombat, 23:48

Re: Arduino függvények ciklusideje

HozzászólásSzerző: dezs » 2013. február 16. szombat, 23:56

Sziasztok!

Arduino Megával szeretnék béta (koincidencia) detektort készíteni.

Ez lenne az első Arduino projectem. Valószínűleg a programot sem én fogom megírni...

Két fotoelektronsokszorozóból érkező jel egyidejűségét kellene vizsgálnom. A PMT egy foton beütésére egy gyorsan felfutó, lassan lecsengő analóg feszültség jelet ad ki. Ahhoz, hogy el lehessen dönteni két jel egyidejűségét a jeleket digitalizálás után (vagy esetleg előtte??? ezt nem tudom biztosan) kis időkésleltetéssel kivonjuk önmagukból, így szinte négyszögjelet kapunk, és ha ezek között egy határértéknél kisebb a különbség, akkor kimegy egy digitális jel. Állítólag ezt mikrokontrollerrel meg lehet csinálni.
Gondolom az ADC 15kSPS sebességénél lassabb lesz az egész, mert nem csak digitalizálni kell, hanem még számolni is. Valahogyan meg tudnátok előre saccolni, hogy másodpercenként hány művelet (jelpár összehasonlítás) végezhető el?

Előre is köszi a segítséget!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9990
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduino függvények ciklusideje

HozzászólásSzerző: Robert » 2013. február 17. vasárnap, 7:51

Arduino alatt a sejtett 10-ede a sebesség:(
Nem időkritikus alkalmazásokhoz találták ki a nyelvet...

A programkódban ami kritikus: byte/word/integer vagy lebegőpontos számok vannak? A sebesség is ebben a sorrendben csökken...

De nyelvnek Bascom vagy C vagy ASM javasolt.
A 15kbps az _minden_ csatorna ADC-re vonatkozik! De ha túlhajtod, akkor a 10 bit helyett 6-7 bites is lehet, ekkor 70-80 kbps-ig el lehet menni!


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég