Forum: Compiler & IDEs Analyse der Arduino Libraries


von chris (Gast)


Lesenswert?

Vielleicht lässt sich aus den Arduino-Libraries etwas lernen, deshalb 
schaue ich mir gerade die Sourcen etwas an.

https://github.com/arduino/Arduino/tree/1.5.2/hardware/arduino/avr/cores/arduino

Interesant ist der Hardware Abstraction Layer ( HAL ), bei dem z.B. der 
Zugriff auf die Pins geregelt wird:

https://github.com/arduino/Arduino/blob/1.5.2/hardware/arduino/avr/cores/arduino/wiring_digital.c

Leider braucht das PIN-setzen dadurch auch einige Zeit.

von chris (Gast)


Lesenswert?

Es scheint schon einige Versuche zu geben, die Arduino API auf die STM32 
MCs zu portieren:

https://github.com/gbulmer/openstm32sw/tree/master/stm32f4/libmaple/examples

Es wäre interessant, dafür eine ähnlich einfach zu installierende und 
bedienende IDE wie für den ARDUINO zu haben.

von Arduino (Gast)


Lesenswert?

Die Fehlerquote für Einsteiger und Amateure ist dadurch aber auch 
geringer. Der Sinn liegt aber im Auge des Betrachters.

Die MCs werden immer Leistungsfähiger, warum nicht auch den API Level 
anheben. Mit den Desktop PC hat es doch auch wunderbar funktioniert.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Arduino schrieb:

> ..., warum nicht auch den API Level anheben.
> Mit den Desktop PC hat es doch auch wunderbar funktioniert.

Und auch mit Embedded Systemen, wie neulich am ICE zu bewundern, wo ein 
Bremssignal 1 Sekunde von der Betätigung bis zur Bremsung im 
Windows-System rumgeistert...

von chris (Gast)


Lesenswert?

Da die Mikrocontroller immer zahlreicher und aufwendiger werden, gibt es 
auch immer mehr Ansätze für eine Standart-API.

Bsp.:

Elektro EFL : 
http://www.elektor.de/jahrgang/2013/mai/embedded-firmware-library.2458054.lynkx

STM32 standard peripheral library ( leider Herstellerabhängig )

Vielleicht wäre eine Standardisierung der Hardware-Abstraction Layer 
eine Aufgabe für das MC-Netz

von Markus M. (mark_m)


Lesenswert?

> Und auch mit Embedded Systemen, wie neulich am ICE zu bewundern, wo ein
> Bremssignal 1 Sekunde von der Betätigung bis zur Bremsung im
> Windows-System rumgeistert...
Nur weil viele APIs verwendet werden, kommt noch kein gutes Systemdesign 
heraus. Die richtige Verwendung der APIs ist das A und O.

Hier im Forum liest man ja des öfteren, dass die Leute API 
Dokumentationen lesen und doch fehlt ihnen das Verständnis der Design 
Pattern die hinter der API stecken. Eine API ist ein Werkzeug. Falsch 
eingesetzt richtest es mehr Schaden an, als dass es die Arbeit 
erleichtert.

Grüsse

von chris (Gast)


Lesenswert?

Hier läuft gerade eine Diskussion zu FreeRTOS auf dem Arduino. Meiner 
Meinung nach hätte ein Multitasking system schon lange als Stantard in 
die Arduino Umgebung gehört.
Insbesondere mit dem Arduino Due ( Arm Prozessor ) wäre so was nicht 
schlecht.

von chris (Gast)


Lesenswert?


von schnitzlmax (Gast)


Lesenswert?

chris schrieb:
> Hier läuft gerade eine Diskussion zu FreeRTOS auf dem Arduino. Meiner
> Meinung nach hätte ein Multitasking system schon lange als Stantard in
> die Arduino Umgebung gehört.
> Insbesondere mit dem Arduino Due ( Arm Prozessor ) wäre so was nicht
> schlecht.

Es ist sehr schön das du der meinung bist..
nur was mir sehr befremdend vorkommt.. du fragst im von dir geposteten

>da ich mich nicht mit FreeRTOS auskenne: Wie aufwendig ist es, das
>System für Arduino in Betrieb zu nehmen? Muss man viel Zeit investieren,
>bis es mal grundsätzlich kompiliert?

somit würde ich mal stark meinen das du keine ahnung hast von rtos...

der name rtos steht für real time operating system .. das bedeutet man 
soll voraussagen können wann wer was macht nicht einfach random bisschen 
"parallel" machen ..

von mutex,semaphoren,memorymanagement und dem ganzen will ich gar nicht 
sprechen ...

sowas hat mit arduino nichts zu tun..

von chris (Gast)


Lesenswert?

>somit würde ich mal stark meinen das du keine ahnung hast von rtos...

