C++-Template-Bibliothek für AVR

OP #4754615
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe beschlossen, sowohl meine HW für Projekte (werde nur noch SMD 
machen) zu ändern, als auch meine eigene AVR-C-Bib zu erneuern. Ich 
werde die alte
C-Bib durch eine C++-Template (header-only) Bib ersetzen. Da ich beim
googlen auf wenig aktuelles / brauchbares gestoßen bin, nun hier die 
Frage, wer mir hier ggf. noch einen Tip geben kann, was man sich evtl 
anschauen sollte.

VG
 Wilhelm
(Firma: EDF) #4754662
Lesenswert?
• ▲
▼
Gute Idee,

ich habe mal an einem System gearbeitet welches Templates teilweise 
einsetzt. Andere Teile sind als Komponenten ausgelegt, bei denen auch 
darauf geachtet wurde die Abhängigkeiten unter einander durch verbinden 
über Pointer zu realisieren. Wodurch die Module sehr schön zu Testen und 
zu Warten wurden. Allerdings haben Pointer den Nachteil dass sie im RAM 
gespeichert werden. Dies könnte man über eine Template LIB vermeiden.
Im Idealfall kann man eine Art Baukastensystem erstellen, Bei dem man 
gewünschte Teile auf einer höheren Abstraktionsebene zusammensetzt um 
ein System zu erhalten.
Dein Projekt würde ich daher gerne verfolgen.

DerDan
(Firma: Torrox.de) #4754752
Lesenswert?
• ▲
▼
Hallo Wilhelm,

Wilhelm M. schrieb:

> Frage, wer mir hier ggf. noch einen Tip geben kann, was man sich evtl
> anschauen sollte.

Diese Talks von der Meeting C++ könnten ganz inspirierent sein:

https://www.youtube.com/watch?v=k8sRQMx2qUw
https://www.youtube.com/watch?v=AKAYc9ZFBhk
https://www.youtube.com/watch?v=FnGCDLhaxKU

Ich habe eine Bluetooth LE library in C++ geschrieben:

https://github.com/TorstenRobitzki/bluetoe

Der Link hier hat mir bei der Arbeit mit GCC und bare metal jede Menge 
Zeit gespart: 
https://www.gitbook.com/book/arobenko/bare_metal_cpp/details

Ansonsten denke ich, dass man in einer Library, die relativ viel 
Plattform-Unabhängig abstrahiert, bei den Funktionalitäten sehr weit 
oben ansetzen muss. Also keine Pins + Timer, aus denen ich mir dann 
einen PWM zusammen bauen kann, sondern die Abstraktion muss der PWM sein 
und wenn ich auf der Zielplattform kein PWM habe (oder nicht genügend), 
dann kann die Library das immer noch mit einem Timer selbst 
implementieren. Im Ideallfall hat die Zielhardware aber PWM peripherals 
und kann das direkt darauf Mappen.

So etwas lässt sich deutlich einfacher in C++11/14/17 implementieren 
(constexpr, variadic templates etc.). Leider schließt man damit dann die 
in der embedded Welt relativ populären Compiler wie IAR und Keil aus.

mfg Torsten
OP #4754916
Lesenswert?
• ▲
▼
Hallo Torsten,

danke für die Hinweise: das Buch kannte ich in der Tat noch nicht!

Er wird (wenn überhaupt) etwas ab C++17 (bzw. C++1z derzeit) aufwärts 
geben. Das mache ich im non-embedded Umfeld auch - alles andere möchte 
ich einfach
nicht mehr!

Wenn ich ein bißchen was zusammen habe, gibts hier den Link auf das Repo 
...

VG
 Wilhelm
Gast #4754974
Lesenswert?
• ▲
▼
Gute Sache - zur maximalen Verwirrung des Programmierers.

Halt, eigentlich gibt es für eine C++ Template-Bibliothek zwei Klassen 
von Programmierern:

1. Der Entwickler der Bibliothek, der zeigen will was für ein toller 
Hecht er ist.

2. Opfer, die die Bibliothek aus irgendeinem Grund benutzen müssen oder 
wollen. Die sich dann mit den wunderbaren Fehlermeldungen bei 
Template-Problemen herumschlagen müssen. Die höllisch aufpassen müssen, 
dass dem C++-Compiler die Codegenerierung halbwegs gelingt und nicht 
irgendein interessantes Feature von C++ dazwischenfunkt. Die den 
besonderen Spass genießen mit einem Debugger Template-Code in 
Einzelschritten abzuarbeiten.

Jau, und das alles um ein paar Bits in ein paar lächerlich einfachen 
AVR-Registern so kompliziert wie möglich zu setzen. Auf der nächsten 
Maker-Party ist man damit sicher der Held.
OP #4755006
Lesenswert?
• ▲
▼
Ich möchte weder zeigen, dass ich ein toller Held bin, noch möchte ich 
andere zu Opfern machen! Also bitte, lasst wenigstens diesen Thread frei 
von Polemik.

Ich kann verstehen, dass C++ nicht jedermanns Sache ist. Wer Konstrukte 
wie die folgenden nicht mag, der sollte sich hier zurückhalten:
1
#include "mcu.h"
2
#include "timer.h"
3
#include "usart.h"
4
#include "event.h"
5
#include "ports.h"
6

7
int main()
8
{
9
    EventManager<Timer8Bit<0>>::start();
10

11
    PortB::Set(0);
12

13
//    Usart<0>::init();
14
    Usart<0, 64, ATMega8>::init();
15

16
//    uint8_t byte;
17
//    auto ok = Usart<0>::getc(byte);
18

19
    if (auto ok = Usart<0>::getc()) {
20
        uint8_t b = *ok;
21
    }
22

23
    get<ATMega8::Port, C>()->ddr = 0xff;
24
    get<ATMega8::Port, C>()->out = 0;
25
    get<ATMega8::Port, B>();
26

27
    EventManager<Timer8Bit<0>>::run();
28
}

VG
 Wilhelm
#4755062
Lesenswert?
• ▲
▼
Wilhelm M. schrieb:
> get<ATMega8::Port, C>()->ddr = 0xff;

Solchen Code mag ich tatsächlich nicht. Bezüglich Wiederverwendbarkeit 
ist das ja wirklich nicht schön. Zumindest der Zielprozessor sollte 
schon, wenn überhaupt erforderlich, nur an einer einzigen Stelle des 
Programms definiert wenn müssen. Noch schöner wäre es, wenn das 
automatisch irgendwo in einem Systemheader passieren würde.

Aber da lässt sich mit ein paar weiteren typedefs noch was retten.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren