Forum: Mikrocontroller und Digitale Elektronik Umwandlung Union-Struktur IAR-> ICC AVR


von Jan P. (fire)


Lesenswert?

Morgen zusammen

Eine kurze Frage:

Wie müsste die folgende IAR-Anweisung in ICC AVR (oder von mit aus auch 
gcc) aussehen?
1
00100 __regvar __no_init union _fastTemp{
2
00101   unsigned int word;
3
00102   struct{
4
00103     unsigned char LByte;
5
00104     unsigned char HByte;  
6
00105   };
7
00106 } fastTemp @12;



Mein aktueller Ansatz sieht so aus:
1
union temp{
2
    unsigned int word;
3
     struct egal{
4
            unsigned char LByte;
5
        unsigned char HByte; 
6
    }egal;
7
  }fastTemp;

(Den Bezeichner "egal" habe ich gewählt da mir gerade kein anderer Name 
einviel, der Compiler aber keine Struktur ohne Namen erstellen will ^^)

Allerdings verschwindet da dann immer das HByte sobald ich mir das 
Programm im Simulator ansehe.

von Jan (Gast)


Lesenswert?

Keiner eine Idee?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> ... der Compiler aber keine Struktur ohne Namen erstellen will

Will er das nicht? Das ist merkwürdig. Hat Imagecraft da irgendwelche 
Probleme?

Warum wechselst Du von IAR zu Imagecraft?

von Karl H. (kbuchegg)


Lesenswert?

Jan Pater wrote:

> Mein aktueller Ansatz sieht so aus:
>
>
1
union temp{
2
>     unsigned int word;
3
>      struct egal{
4
>             unsigned char LByte;
5
>         unsigned char HByte;
6
>     }egal;
7
>   }fastTemp;
8
>
>
> (Den Bezeichner "egal" habe ich gewählt da mir gerade kein anderer Name
> einviel, der Compiler aber keine Struktur ohne Namen erstellen will ^^)
>
> Allerdings verschwindet da dann immer das HByte sobald ich mir das
> Programm im Simulator ansehe.

Was heist 'verschwinden'? Ein Byte kann nicht verschwinden.

Zum Problem:
Macht der Compiler ein Padding? Sprich schiebt er zwischen
den LByte unf HByte ein zusätzliches Byte ein? Mach doch mal
einen sizeof(fastTemp) und schau dir das Ergebnis an. Werte
ungleich 2 sind beunruhigend.

Ansonsten: Zeig doch mal etwas Code dazu. Obiges ist ja nur
die Deklaration einer Dtaenstruktur. Damit lässt sich
nur schwer feststellen, was denn in deinem Programm schief geht.
Am besten wäre es, wenn du rund um die Datenstruktur ein kleines
Testprogramm schreiben würdest, welches
* minimal ist
* den Fehler zeigt
So werden sie dann am schnellsten geholfen.


von mthomas (Gast)


Lesenswert?

Sieht so aus, also wuerden gleich mehrere herstellerspezifische IAR 
Erweiterungen genutzt, die im "aktuellen Ansatz" einfach nicht portiert 
wurden.

Soweit erinnert (habe wenig praktische Erfahrung mit IAR-EWAVR):
__regvar  - C-Variable/Strucutur/Union an ein Hardware-Register binden
__no_init - keine Initialisierung beim Startup (da keine "echte 
Speicheradresse dafür)
@12; - legt Speicheraddresse der Variable/Struct/Union fest.

Das ganze dient wohl dazu, möglichst schnell die beiden Bytes einer 
16-bit Variable bei "13:12" zu lesen/zu schreiben. Statt sich mit 
herstellerspezifischen Erweiterungen herzumzuschlagen, dürfte es 
einfacher und portabler sein, die Funktionalität mit ein paar 
Inline-Funktionen/Makros nachzubilden.


von Jan P. (fire)


Lesenswert?

Das ganze bezieht sich auf das Atmel-Projekt AVR443.