Du solltest die Posts genauer lesen. Meine Frage war nicht, wie ein RTOS 
funktioniert, sondern wie groß der Aufwand für die Installation in der 
Arduino Umgebung ist. In der Arduino ist es üblich, dass die Dinge 
schnell funktionieren. Wenn man FreeRTOS also in 5 Minuten ausprobieren 
kann, lohnt es sich.

>der name rtos steht für real time operating system .. das bedeutet man
>soll voraussagen können wann wer was macht nicht einfach random bisschen
>"parallel" machen ..

>von mutex,semaphoren,memorymanagement und dem ganzen will ich gar nicht
>sprechen ...

Dir fehlt die Phantasie. Wie das Arduino Konzept zeigt, kann man sehr 
wohl komplizierte Sachverhalte auf Wesentliches reduzieren un jedem zur 
Verfügung stellen. Wer hätte gedacht, dass die 
Mikrocontrollerprogrammierung in C dank Arduino von jedem Laien 
innerhalb kurzer Zeit verwendet werden kann?

von Karl H. (kbuchegg)


Lesenswert?

chris schrieb:
> Wer hätte gedacht, dass die
> Mikrocontrollerprogrammierung in C dank Arduino von jedem Laien
> innerhalb kurzer Zeit verwendet werden kann?

Jau.
Sehen wir hier oft genug, was dann dabei rauskommt.

(Sorry, could not resist)

von Markus M. (mark_m)


Lesenswert?

Das liegt aber nicht am Arduino sondern an der Weigerung der Einsteiger 
sich erst mal mit den Grundlagen und der Programmiersprache auseinander 
zu setzen. Bevor man die HW anpackt erst mal 2-3 Wochen die ein C/C++ 
Buch lesen und sich mit der Arduino API beschäftigen.

Viel zu viele Einsteiger meine, dass sie das mit "Trail & Error" 
geregelt bekommen! Großer Irrtum.

Aber erzählen kann man/ich ja viel. ;-)

Grüsse

von Yalu X. (yalu) (Moderator)


Lesenswert?

Markus M. schrieb:
> Das liegt aber nicht am Arduino sondern an der Weigerung der Einsteiger
> sich erst mal mit den Grundlagen und der Programmiersprache auseinander
> zu setzen.

So ist es.

Nur ist es so, dass diejenigen, die mit dem entsprechenden Vorwissen an
die µC-Programmierung herangehen, Arduino nicht mehr brauchen bzw.
wollen. Da fragt man sich: Für wen ist dann Arduino überhaupt gemacht?

von chris (Gast)


Lesenswert?

>Für wen ist dann Arduino überhaupt gemacht?
Ich denke, dieses Thema wurde hier ausführlich diskutiert:
Beitrag "Re: Arduino - bringt's das ?"

Ich schließe mich ( mit ähnlicher Historie ) PittyJ an.

von Peter D. (peda)


Lesenswert?

chris schrieb:
> Interesant ist der Hardware Abstraction Layer ( HAL ), bei dem z.B. der
> Zugriff auf die Pins geregelt wird:
>
> https://github.com/arduino/Arduino/blob/1.5.2/hard...
>
> Leider braucht das PIN-setzen dadurch auch einige Zeit.

Nicht nur das, der Zusammenhang zwischen Bits und Ports geht auch 
verloren.
Wenn ich damit z.B. einen 8Bit-DAC ansteuern will, kriege ich zwischen 2 
Werten riesige Spikes. Das ist nicht zu gebrauchen.

Auch ist die Pinnumerierung unterschiedlich zwischen DIP/SMD und ich 
habe Lücken (VCC, GND-Pins usw.).

Ich sehe daher keinerlei Vorteil gegenüber der Pinbenamung lt. 
Datenblatt.
Im Gegenteil, mit Bitmacros lassen sich die einzelnen Pins direkt 
verwenden:
http://www.mikrocontroller.net/attachment/157663/sbit.h

Das Macro funktioniert sogar auch bei den Ports, die mit LDS/STS 
adressiert werden (ist dann aber nicht Interrupt fest).

Und auch den Lernaufwand, daß 8 Pins einen Port bilden, halte ich nicht 
für zu hoch.

von amateur (Gast)


Lesenswert?

@Peter

Kann man eigentlich, in der Arduinoentwicklungsumgebung, beides machen?

Also die "verpackten" Funktionen nutzen UND eine Makrosammlung wie 
sbit.h einbinden.
Ich finde es immer angenehm, wenn am Anfang, innerhalb der 
Initialisierung alles gut "Lesbar" ist - die Ausführungszeit ist da ja 
nicht so wichtig - und man wo es darauf ankommt, die Bits "persönlich" 
begrüßen kann.

