Das sieht doch eher so aus, als würde bewusst mit den Adressen
gearbeitet, auf die "dest" zeigt.
Eventuell liegt es einfach daran, dass Zeiger (soweit ich weiß, bitte
berichtigt mich sonst) normalerweise die Breite der Systemarchitektur
aufweisen und die kleiner als 32 Bit ist.
Gruß
Sam
Wenn der XMEGA nur 16 Bittige Zeiger hat, wieso gibt es dann das
Register "DESTADDR2" ?
Es kommt jedoch jetzt immer noch eine Warnung. Ist ja auch verständlich.
Er meckert das dass schieben überläuft..
Tobias B. schrieb:> Auf was für einem System entwickelst du? 32 oder 64 bit?>> Kannst du mal ausgeben was die Größe des void Pointers ist?> sizeof(void*)> Evtl. liegt da der Hund begraben.
Das ist für nen XMEGA, schreibe den Source in C. Kann die Größe jetzt
leider nicht ausgeben. Mein Rechner ist jedoch ein 64 Bit. Aber das
sollte damit doch nichts zu tun haben?
Dein Problem ist, dass du DMA-Adressen und C-Pointer mischt. Bei einigen
CPU-Architekturen sind die nicht identisch. Die XMEGA haben (bei deinem
Compiler) 16-Bit C-Pointer aber 24-Bit DMA-Adressen. Mach dir eine
Hilfsfunktion, die von C-Ptr nach DMA-Adresse umwandelt - im trivialen
Fall ist das ein Cast, bei einigen Architekturen ist aber mehr nötig
(Adressoffsets, etc) ...
foobar schrieb:> Dein Problem ist, dass du DMA-Adressen und C-Pointer mischt. Bei> einigen> CPU-Architekturen sind die nicht identisch. Die XMEGA haben (bei deinem> Compiler) 16-Bit C-Pointer aber 24-Bit DMA-Adressen. Mach dir eine> Hilfsfunktion, die von C-Ptr nach DMA-Adresse umwandelt - im trivialen> Fall ist das ein Cast, bei einigen Architekturen ist aber mehr nötig> (Adressoffsets, etc) ...> typedef uint32_t dmaaddr_t;> #define cptr2dma(cptr) ((dmaaddr_t)(uintptr_t)(cptr))>> ...> {> dmaaddr_t addr = cptr2dma(dest);>> DMA.CH0.DESTADDR0 = addr;> DMA.CH0.DESTADDR1 = addr >> 8;> DMA.CH0.DESTADDR2 = addr >> 16;> }
Ich habe mir das hier abgesehen..
/*
* DMAController.cpp
*
* Created on: 16.01.2013
* Author: Nicolas Göddel
*
*
https://www.mikrocontroller.net/articles/Speicherdirektzugriff_(DMA)_mit_dem_ATxmega#DMAController.cpp
*/
René H. schrieb:> Hi Marcus,>> bist noch nicht viel weiter gekommen. Weshalb aber ein neuer Thread?>> Vielleicht solltest Du beschreiben was du machen willst.>> Grüsse,> René
Hi Rene,
ich versuche ( einen Post über deinen (link) ) die C++ Bibliothek in C
zu schreiben.
foobar schrieb:> typedef uint32_t dmaaddr_t;> #define cptr2dma(cptr) ((dmaaddr_t)(uintptr_t)(cptr))>> ...> {> dmaaddr_t addr = cptr2dma(dest);>> DMA.CH0.DESTADDR0 = addr;> DMA.CH0.DESTADDR1 = addr >> 8;> DMA.CH0.DESTADDR2 = addr >> 16;> }
Das sieht gut aus. Keine Warnings mehr.
Und jetzt steht dort auch die Adresse der Variablen drin oder deren
Inhalt?
Marcus schrieb:> foobar schrieb:>> typedef uint32_t dmaaddr_t;>> #define cptr2dma(cptr) ((dmaaddr_t)(uintptr_t)(cptr))>>>> ...>> {>> dmaaddr_t addr = cptr2dma(dest);>>>> DMA.CH0.DESTADDR0 = addr;>> DMA.CH0.DESTADDR1 = addr >> 8;>> DMA.CH0.DESTADDR2 = addr >> 16;>> }>> Das sieht gut aus. Keine Warnings mehr.> Und jetzt steht dort auch die Adresse der Variablen drin oder deren> Inhalt?
Die Adresse.
Grüsse,
René
>> Das sieht gut aus. Keine Warnings mehr.>> Und jetzt steht dort auch die Adresse der Variablen drin oder deren>> Inhalt?>> Die Adresse.>> Grüsse,> René
Das mit dem Makro ist echt ne klasse Idee ;) Besten dank!
Wenn ich mit "printf" die ganze Adresse ausgeben möchte, kommt für mich
eine richtige Adresse raus.
Wenn ich jedoch die Variable der Funktion "foo()" übergebe und das
zerlege, kommt was ganz anderes raus?!
> Wenn ich jedoch die Variable der Funktion "foo()" übergebe und> das zerlege, kommt was ganz anderes raus?!
Der letzte Shift ist falsch (muss >>24 sein, nicht >>32). Und mit %x
statt %d fällt das Vergleichen leichter ...
foobar schrieb:>> Wenn ich jedoch die Variable der Funktion "foo()" übergebe und>> das zerlege, kommt was ganz anderes raus?!>> Der letzte Shift ist falsch (muss >>24 sein, nicht >>32). Und mit %x> statt %d fällt das Vergleichen leichter ...
Klasse!