Huhu!
C++:
Ich bin ja gerade dabei eine kleine Lib für meinen STM aufzubauen und
bin beim DMA angelangt. Mein Ziel ist es immer, mit möglichst wenig
Handgriffen, aber vielen nicht zwingenden Funktionsaufrufen, die
Peripherie zum laufen zu bekommen. Auch die (globalen) #defines von ST
haben mich gestört, weshalb sie in eine Klasse wanderten.
So kann ich beispielsweise das Ethernet über eine Handvoll Funktionen
zum laufen bekommen oder die IOs mit einer Funktion im AF-Modus
initialisieren. Wo immer es geht, arbeite ich mit Lookuptables, eine
if-else Abfrage ist das höchste der Gefühle. 1MB ROM ist mehr als genug
für meine Zwecke.
Allerdings hänge ich am DMA. So starte ich beispielsweise mit Uart:
Mein Problem bezieht sich auf die Auswahl des Streams und Channels für
die jeweilige Peripherie. So kann ich beispielsweise die
Register-Adresse des jeweiligen Uarts an die DMA-Klasse übergeben. Ich
habe schon einiges probiert aber irgendwie läuft es immer auf
irgendwelche Schleifen / switch-cases hinaus um den richtigen
Stream/Channel zu bekommen.
Habt ihr einen Denkanstoß für mich?
Danke schonmal!
Grüße
Reggie
Servus,
guck dir mal an wie das Uwe Becker macht:
http://mikrocontroller.bplaced.net/wordpress/?page_id=744
Ich finde das ist genial gelöst.
> Ich> habe schon einiges probiert aber irgendwie läuft es immer auf> irgendwelche Schleifen / switch-cases hinaus um den richtigen> Stream/Channel zu bekommen.
Eine Schleife ist mitunter das Beste, was man machen kann
(Codeoptimierung). Ein switch case erhöht dafür die Übersichtlichkeit...
aSma>> schrieb:> Ich finde das ist genial gelöst.
Welche Lib meinst du denn da konkret?
aSma>> schrieb:> Eine Schleife ist mitunter das Beste, was man machen kann> (Codeoptimierung). Ein switch case erhöht dafür die Übersichtlichkeit...
Was meinst du mit Codeoptimierung? Für den Speed eignet sich doch wohl
ein Pointer auf die richtige Stelle allemal besser als ein 100er-Array
durchzusuchen.
Ich habe mir jetzt ein ziemlich unschönes Konstrukt gebaut, damit komme
ich zwar weiter, aber vllt hat ja jemand noch ne Idee. Vllt wirds auch
deutlicher was ich eigentlich bezwecken möchte :>
1
// Übergabe einer Peripherie und der ID (z.B. UART1, UART3, SPI2, ...)
Zumindest ich habe Dein Problem noch nicht verstanden.
Was genau stört Dich?
Etwas 'knackiger' wird es vielleicht mit Templates, aber das ist eher
eine Geschmacksfrage.
Ob man das nicht geschickter lösen könnte. Am besten wäre die Übergabe
der Peripherie-Adresse (zb. UART1, UART3, SPI2). Ich komme aber nicht
drauf, wie ich ohne Schleife den korrekten Offset aus der Lookuptable
bekommen könnte.
Torsten C. schrieb:> Etwas 'knackiger' wird es vielleicht mit Templates, aber das ist eher> eine Geschmacksfrage.
Damit habe ich noch nie geschafft. Aber ich denke, mein Problem bleibt
trotzdem das Abarbeiten einer Loop, wenn ich die Peripherie-Adresse
mitgeben möchte.
Zumindest ich habe Dein Problem noch immer nicht verstanden.
Ich sehe in diesem Thread weder eine Loop noch ein switch-case.
Falls nur ich dieses Problem habe, bitte ich um Entschuldigung.
Dann hatte ich wohl Tomaten auf den Augen.
Torsten C. schrieb:> Falls nur ich dieses Problem habe, bitte ich um Entschuldigung.> Dann hatte ich wohl Tomaten auf den Augen.
Hehe, macht ja nix.
Reginald L. schrieb:> Am besten wäre die Übergabe> der Peripherie-Adresse (zb. UART1, UART3, SPI2).
Bisher übergebe ich ja eine Konstante aus dem Enumerator. Das Loopen
entsteht, falls ich die Peripherie-Adresse übergeben werde. Und Loops
mag meine Rolex nicht :>
Und hübsch finde ich meine Lösung auch nicht. Hätte ja sein können, dass
man mir auch hier, wie bei meinen anderen Problemchen auch, andere,
schönere Möglichkeiten aufzeigt. Falls nicht, dann halt nicht :)