von chris (Gast)


Lesenswert?

>Nicht nur das, der Zusammenhang zwischen Bits und Ports geht auch
>verloren.

Es ist eine Abstraktion. Man kann somit Programme zwischen einem Arduino 
Uno http://arduino.cc/de/Main/ArduinoBoardUno( Atmega328 ), Arduino Mega 
http://arduino.cc/de/Main/ArduinoBoardMega und einem Arduino Due 
http://arduino.cc/de/Main/ArduinoBoardDue ( ARM SAM3X8E ) austauschen. 
Die Pins auf den Boards sind mit den Nummern der Pin-Treiber versehen.
Vielleicht ist es etwas ähnliches wie mit einem LINUX-INTEL und einem 
LINUX-ARM PC: auf beiden kann die gleich Software laufen.

von Markus M. (mark_m)


Lesenswert?

> Kann man eigentlich, in der Arduinoentwicklungsumgebung, beides machen?
Ja. Arduino nutzt C++ als Programmiersprache.

Du bist nur mehr oder wenig eingeschränkt, da Arduino ein paar Resourcen 
des MC für sich beansprucht, die dir dann nicht mehr zur Verfügung 
stehen. Da ist es ratsam mal in den Source Code zu schauen.

Grüsse

von chris (Gast)


Lesenswert?

Hier habe ich eine sehr interessante FastSpi Bibliothek für den Arduino 
zur Ansteuerung der WS2811 LEDs gefunden:
http://code.google.com/p/fastspi/downloads/detail?name=FastSPI_LED2.RC1.zip

In der Datei lib8tion.h finden sich schnelle C Funktionen mit Assembler 
Inhalt. Ein Beispiel aus dem Kommentar:
1
/*
2
 - Scaling (down) of unsigned 8- and 16- bit values.
3
   Scaledown value is specified in 1/256ths.
4
     scale8( i, sc) == (i * sc) / 256
5
     scale16by8( i, sc) == (i * sc) / 256
6
7
 - Fast 8- and 16- bit unsigned random numbers.
8
   Significantly faster than Arduino random(), but 
9
   also somewhat less random.  You can add entropy.
10
     random8()       == random from 0..255
11
     random8( n)     == random from 0..(N-1)
12
     random8( n, m)  == random from N..(M-1)
13
14
 - Fast 16-bit approximations of sin and cos.
15
   Input angle is a uint16_t from 0-65535.
16
   Output is a signed int16_t from -32767 to 32767.
17
      sin16( x)  == sin( (x/32768.0) * pi) * 32767
18
      cos16( x)  == cos( (x/32768.0) * pi) * 32767
19
   Accurate to more than 99% in all cases.
20
*/

Damit lassen sich einige C-Programm deutlich beschleunigen

von Le X. (lex_91)


Lesenswert?

Peter Dannegger schrieb:
> Nicht nur das, der Zusammenhang zwischen Bits und Ports geht auch
> verloren.

Seh ich nicht so, das ist für mich ein Vorteil.

Wenn ich "höhere" Treiber schreibe, wie zB für ein LCD oder ein 
595-Schieberegister, nervt es mich oft dass ich mir immer zwei Werte 
merken muss.
Auserdem darf ich sie z.B. nicht in einer Struktur ablegen, sonst nehm 
ich gcc die Möglichkeit, richtig zu optimieren.

Deine sbit.h ist zwar schön und gut, und ich verwende sie auch ab und 
zu.
Aber manchmal ist man damit auch limitiert. Ich kann damit z.B. keine 
"Kanalnummer " (= Kombination aus Port + Pin) an eine Funktion 
übergeben.
Wenn ich etwas generisch halten will funktioniert das damit nicht.

Wie auch immer: Sooft ich mich darüber ärgere, ich lande auch immer 
wieder bei sbit.h oder dem typischen Bitgeschiebe. Der Overhead bei der 
Arduino-Style-Lösung ist einfach zu groß.

Meine effektivste Implementierung braucht ca. 20 Takte. Das ist leider 
ein Overhead von 1900%.
Wenn man ab und zu eine Status-Led schaltet, OK.
Ein Schieberegister anzusteuern ist so allerdings Schwachsinn.

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hallo,

Peter Dannegger schrieb:
> chris schrieb:
>> Interesant ist der Hardware Abstraction Layer ( HAL ), bei dem z.B. der
>> Zugriff auf die Pins geregelt wird:
>>
>> https://github.com/arduino/Arduino/blob/1.5.2/hard...
>>
>> Leider braucht das PIN-setzen dadurch auch einige Zeit.
>
> Nicht nur das, der Zusammenhang zwischen Bits und Ports geht auch
> verloren.
> Wenn ich damit z.B. einen 8Bit-DAC ansteuern will, kriege ich zwischen 2
> Werten riesige Spikes. Das ist nicht zu gebrauchen.

