Al_Bundy skrev:Men vad är anledningen att C++ används så mycket vi bibliotek på Arduino?
För att wiring som man valt som bas kompileras med en C++-kompilator.
För att det var praktiskt att använda ett språk som det redan finns kompilator för.
Take your pick.
Jag ids int' börja om debatten om det betyder att Arduino är C++ eller inte; faktum är dock att Arduino-skisserna kompileras med en C++-kompilator men Arduino använder
inte C++ standard-bibliotek. Istället används
wiring-biblioteken (pinMode(), digitalWrite() et c. kommer därifrån), tillsammans med Arduinos eget bibliotek av rutiner, klasser och objekt samt de bibliotek som man vill ta från tredje part på nätet.
Ta
Serial på Arduino Uno som exempel.
Serial är ett objekt av klassen
HardwareSerial som instantierats i den kod som Arduino-miljön automatiskt lägger till omkring skissen innan den skickas till avr-g++. Klassen är drivrutin för UART:en i AVR-processorn och tillhandahåller de metoder du anropar från din skiss, till exempel begin() eller write(). Som synes nedan är
HardwareSerial en alldeles vanlig C++-klass, som dock ärver
Stream från Arduino-biblioteket.
Kod: Markera allt
// Utdrag ur Arduino HardwareSerial.h, Copyright Nicholas Zambetti
class HardwareSerial : public Stream
{
private:
// Jag har klippt bort de privata delarna i den här listningen
public:
HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
volatile uint8_t *ucsrc, volatile uint8_t *udr,
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x);
void begin(unsigned long);
void begin(unsigned long, uint8_t);
void end();
virtual int available(void);
virtual int peek(void);
virtual int read(void);
virtual void flush(void);
virtual size_t write(uint8_t);
inline size_t write(unsigned long n) { return write((uint8_t)n); }
inline size_t write(long n) { return write((uint8_t)n); }
inline size_t write(unsigned int n) { return write((uint8_t)n); }
inline size_t write(int n) { return write((uint8_t)n); }
using Print::write; // pull in write(str) and write(buf, size) from Print
operator bool();
};
Graj skrev:Modern c++ är nog ganska olämpligt ens om standardbiblioteken skulle vara tillgängliga.
På inbyggda platformar menar du?
Jag skulle vilja säga att C++-11 tillför en hel del mekanismer som gör språket
bättre anpassat för inbyggda system än tidigare C++-versioner. En stor av förändringarna är sådana att de tillåter kompilatorn att göra större andel av jobbet, sådant som tidigare fick göras i runtime.
contexpr och "variadic templates" är nog de största förbättringarna i det avseendet. Delar av standardbiblioteket är klart användbart, medan andra delar är mer tveksamma. Container-klasserna kan vara användbara även i ett inbyggt system, man får antingen implementera new() och delete() eller implementera egna allocator-klasser, det senare brukar ändå bli ett krav många gånger.
streambuf är riktigt användbart, men iostreams för standardio är oftast odugligt implementerat. Jag vill minnas att jag mätte upp knappa 200 kB kod för GNU libstdc++ iostreams på ARM Cortex-M3 vid något tillfälle - å andra sidan är det biblioteket optimerat för att vara generellt och att ha alla klockor och visslor som folk kan tänka sig snarare än för att vara litet och inbyggbart.