Forum: PC-Programmierung Probleme bei IAR mit Deklarationen


von Neez (Gast)


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!

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.