das ist für mich nicht trivial offensichtlich, warum ist das denn so?

> Und auch den Lernaufwand, daß 8 Pins einen Port bilden, halte ich nicht
> für zu hoch.

hmm, ist das denn bei einem Atmel SAM3X8E (Arduino Due) überhaupt so?

Vlg
 Timm

von Oliver (Gast)


Lesenswert?

chris schrieb:
> Damit lassen sich einige C-Programm deutlich beschleunigen

Was zu beweisen wäre. Schliesslich machen diese Arduino-Funktionen nicht 
das selbe wie ihre vollwertigen Varianten.

Oliver

von Axel S. (a-za-z0-9)


Lesenswert?

Timm Reinisch schrieb:
> Peter Dannegger schrieb:
>> Nicht nur das, der Zusammenhang zwischen Bits und Ports geht auch
>> verloren.
>> Wenn ich damit z.B. einen 8Bit-DAC ansteuern will, kriege ich zwischen 2
>> Werten riesige Spikes. Das ist nicht zu gebrauchen.
>
> das ist für mich nicht trivial offensichtlich, warum ist das denn so?

Na stell dir einfach vor, dein DAC wäre an 4 Pins von PORTC und 4 Pins 
von PORTB angeschlossen. Und jetzt willst du den Analogwert von 0x7F auf 
0x80 ändern. Da du nicht beide Ports in einem Befehl beschreiben kannst, 
sieht der DAC für kurze Zeit einen Zwischenzustand, z.B. 0x7F - 0x8F - 
0x80. Auf der analogen Seite ein Spike. Wenn man statt in Pins hingegen 
in Ports denkt, dann kann man den DAC an einen Port hängen und in 
einem Rutsch beschreiben.

Ich kenne das Arduino-API nicht. Aber es scheint als würde das HAL 
komplett von Ports abstrahieren und man hätte einfach nur eine Anzahl 
von Pins. Wenn man dann gar nur einen Pin per API-Aufruf setzen könnte, 
dann müßte man für obiges Beispiel 8 API-Rufe absetzen (es ändern sich 
ja alle 8 Pins) und hätte 7 Zwischenzustände. Ich hoffe mal, es ist 
nicht ganz so braindead ;)


XL

von Karl H. (kbuchegg)


Lesenswert?

Axel Schwenke schrieb:

> Ich kenne das Arduino-API nicht. Aber es scheint als würde das HAL
> komplett von Ports abstrahieren und man hätte einfach nur eine Anzahl
> von Pins. Wenn man dann gar nur einen Pin per API-Aufruf setzen könnte,
> dann müßte man für obiges Beispiel 8 API-Rufe absetzen (es ändern sich
> ja alle 8 Pins) und hätte 7 Zwischenzustände. Ich hoffe mal, es ist
> nicht ganz so braindead ;)

Das was du hier beschreibst ist ziemlich exakt das, wie die Arduino API 
von den Ports wegabstrahiert wurde.

Man kann natürlich noch immer über die PINx und PORTx Register zugreifen 
und ich denke, die besseren Arduino Programmierer machen das auch bei 
Bedarf. Aber zumindest bei den Fragern, die hier im Forum aufschlagen, 
löst der Gedanke, dass es da auch noch Ports gibt regelmässig 
Schweissausbrüche aus.

von Axel S. (a-za-z0-9)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Axel Schwenke schrieb:
>> ... Wenn man dann gar nur einen Pin per API-Aufruf setzen könnte,
>> dann müßte man für obiges Beispiel 8 API-Rufe absetzen (es ändern sich
>> ja alle 8 Pins) und hätte 7 Zwischenzustände. Ich hoffe mal, es ist
>> nicht ganz so braindead ;)
>
> Das was du hier beschreibst ist ziemlich exakt das, wie die Arduino API
> von den Ports wegabstrahiert wurde.

Tja. Man hätte ja auch ein API bauen können, wo man in einer Daten- 
struktur[1] mehrere Pins und deren gewünschte Zustände übergibt.
Und dann auf der anderen Seite der API alle Pins, die zum selben Port 
gehören, mit einem Schreibzugriff updaten.

Aber klar, das wäre zu kompliziert für die intendierte Zielgruppe :P


XL

[1] für ein Beispiel sehe man sich die Manpage zu select(3) an und
    wie da die fd_set Datenstruktur verwendet wird.

von chris (Gast)


Lesenswert?

Bei jeder API ist es so, dass sie bestimmten Beschränkungen unterliegt.
Wer könnte wohl auf die Idee kommen, einen 8 Bit ADC an einen Arduino 
anschließen zu wollen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.