Det er enkelt å glemme, men Arduino benytter C ++. Vanligvis er C ++ -delen i bibliotekene, så vel som rammen, så vel som mange mennesker har bare en tendens til å kode sine hovedprogrammer ved hjelp av en C-stil som bare bruker biblioteksobjektene som C-Language Extensions. [Fredllll] har nylig nylig produsert et designmalbibliotek for å øke hastigheten på Arduino I / O, så vel som han delte den på Github.
Hvis du noen gang har gjort noe stort med Arduino, forstår du mest sannsynlig at mens Digitalwrite er praktisk, gjør det mye arbeid bak kulissene for å sikre at PIN-koden er konfigurasjon, så vel som dette legger til overhead til hvert anrop. [Fredlllls] Design Template-versjoner kan bytte en PIN-koden spesifiser i to sykluser. Du kan kutte det i halvparten hvis du ikke har noe imot å lage spesifiseringen om andre pins på nøyaktig samme port.
Du kan bruke en konstant til å slå på en PIN-kode, slik:
Switchon <1> ();
Hvis du ikke liker å bruke magiske tall (og det er smart), kan du definere en konstant:
const uint8_t Ledpin = 1;
Switchon ();
Fordi du sannsynligvis vil gjøre noe elegant timing, er det også en NOP-designmal som lar deg forsinke et sett antall sykluser. Her er noen testkode fra Reddit som produserer en 1,3 MHz Square Wave, for eksempel:
const uint8_t myPin = 5;
void loop () {
cli (); // Deaktiver avbrudd som de ville skru opp timingen
gjør {
SwitchonExclusive (); // 1 syklus
nop <5> (); // 5 sykler
switchoffportofpin (); // 1 syklus
nop <3> (); // 3 sykluser
} mens (1) // hoppet tilbake til å gjøre er 2 sykluser
}
Tydeligvis er dette ikke maksimalt, enten fordi det er åtte forsinkelsessykluser i løkken.
Du krever ikke å forstå mye om maler for å utnytte dette biblioteket, men hvis du vil forstå mer, har vi dekket dem i det siste. Vi har notert før digitalwrite er omtrent femti ganger langsommere enn en direkte havneadgang, så vel som den andre I / O-operasjonen er ikke mye bedre. Det ville være fascinerende å sjekke ut om maler kan gjøre andre operasjoner mye mer effektivt.