Probleme bei IAR mit Deklarationen

Gast #1752101
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.
1
//*****************************************************
2
C0MCTL15                  DEFINE 0x130F
3

4
. 
5
.
6
.
7

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

Ich möchte nun mit diesem Register weiterarbeiten und habe folgendes 
geschrieben.
1
//*****************************************************
2
union{ 
3
  struct{
4
    char  newdata:1;        
5
    char  invaldata:1;        
6
    char  msglost:1;        
7
    char  remactive:1;        
8
    char  rsplock:1;        
9
    char  remote:1;          
10
    char  recreq:1;          
11
    char  dummy:1;          
12
  } receive;
13
  struct{
14
    char  sentdata:1;      
15
    char  trmactive:1;         
16
    char  dummy1:1;        
17
    char  remactive:1;        
18
    char  dummy2:1;          
19
    char  remote:1;          
20
    char  dummy3:1;          
21
    char  trmreq:1;            
22
  } transmit;
23
  char  byte;
24
}can_mctl_def ;
25

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

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!
#1752232
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
1
__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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren