Mallar påskynda Arduino I / O

Det är enkelt att glömma, men Arduino använder C ++. Vanligtvis är C ++ – delen i biblioteken såväl som ramen såväl som många människor bara tenderar att koda sina huvudprogram som använder en C-stil som bara använder bibliotekets föremål som C-språkförlängningar. [Fredllll] har nyligen skapat ett designmallbibliotek för att påskynda Arduino I / O samt han delade den på GitHub.

Om du någonsin har gjort något med Arduino, förstår du sannolikt att medan digitalwrite är praktiskt, det gör det mycket arbete bakom kulisserna för att kontrollera att PIN-enheten är konfiguration såväl som det här lägger till varje samtal. [Fredlllls] Designmallversioner kan byta en PIN-kod i två cykler. Du kan skära det i hälften om du inte har något emot att störa specificeringen av andra stift på exakt samma port.

Du kan använda en konstant för att slå på en stift, så här:

switchon <1> ();
Om du inte gillar att använda magiska nummer (och det är smart) kan du definiera en konstant:

const uint8_t ledpin = 1;
Switchon ();
Eftersom du sannolikt vill göra en elegant timing, finns det också en NOP-designmall som låter dig fördröja ett antal cykler. Här är en del testkod från Reddit som producerar en 1,3 MHz kvadratvåg, till exempel:

const uint8_t mypin = 5;
void loop () {
cli (); // inaktivera avbrott som de skulle skruva upp timing
gör {
switchonexclusive (); // 1 cykel
nop <5> (); // 5 cykler
Bytoffportofin (); // 1 cykel
nop <3> (); // 3 cykler
} medan (1) // hoppa tillbaka till är 2 cykler
}
Självklart är det inte det maximala, antingen, eftersom det finns åtta fördröjningscykler i slingan.

Du behöver inte förstå mycket om mallar för att utnyttja det här biblioteket, men om du vill förstå mer har vi täckt dem tidigare. Vi har noterat innan det digitalwrite är ungefär femtio gånger långsammare än en direkt hamnåtkomst, liksom den andra I / O-operationerna är inte mycket bättre. Det skulle vara fascinerande att kolla om mallar kan göra andra operationer mycket effektivare.

Leave a Reply