Arduino teljesítménye?
Eléggé meggyűlt a bajom az Arudino Mega 2560-nal. Ezt a programrészletet nem tudja 25ms alatt végrehajtani, holott szerintem simán képesnek kellene rá lennie:
DurationOLD = 500000/ZFT;
DurationNEW = pulseIn(Signal, LOW);
if (DurationNEW > DurationOLD*2.5) {
FHP= 1;
}
else {
FHP= 0;
}
A "DurationNEW" kiszámítása értelemszerűen a "Signal"-tól is függ, de nem ez okozza a lassulást, mert nem túl alacsony a "Signal" órajele - 500 Hz körül van, amivel legrosszabb esetben is 2-3ms alatt végeznie kellene.
Még nem igazán foglalkoztam eddig Arduino-val, csak PIC16f-ekkel, ott egy ilyen 2 szorzást és 1 osztást tartalmazó programrészlet simán lefut ennyi idő alatt, holott az sem erősebb hardverikusan.
Az meg csak hab a tortán, hogy ugyanezt (kivétel a pulseIn) bizonyos körülmények között el kellene végeztetnem vele 1-2 ms alatt is. Esetleg erre valami ötlet? Hardverváltás?
Érdekes lenne látni a gépi kódú részt debugoláskor, azt hiszem ez arduinoval nem megy. Ugye?
Én is PIC 16, 18-cal kezdtem, assemblyben, majd C(itt lehetett debugolni úgy hogy az assembly részletet látod a könyvtárból), most pinguino-m van, de az is jóval gyorsabb ennél, amit írsz. (ez 32 bites PIC-en alapszik, hasonló a környezet mont az arduino). Ezt azért vettem, mert ha elegem van a gyári környezetből, akkor buzerálhatom a microchip IDE-vel is.
Én egyébként nem a hardvare-re gyanakodnék, hanem ki tudja a fordító milyen bonyolult algoritmusra fordítja osztást.
Az Arduino "gyári" IDE-t használom.
#2: Igen, innen néztem én is. Itt most mit kellene látnom? A timeout funkciót nem használtam, mivel nincs rá szükség, mivel folyamatosan érkezik jel.
Azt, hogy itt egyáltalán nem hatékonysági problémáról van szó.
Ebben a kódrészletben egyetlen dolog tarthat sokáig, az a pulseIn() függvényhívás.
Dokumentációt megnézve nem is meglepő, hiszen ez a függvény addig várakozik, amíg megfelelő jelzést nem kap.
Megfelelő jelzést kap az. Mint írtam 500Hz körüli a bemeneti frekvencia, vagyis 1ms a jel fent majd 1ms a jel lent "töltött" ideje. Ebből én arra következtetek, hogy ha magas jelszintnél jut el oda, majd megvárja míg alacsony lesz majd míg újra magas az nem vehet el többi idő pár ms-nál (ha nincs számítási idő, akkor ugye maximum 2ms). Biztos, hogy nem amiatt van a lassul. Kipróbáltam így is:
DurationOLD = 500000/ZFT;
DurationNEW = 1000;
if (DurationNEW > DurationOLD*2.5) {
FHP= 1;
}
else {
FHP= 0;
}
Így is ugyan azt produkálja, kb. 20ms míg átfut ezen a programrészleten.
A változók típusával is játszottam, hátha az okozza, de nem.
A kód jó részét már kivettem, már csak az maradt, amiben a hiba forrása keresendő:
int Fortschritt = 22;
int ZFT = 800;
int FHP;
long DurationOLD;
long DurationNEW;
void setup() {
pinMode(Fortschritt, OUTPUT);
}
void loop() {
digitalWrite(Fortschritt, HIGH);
DurationOLD = 500000/ZFT;
DurationNEW = 1000;
if (DurationNEW > DurationOLD*2.5) {
FHP= 1;
}
else {
FHP= 0;
}
digitalWrite(Fortschritt, LOW);
}
A 22-es lábat oszcilloszkópra kötve határoztam meg az időt. Kb. 22 ms ideig magas az értéke.
Ez már tényleg olyan egyszerű, hogy nem lehet benne hiba, pedig mégis. Jelenlegi tudomásom szerint semmi sem indokolja ezt a késést.
Attól tartok ez a user error tipikus esete.
Kíváncsiságból beröffentettem egy 2560-as Arduinot és feltöltöttem rá a kódot. Én a szkópon 65 usec-et látok a HIGH-LOW átmenetek között.. ha kiszedem a sallangokat és csak a digitalWrite marad, akkor 5 usec körül van a kitöltési tényező. De ha neked még ez is sok, akkor áttérhetsz a natív port kezelésre, amivel eljuthatsz akár a nyers órajel ciklus sebességig.
Szóval szerintem a szkóp-kezeléssel vannak itt alapvető problémák...
(Amúgy sok értelme nincs futásidőben osztani/szorozni konstansokkal, de gondolom az eredeti kódban ez még nem így nézett ki.)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!