mikrocontroller.net

Forum: PC-Programmierung Probleme bei IAR mit Deklarationen


Autor: Neez (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Eines vorweg, bin ein total Neueinsteiger was die Programmierung angeht!
Also falls es sich um ein simples Problem handelt bitte ein wenig 
nachsichtig sein ;-)!

Es geht um folgendes, ich arbeite mit dem IAR Workbench und habe einen 
bereits geschrieben Code erhalten den ich erweitere.
Dabei ist ein von Renesas für den R8C geschriebenes Header-File 
enthalten in dem ja die Register definiert werden.
//*****************************************************
C0MCTL15                  DEFINE 0x130F

. 
.
.

__data13 __no_init volatile unsigned char C0MCTL15 @ 0x130F;
#define c0mctl15  C0MCTL15
//*****************************************************

Ich möchte nun mit diesem Register weiterarbeiten und habe folgendes 
geschrieben.
//*****************************************************
union{ 
  struct{
    char  newdata:1;        
    char  invaldata:1;        
    char  msglost:1;        
    char  remactive:1;        
    char  rsplock:1;        
    char  remote:1;          
    char  recreq:1;          
    char  dummy:1;          
  } receive;
  struct{
    char  sentdata:1;      
    char  trmactive:1;         
    char  dummy1:1;        
    char  remactive:1;        
    char  dummy2:1;          
    char  remote:1;          
    char  dummy3:1;          
    char  trmreq:1;            
  } transmit;
  char  byte;
}can_mctl_def ;

union can_mctl_def c0mctl15;     <-- hierauf bezieht sich der Fehler
//*****************************************************

Mir wird nun die Fehlermeldung ausgegeben:

Error[Pe147]: declaration is incompatible with "unsigned char volatile 
__data13 C0MCTL0"
Error[Be022]: location address not allowed for initialized variables 
(writable variables without the __no_init attribute)

Wie sollte es denn sonst heißen?

Danke schonmal für die Hilfe!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neez schrieb:

> Wie sollte es denn sonst heißen?

Das wird so überhaupt nicht funktionieren.

c0mctl15
ist bereits eine Variable.
Du kannst nicht eine zweite Variable mit demselben Namen erzeugen, die 
eine Union ist.

Was du höchst wahrscheinlich wolltest:

Über c0mctl15 eine union drüber legen, so dass du auf die einzelnen Bits 
in c0mctl15 über einen Namen zugreifen kannst.

Was vielleicht gehen könnte
__data13 __no_init volatile union can_mctl_def c0mctl15_bits @ 0x130F;

Du definierst dir also eine andere Variable die besagte Union ist und 
legst sie an dieselbe Speicheradresse

Was auf jeden Fall gehen sollte:
Einen Pointer definieren der auf so eine Union zeigt und den mit der 
Adresse von c0mctl15 (auf union* gecastet) zu initialisiern. Nach ein 
wenig Makro-Magic drüber, um den Pointer und damit den * beim Zugriff zu 
verstecken.

> Eines vorweg, bin ein total Neueinsteiger was die Programmierung
> angeht!

Ganz schlechte Voraussetzungen

> Also falls es sich um ein simples Problem handelt bitte
> ein wenig nachsichtig sein ;-)!

Ganz im Gegenteil. Was du vorhast geht schon mehr in die Kategorie: 
Tricksen bis zum Abwinken. Da muss man in C schon ein wenig was drauf 
haben um das hinzukriegen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.