Zu finden hier: 
http://www.atmel.com/dyn/resources/prod_documents/doc2596.pdf

IAR-Quellcode hier: 
http://www.atmel.com/dyn/resources/prod_documents/avr443.zip



Die fastTemp-Variable wird in der PCInt0-Interruptroutine benötigt.

Die sieht so aus:
1
#pragma interrupt_handler PCINT0_handler:iv_PCINT0
2
//!
3
void PCINT0_handler()
4
{
5
  unsigned char *pTemp;
6
  fastTemp.word = ((PIN_HALL & hallMask)>>1);  // Read Hall, Mask Pins, shift to use as pointer offset
7
//  Line below is desirable performance wise, but causes an internal error in compiler
8
//  fastTemp.LByte = (PIN_HALL & HALL_MASK)>>1;   // Read Hall, Mask Pins, shift to use as pointer offset
9
10
  pTemp = pDrvPattern + fastTemp.word;
11
//  TCCR0A = fastTemp.HByte; //Disable PWM outputs (and thereby close low side FET)
12
//  TCCR2A = fastTemp.HByte; //Disable PWM output (and thereby close low side FET)
13
14
  PORT_MC = *(pTemp);    //Change drive levels on high side
15
16
  TCCR0A = *(pTemp + PATTERN_COM0_OFFSET);    // Reconfigure output compare operation for T0
17
  TCCR2A = *(pTemp + PATTERN_COM2_OFFSET); // Reconfigure output compare operation for T2
18
  count--;
19
}


Wenn ich die Struktur so aufbauen will (also keinen Namen angebe):
1
union temp{
2
    unsigned int word;
3
     struct {
4
            unsigned char LByte;
5
           unsigned char HByte; //Hbyte = Zero
6
    };
7
  }fastTemp;

Gibt mir der Compiler die Fehlermeldung:

sensor_three_phase_BLDC.c(108): field name missing


Mit verschwinden meine ich, das ich im AVR-Studio die Struktur über 
einen Watch beobachte.

Sobald aber der erste Programmdurchlauf beendet ist, habe ich nur noch 
das LowByte im Watch, das HByte ist verschwunden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vollkommen anonyme Strukturen sind eine Erweiterung des C-Standards und 
nicht von jedem Compiler unterstützt.

1
union tagname_u
2
{
3
  unsigned int word;
4
  struct tagname_s
5
  {
6
    unsigned char LByte;
7
    unsigned char HByte; //Hbyte = Zero
8
  } name_s;
9
} name_u;

Du kannst tagname_s/tagname_u weglassen (sofern Du nirgends weitere 
Instanzen des gleichen Datentyps deklarieren willst), aber nicht 
name_s/name_u.

Wenn AVR-Studio Dinge verschwinden lässt, würde ich annehmen, daß das 
ein Fehler im AVR-Studio-Debugger ist.

von Johnny B. (johnnyb)


Lesenswert?

Hallo zusammen

Schlage mich gerade mit dem IAR rum und bin auf diesen thread gestossen.
IAR verwendet leider neuerdings(?) solche anonymen Strukturen und Unions 
in den Headerdateien zu den Mikrocontrollern mit den 
Peripheriedefinitionen.

Frage:
Wie bekommt man mit der obigen Deklaration denn einen Pointer auf LByte 
und HByte?

Ich habs (auf das obige Beispiel angepasst) versucht mit:

unsigned char *PointerAufByte;

PointerAufByte = (unsigned char *)&LByte;

bzw.

PointerAufByte = (unsigned char *)&HByte;

In "PointerAufByte" steht dann aber leider nicht immer was gescheites 
drin.
Hat jemand eine Idee, wie man das machen müsste, damit es immer klappt?

von Johnny B. (johnnyb)


Lesenswert?

Ooooops, es geht genau wie ich oben geschrieben hatte. In einem Define 
hatte ich nur schon vorher etwas falsches definiert gehabt und so waren 
einige Bezeichnungen vertauscht.

Hat sich also erledigt und läuft jetzt.

Schönes Wochenende

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.