Forum: Mikrocontroller und Digitale Elektronik C++-Template-Bibliothek für AVR


von Wilhelm M. (wimalopaan)


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

von Oliver S. (oliverso)


Lesenswert?

???

Machs einfach. Dazu brauchst du dir gar nichts anzuschauen.
Hier im Forum gibt es den ein paar Beiträge mit solchen Ansätzen, dank 
etwas der rudimentären Suchfunktion sind die allerdings nicht ganz 
einfach zu finden.

Oliver

von Eric B. (beric)


Lesenswert?

Wilhelm M. schrieb:
> einen Tip geben kann, was man sich evtl anschauen sollte.

Dieses Buch: http://www.springer.com/us/book/9783642429156
Und hier im Forum disen Thread: 
Beitrag "C++ auf einem MC, wie geht das?"

von D. F. (Firma: EDF) (derdan)


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

von Eric B. (beric)


Lesenswert?

Ich schrieb:

> Beitrag "C++ auf einem MC, wie geht das?"

Und in dem Thread gefunden: https://code.google.com/archive/p/savr/

Ich glaube das ist schon das was du suchst.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


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

von Wilhelm M. (wimalopaan)


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

von MCUCPP (Gast)


Lesenswert?


von MCUCPP (Gast)


Lesenswert?

C++14 AtmelStudio
*****************
Beitrag "Re: (dauerhaft) aktuelle Toolchain"

von Jack (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Na ja, einer der wesentlichen Vorteile des AVR in diesem Zusammenhang 
ist, daß da eh kaum einer drauf debugt. Der Nachteil ist also achonmal 
keiner ;)

Oliver

von Wilhelm M. (wimalopaan)


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

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Deinen Code
1
EventManager<Timer8Bit<0>>::start();

Könntest du über Typedef lesbarer schreiben:

1
typedef EventManager<Timer8Bit<0>> CyclicTimer;
2
3
CyclicTimer::Init();
4
CyclicTimer::Start();
5
CyclicTimer::Run();

von Oliver S. (oliverso)


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

von Wilhelm M. (wimalopaan)


Lesenswert?

Es freut mich, wenn jemand tatsächlich den Code liest und sich Gedanken 
macht.

Mittlerweile geht es so:
1
using PortB = Port<DefaultMcuType::PortRegister, B>;

Das get<>() Funktionstemplate ist im öffentlichen API überflüssig 
geworden... (das Ganze ist auch erst 1 Tag alt)

VG

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.