Umwandlung Union-Struktur IAR-> ICC AVR

OP #585887
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.
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.

Gast
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.

OP
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.
Persönliche Seite
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.
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?
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.