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
??? 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
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?"
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
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.
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
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
C++-Template Bib **************** https://github.com/KonstantinChizhov/Mcucpp C++14 AtmelStudio ***************** Beitrag "Re: ASF und C++ im Atmel Studio 7" Beitrag "Re: DCF77 Uhr in C mit ATtiny26"
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.
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
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
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(); |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.