AVR hängt mit EEMEM

Gast #4579944
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 ?
Angehängte Dateien:
Gast #4579970
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 ?
Persönliche Seite #4580127
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.
Gast #4580268
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...
Persönliche Seite #4580294
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
};

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