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 ?
Es scheint als würde der Compiler aus der folgenden Definition
Initialisierungscode im Flash ablegen :
1
structConfigCollection
2
CCimEEPROMEEMEM={
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
structConfigCollection
2
CCimEEPROM2EEMEM={
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 ?
frischling schrieb:> Es scheint als würde der Compiler aus der folgenden Definition> Initialisierungscode im Flash ablegen :>
1
>structConfigCollection
2
>CCimEEPROMEEMEM={
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
>structConfigCollection
2
>CCimEEPROM2EEMEM={
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.
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...
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
structS
2
{
3
inti1,i2;
4
};
5
6
inti;
7
8
St,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
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!