Gast
#5540502
Was mache ich falsch? Bin gerade fast am heulen kopf gegen wand
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Wenn ich versuche das zu kompilieren, kommt immer ein warning. Wahrscheinlich zu Recht..
1 | |
2 | |
|
Anzeige
|
C - Casting Verständniss Problem
Gast
#5540502
Was mache ich falsch? Bin gerade fast am heulen kopf gegen wand
Wenn ich versuche das zu kompilieren, kommt immer ein warning. Wahrscheinlich zu Recht..
Gast
#5540508
bei deinen Shifts fehlt ein * (Stern)
Gast
#5540513
Ganz sicher??? Xmega hat IIRC nur 16-bittige Pointer..? Versuche mal die uint32_t durch uintptr_t zu ersetzen. STK500-Besitzer schrieb: > bei deinen Shifts fehlt ein * (Stern) Nö. Er versucht auf der Adresse zu rechenen. 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
Gast
#5540520
Marcus schrieb: > Was mache ich falsch? Hier mal schauen, lesen, verstehen: https://www.tutorials.at/c/11-zeiger.html
Gast
#5540523
Jim M. schrieb: > Xmega hat IIRC nur 16-bittige Pointer..? > > Versuche mal die uint32_t durch uintptr_t zu ersetzen. Das sieht schon besser aus.
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.. Auf was für einem System entwickelst du? 32 oder 64 bit? Kannst du mal ausgeben was die Größe des void Pointers ist?
Evtl. liegt da der Hund begraben.
Gast
#5540534
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?
Gast
#5540557
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) ...
Gast
#5540563
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 */
Gast
#5540564
Hi Marcus, bist noch nicht viel weiter gekommen. Weshalb aber ein neuer Thread? Vielleicht solltest Du beschreiben was du machen willst. Grüsse, René
Gast
#5540567
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.
Gast
#5540569
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?
Gast
#5540573
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é
Gast
#5540586
>> 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!
Gast
#5540593
Habe das gerade mal auf dem Rechner ausprobiert.
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?!
Gast
#5540602
> 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 ...
Gast
#5540605
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!
Jetzt haut es hin ;) Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|