C-cast der besonderen Art MSP430

OP #3872230
Lesenswert?
• ▲
▼
Moin,
ich habe zu einem Experimenterboard von TI eine Demo-SW,
in der eine Code-Stelle ist, die mir etwas verwirrend vorkommt:
1
DMA0DA = (void (*)())MemstartTest;

DMA0DA ist ein DMA-Register
In der controllerspezifischen Headerdatei definiert:
SFR_20BIT(DMA0DA);    /* DMA Channel 0 Destination Address */
vom Typ __SFR_FARPTR
MemstartTest ist ein fixer Wert:
1
#define MemstartTest      0x40000
Was soll jetzt dieses cast-Konstrukt void (*)() ?

Besten Dank schon einmal

Dietmar
#3872633
Lesenswert?
• ▲
▼
Dietmar Sch. schrieb:
> Vielleicht eine wichtige Zusatzinfo:
> Nicht nur, das ich das nicht verstehe ;-) /

Wie schon gesagt: das ist ein Funktionspointer.

> es gibt auch einen Fehler:
> #173-D invalid type conversion

Das wird wohl der __SFR_FARPTR sein. Der Name suggeriert bereits, dass 
es sich dabei wohl nicht um einen normalen Pointer (wohl 16 Bit) 
handelt, sondern um einen Pointer, der 24 Bit umfasst.

Der
1
#define MemstartTest      0x40000
passt da auch dazu, weil die Zahl für einen 16 Bit Wert zu gross ist.

Wenn da nicht irgendeine besondere Absicht dahinter steckt, dann hätte 
der Cast überhaupt nie so geschrieben werden sollen. Ändere das mal um 
auf
1
DMA0DA = (__SFR_FARPTR)MemstartTest;


Und besorg dir ein C Buch und lies über Funktionspointer nach. Wer 
Computer programmieren will, sollte seine Programmiersprache kennen! 
Auch wenn ich durchaus zugestehe, dass Funktionspointer nicht tägliches 
Brot sind.
OP #3872801
Lesenswert?
• ▲
▼
Was bisher geschah ;-)
Ich gehöre tatsächlich zu den stolzen Besitzern mehrerer
Bücher über C- ja auch den K&R.
Zum Thema:
Ich habe mittlerweile herausgefunden, das TI die Art:
2.2.2 Assigning a Pointer to a location greater than 0xFFFF
In CCEv3:
  DMA0DA = (void (*)())MemstartTest;
In IAR:
  __data16_write_addr((unsigned short)&DMA0DA, MemstartTest );
im CCE (Vorläufer des CCS) empfiehlt.
Heute ist die Version vom IAR präferiert.
1
DMA0DA = (__SFR_FARPTR)MemstartTest;
ergibt auch eine "invalid type conversion"

Trotzdem besten Dank für die Belehrung
Gast #3874608
Lesenswert?
• ▲
▼
Ja, das (void (*)()) soll wohl wirklich nur einen 20-Bit-Zeigerwert 
erzeugen.
Das kannst Du auch im Headerfile sehen.
Ich habe in meinen Quellen DMA0DAL mit einem 16-Bit-Wert beschrieben. 
Das funktioniert genau so gut, solange der zu schreibende Wert in 16 Bit 
passt.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.