Forum: Compiler & IDEs AVR hängt mit EEMEM


von frischling (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe es das erste mal geschafft das sich mein AVR aufhängt.
Zielsystem ist ein ATMega88.
Compiler ist der AVR GCC Version 1:4.9.2+Atmel3.5.0-1 .


Ich versuche ein zusammengesetztes Struct mit Initialisierungswerten im 
EEProm abzulegen.
Danach bekommen verschiedenen Objekte teile des "Config struct" per 
Pointer Referenz übergeben.

Im Originalprogramm konnte ich nicht nachvollziehen warum sich der 
Kontroller aufhängt.


Im Minimalbeispiel im Anhang wird die LED am Pin PD4 nicht 
eingeschaltet.
Kommentiere ich die Definitionen aus geht sie an.

Irgendwie schon auch ein die Initialisierung über die Bezeichner nicht 
zu funktionieren.
Ich dachte das sollte bei C++ so funktionieren ?

von frischling (Gast)


Lesenswert?

Es scheint als würde der Compiler aus der folgenden Definition 
Initialisierungscode im Flash ablegen :
1
struct ConfigCollection
2
      CCimEEPROM EEMEM =  {
3
                  CCimEEPROM.bli.var21  = 1,
4
                  CCimEEPROM.bli.var22  = 128,
5
                  CCimEEPROM.bli.var23  = 255,
6
7
                  CCimEEPROM.bli.var21  = 4,
8
                  CCimEEPROM.bli.var22  = 8,
9
                  CCimEEPROM.bli.var23  = 16,
10
                  CCimEEPROM.bli.var24  = 32,
11
12
                  CCimEEPROM.bli.var21  = 64,
13
                  CCimEEPROM.bli.var22  = 128,
14
                  CCimEEPROM.bli.var23  = 255,
15
                  CCimEEPROM.bli.var24  = 17
16
//                  :0B0000000000000000000000000000F5
17
//                  :00000001FF
18
                };
Vermutlich wird dabei der Anfang des SRAM überschrieben was den 
Controller voll gegen die Wand laufen lässt...

Und das hier schreibt in die .eep Datei :
1
struct ConfigCollection
2
      CCimEEPROM2 EEMEM =  {
3
                  1,128,255,
4
                  4,8,16,32,
5
                  64,128,255,17
6
//                  :0B0000000180FF040810204080FF1169
7
//                  :00000001FF
8
                };

Ich hätte vermutet das beide Wege äquivalent sind, weiss jemand warum 
das nicht so ist ?

von frischling (Gast)


Angehängte Dateien:

Lesenswert?

Struktur Konfig Klasse :

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

frischling schrieb:
> Es scheint als würde der Compiler aus der folgenden Definition
> Initialisierungscode im Flash ablegen :
>
1
> struct ConfigCollection
2
>       CCimEEPROM EEMEM =  {
3
>                   CCimEEPROM.bli.var21  = 1,
4
>                   CCimEEPROM.bli.var22  = 128,
5
>                   CCimEEPROM.bli.var23  = 255,
6
> 
7
>                   CCimEEPROM.bli.var21  = 4,
8
>                   CCimEEPROM.bli.var22  = 8,
9
>                   CCimEEPROM.bli.var23  = 16,
10
>                   CCimEEPROM.bli.var24  = 32,
11
> 
12
>                   CCimEEPROM.bli.var21  = 64,
13
>                   CCimEEPROM.bli.var22  = 128,
14
>                   CCimEEPROM.bli.var23  = 255,
15
>                   CCimEEPROM.bli.var24  = 17
16
> //                  :0B0000000000000000000000000000F5
17
> //                  :00000001FF
18
>                 };
19
>
> Vermutlich wird dabei der Anfang des SRAM überschrieben was den
> Controller voll gegen die Wand laufen lässt...
>
> Und das hier schreibt in die .eep Datei :
>
1
> struct ConfigCollection
2
>       CCimEEPROM2 EEMEM =  {
3
>                   1,128,255,
4
>                   4,8,16,32,
5
>                   64,128,255,17
6
> //                  :0B0000000180FF040810204080FF1169
7
> //                  :00000001FF
8
>                 };
9
>
>
> Ich hätte vermutet das beide Wege äquivalent sind, weiss jemand warum
> das nicht so ist ?

.bli wird 3x (teilweise) initialisiert während .bla und .blub nicht 
initialisiert werden.  Außerdem heißen die Kompinenten z.B. .bli oder 
.bli.var21, aber CCimEEPROM ist nicht der Name einer Komponente.

Vermutlich bricht der Compiler einfach mit einem Fehler ab und es wird 
ein altes Schrott-exe auf den µC geschrieben.

                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                                         
                                                                        
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.
Bitte reduzieren Sie die Anzahl der Zitatzeilen.

von frischling (Gast)


Lesenswert?

Johann,

könntest Du das main.cpp aus meinem ersten Post Kompilieren ?
Bei mir läuft es mit -std=c++11 und -warnall durch.

Es wird auch bei jedem Kompilerlauf hex, elf,eep und lss erzeugt.

blie wird vollständig initialisiert, denn es besteht nur aus 3 
Elementen.

>initialisiert werden.  Außerdem heißen die Kompinenten z.B. .bli oder
>.bli.var21, aber CCimEEPROM ist nicht der Name einer Komponente.

Genau so hatte ich es in Erinnerung.
Schreibe ich es so, bricht der Compiler ab.

Wie erklärt sich folgendes im LSS :
1
00000064 <_GLOBAL__sub_I_CCimEEPROM>:
2
  64:  eb e0         ldi  r30, 0x0B  ; 11
3
  66:  f0 e0         ldi  r31, 0x00  ; 0
4
  68:  88 e0         ldi  r24, 0x08  ; 8
5
  6a:  84 83         std  Z+4, r24  ; 0x04
6
  6c:  80 e1         ldi  r24, 0x10  ; 16
7
  6e:  85 83         std  Z+5, r24  ; 0x05
8
  70:  80 e2         ldi  r24, 0x20  ; 32
9
  72:  86 83         std  Z+6, r24  ; 0x06
10
  74:  80 e4         ldi  r24, 0x40  ; 64
11
  76:  80 83         st  Z, r24
12
  78:  87 83         std  Z+7, r24  ; 0x07
13
  7a:  80 e8         ldi  r24, 0x80  ; 128
14
  7c:  81 83         std  Z+1, r24  ; 0x01
15
  7e:  80 87         std  Z+8, r24  ; 0x08
16
  80:  8f ef         ldi  r24, 0xFF  ; 255
17
  82:  82 83         std  Z+2, r24  ; 0x02
18
  84:  81 87         std  Z+9, r24  ; 0x09
19
  86:  81 e1         ldi  r24, 0x11  ; 17
20
  88:  83 83         std  Z+3, r24  ; 0x03
21
  8a:  82 87         std  Z+10, r24  ; 0x0a
22
  8c:  08 95         ret

Mir scheint als würde der Compiler bei der Initialisierung mit 
Bezeichnern nicht ins .eep schreiben...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mit den Schweinereien von C++ bin ich nicht vertraut, jedenfalls machst 
du im Initializer (oder ist das ein Constructor?) Zuweisungen anstatt 
einen Named Initializer zu verwenden. Einfaches Beispiel:
1
struct S
2
{
3
    int i1, i2;
4
};
5
6
int i;
7
8
S t, s =
9
{
10
    t.i2 = i = 123,
11
    s.i1 = 1,
12
};

Die Zuweisungen werden dann in einem statischen Constructor durchgeführt 
(in _GLOBAL__sub_I_...), und diese Zuweisungen beziehen sich auf den 
RAM.

Was du wirklich willst ist aber
1
S, s =
2
{
3
    .i1 = 123,
4
    .i2 = 1,
5
};

von frischling (Gast)


Angehängte Dateien:

Lesenswert?

Hier die ScreenShots:

von frischling (Gast)


Lesenswert?

Konstruktor ist das keiner.
1. Weil er nicht definiert ist, obwohl ein struct wohl auch einen haben 
kann.
2. Initialiserlists eines Konstruktor werden mit ":" und nicht "=" 
eingeleitet.

So Schweinisch ist das im allgemeinen gar nicht. :)

Aber danke fürs helfen!

von frischling (Gast)


Lesenswert?

Es scheint so zu sein das die Initialisierung über den Elementbezeichner 
in C++ nicht erlaubt ist. :(((

Das ist irgendwie sehr sehr ungut...

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.