Forum: Mikrocontroller und Digitale Elektronik SAMC20 ASF DmaDescriptor


von Simon (Gast)


Lesenswert?

Hallo zusammen,
ich versuche gerade den DMA Controller des SAMC20 in Betrieb zu nehmen 
und dafür habe ich mir das Beispiel "Quick Start for SAM ADC Driver with 
DMA - SAM C21 Xplained Pro" angeguckt. In diesem Beispiel wird folgendes 
gemacht:
1
// [transfer_descriptor]
2
COMPILER_ALIGNED(16)
3
DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;
4
// [transfer_descriptor]
Kann mir bitte jemand erklären, was da gemacht wird?

Vielen Dank!

Simon

von Tim S. (tseidel)


Lesenswert?

Nicht viel:

Es wird der Speicherplatz der Struktur des Types DmacDescriptor unter 
dem Sysmbol example_descriptor reserviert an einer Adresse in 
SECTION_DMAC_DESCRIPTOR, die durch 16 teilbar ist. Diese Ausrichtung 
(Alignment) an dieser 16 Byte Grenze ist nötig, damit die DMA Hardware 
darauf zugreifen kann.

Im späteren Verlauf des Programms muss der DMA Hardware die Adresse der 
Struktur mitgeteilt werden.

von Simon (Gast)


Lesenswert?

Hallo Tim,

vielen Dank für die erhellenden Worte.

Etwas verstehe ich aber noch nicht richtig.
Was für ein "konstrukt" ist die folgende Zeile?
1
DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;


Ich dachte eine Variablendeklaration sieht immer so aus:
1
int foo = 12;

von Tim S. (tseidel)


Lesenswert?

SECTION_DMAC_DESCRIPTOR ist ein define. Wahrscheinlich findest du es 
irgendwo in den Sourcen mit einer Compiler-Anweisung. Das ist streng 
genommen kein Programmcode, sondern nur ein Hinweis für den Compiler, in 
welche Section er die Variable legen soll.

Ansonsten steht da:
Type VariablenName;

Also genau so, wie du es kennst. Deklaration ohne Default-Wert.

von Jim M. (turboj)


Lesenswert?

Simon schrieb:
> DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;

Da sind Makros drin.

GCC "sieht" nach Macro Expansion im Präprozessor sowas ähnliches:
1
DmacDescriptor example_descriptor __attribute__((section("DMA_STUFF")));


Die Idee dahinter ist das "DMA_STUFF" nicht unbedingt im "normalen" 
Datensegment liegen muss. Einige µC haben nicht-kontinuierliche RAM 
Speicherbereiche, da muss man dem LD Linker mit sowas unter die Arme 
greifen.

von Simon (Gast)


Lesenswert?

Super, jetzt habe ich es verstanden.
Herzlichen Dank!

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.