Arduino a knižnica STL (C++)
Takže používate Arduino a zaujíma vás, či môžete vo svojom kóde použiť knižnicu Cpp STL. Dobrá správa je:
áno, je to možné! Aj keď niektoré funkcie budú stále chýbať alebo niektoré iné budú obmedzené, vo svojich programoch Arduino budete môcť používať veci ako std::vector a std::string.
Aby to fungovalo, budete musieť použiť staršiu verziu Arduino IDE.
- napríklad verziu : 1.6.1
Pre Arduino je k dispozícii aj ďalšia knižnica STL s názvom ArduinoSTL. Problém je v tom, že táto knižnica nefunguje s najnovšími verziami Arduino IDE2. Takže ak chcete, aby to fungovalo, budete musieť prejsť na nižšiu verziu vášho Arduino IDE.
Ako je to možné, že STL nie je súčasťou Arduina?
Jazyk Arduino je podmnožinou C/C++ s niektorými objektovo orientovanými programovacími funkciami. Môžete napríklad vytvárať triedy v Arduine, nebudete však môcť používať výnimky a nové/vymazané výrazy. Ako je to teda možné, ak sme predtým povedali, že nie? Začalo to vývojom uClibc++. uClibc++ je knižnica Cpp vytvorená tak, aby mohla používať štandardnú knižnicu Cpp vo vstavaných systémoch.
A niekoľko vývojárov tiež pracovalo na portovaní tejto knižnice na Arduino. Knižnica, ktorú tu použijeme, sa nazýva StandardCPlusPlus. V podstate vám umožňuje používať („falošný“) STL v Arduine, stačí stiahnuť a nainštalovať knižnicu do vášho prostredia Arduino. Takže aj keď nemôžete natívne používať STL, môžete získať niektoré z jeho funkcií z externej knižnice.
Dôležitá poznámka:
Používanie STL na vašom počítači a na Arduino (čo je vstavaný systém) zjavne nie je to isté, takže neočakávajte, že všetko bude fungovať rovnako! Pamäť Flash a SRAM na Arduine sú asi niekoľko kilobajtov, zatiaľ čo na vašich počítačoch hovoríme v gigabajtoch. Viete si teda predstaviť, že pri vývoji knižnice došlo k určitým kompromisom.
Nainštalujte knižnicu STL pre Arduino
Poďme nainštalovať a používať knižnicu StandardCPlusPlus vo vašom prostredí Arduino.
- Najprv prejdite na stránku StandardCPlusPlus GitHub a kliknite na „Klonovať alebo stiahnuť“ (zelené tlačidlo vpravo) > „Stiahnuť ZIP“.
- Na počítači prejdite do priečinka Arduino (predpokladám, že ste už nainštalovali Arduino). Môže sa nachádzať v priečinku Documents/Arduino alebo v podobnom priečinku – pokiaľ ste nezvolili vlastnú cestu.
- Rozbaľte knižnicu pomocou 7-zip, winraru alebo akéhokoľvek iného nástroja na prácu s archívmi. Umiestnite nový priečinok (ktorý by sa mal volať StandardCPlusPlus-master) do priečinka knižnice/priečinku Arduino.
Teraz, aby ste to otestovali, spustite Arduino IDE alebo ho reštartujte, ak už bolo otvorené pri inštalácii knižnice. Vytvorte veľmi jednoduchý náčrt iba s jedným importným riadkom.
#include <StandardCplusplus.h>
void setup() {}
void loop() {}
Kliknutím na „Overiť“ skompilujte svoj kód.
Ak sa v tomto bode objavia nejaké chyby, znamená to, že vaša inštalácia nebola vykonaná správne. Je možné, že ste neumiestnili priečinok StandardCPlus-master/ na správne miesto alebo ste zabudli rozbaliť archív.
Uistite sa, že ste dodržali všetky kroky a skúste to znova. Tiež som urobil tutoriál s doskou Arduino Uno. Malo by to fungovať aj v prípade iných dosiek, ako sú Mega alebo Nano, ale ak používate dosky ako Due alebo Zero, môžete naraziť na nejaké problémy.
Použite Cpp STL s Arduino
Nie všetky funkcie Cpp STL boli prenesené a väčšina z nich v tu skutočnosti funguje trochu inak. Mali by ste ich však používať bez akýchkoľvek problémov alebo rozdielov v syntaxi, pretože rozhranie je skutočne podobné. Pozrime sa na príklad niektorých funkcií Arduino STL.
std::vector
Tu je základný príklad, ako použiť std::vector v náčrte Arduina, aby ste získali dynamické pole takmer akéhokoľvek typu údajov.
#include <StandardCplusplus.h>
#include <vector>
std::vector<int> numbers;
void setup()
{
Serial.begin(9600);
numbers.push_back(7);
numbers.push_back(42);
numbers.push_back(15);
for (int i = 0; i < numbers.size(); i++)
{
Serial.println(numbers.at(i));
}
numbers.clear();
Serial.print("Is the vector empty: ");
Serial.println(numbers.empty());
}
void loop() {}
Ak už poznáte std::vector, môžete vidieť, že spôsob použitia je rovnaký, ako keď programujete na počítači (ale nezabudnite, že implementácia vnútorne určite nie je totožná). V tomto príklade najprv deklarujeme vektor, potom ho naplníme hodnotami a vytlačíme ich. Potom vektor vymažeme a skontrolujeme, či je prázdny. Vyskúšajte tento príklad na svojom Arduine a sledujte výsledok otvorením sériového monitora:
7
42
15
Is the vector empty: 1
Upozornenie: kvôli obmedzenému priestoru nebudete môcť na Arduine vytvárať obrovské polia a vektory. Majte to na pamäti skôr, ako sa pokúsite vytvoriť 10 000 dvojitý vektor.
std::iterator
Prepíšme cyklus for v predchádzajúcom príklade, tentoraz pomocou std::iterátora. Tiež inicializujeme vektor priamo namiesto použitia funkcie push_back().
#include <StandardCplusplus.h>
#include <vector>
#include <iterator>
std::vector<int> numbers {7, 42 ,15};
void setup()
{
Serial.begin(9600);
std::vector<int>::iterator it;
for (it = numbers.begin(); it < numbers.end(); it++)
{
Serial.println(*it);
}
}
void loop() {}
std::string
Začnime jednoduchým príkladom std::string.
#include <StandardCplusplus.h>
#include <string>
std::string message = "Ahoj Arduino";
void setup()
{
Serial.begin(9600);
Serial.println(message.c_str());
Serial.print("Length: ");
Serial.println(message.length());
std::string subString = message.substr(6,5);
Serial.println(subString.c_str());
}
void loop() {}
Poznámka: Ak chcete vytlačiť std::string pomocou Serial.println(), musíte použiť C reprezentáciu reťazca s funkciou c_str(). Je to podobné, ako keď chcete použiť printf(). Tiež si nezamieňajte std::string s objektom Arduino String.
std::vector – std::string
Pokračujme v našom predchádzajúcom kóde na std::vector, ale tentoraz pomocou kolekcie std::string.
#include <StandardCplusplus.h>
#include <vector>
#include <iterator>
#include <string>
std::vector<std::string> animals {"prasa", "pes", "ovca"."};
void setup()
{
Serial.begin(9600);
std::vector<std::string>::iterator it;
for (it = animals.begin(); it < animals.end(); it++)
{
Serial.println((*it).c_str());
}
}
void loop() {}
A výstup:
prasa
pes
ovca
std::cout
Povedzme „Ahoj“ pomocou cout.
#include <StandardCplusplus.h>
#include <serstream>
std::ohserialstream cout(Serial);
void setup()
{
Serial.begin(9600);
cout << "Ahoj" << std::endl;
}
void loop() {}
Najprv musíte zahrnúť „serstream“. Na vašom počítači by ste použili „iostream“. Pred použitím std::cout musíte Arduinu povedať, ktoré hardvérové sériové rozhranie potrebuje použiť. Tu používame „Serial“ pre sériové rozhranie USB. V závislosti od vašej aplikácie to môže byť napríklad „Serial1“ alebo akýkoľvek iný HardwareSerial, ktorý chcete použiť.
Vráťme sa k nášmu príkladu s vektormi, iterátormi a reťazcami a nahraďte Serial.print() za std::cout.
#include <StandardCplusplus.h>
#include <vector>
#include <iterator>
#include <string>
#include <serstream>
std::ohserialstream cout(Serial);
std::vector<std::string> animals {"prasa", "pes", "ovca"."};
void setup()
{
Serial.begin(9600);
std::vector<std::string>::iterator it;
for (it = animals.begin(); it < animals.end(); it++)
{
cout << *it << std::endl;
}
}
void loop() {}
Ďalšie funkcie od STL
V tomto návode ste videli, ako nainštalovať a používať externú knižnicu – StandardCPlusPlus, založenú na uClibc++ – na získanie niektorých funkcií STL do vášho kódu Arduino. Experimentovali ste s vektorom, iterátorom, reťazcom, cout. Tie sú veľmi bežné v akomkoľvek kóde Cpp, ktorý používa STL.
Existuje mnoho ďalších užitočných funkcií STL, ktoré môžete použiť s touto knižnicou Arduino:
- bitset
- queue
- map
- set
- map
- …
Pridaj komentár