Forum: Compiler & IDEs pointer struct parameter übergabe / fehler?


von gert (Gast)


Lesenswert?

hi

[projekt lcd display] - habe ein struct:

typedef struct {
  uint16_t  color;
} tSquare;

und eine zugehörige funktion

void ShowSquare(tSquare *pSquare) {

  glcdSetFgColor(pSquare->color);
  glcdRectangle(10,20,15,25);
}


in MAIN wird folgendes aufgerufen:

tSquare square;
square.color = BLUE; //BLUE ist definiert constante
ShowSquare(&square);

==> das rechteck wird nicht blau

auch wenn ich das struct nicht mittels pointer übergebe sondern per 
value geht es nicht

KANN ES SEIN DASS DIE ÜBERGABE MITTELS STRUCT IM NEUEN WINAVR EINEN BUG 
HAT (es wird ein default makefile verwendet) ?

falls ich BLUE direkt in der funktion glcdSetFgColor aufrufe, wird es 
blau dargestellt

danke

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich tippe mal darauf, dass 16bit nicht reichen, um die Farbe zu 
übergeben? Welchen Datentyp erwartet denn glcdSetFgColor(...)?

von gert (Gast)


Lesenswert?

16 bit - ist auch uint16_t
falls ich glcdSetFgColor(BLUE) direkt verwende funktioniert es ja auch 
...

von Hugo Mildenberger (Gast)


Lesenswert?

Ein alignment - Problem? Die  Felder eines structs werden vom Compiler 
normalerweise (wegen des schnelleren Zugriffs) auf Maschinenwortbreite 
ausgerichtet. Was ergibt sizeof(tSquare)? Mit 8 oder 16-Bit alignment 
sollte 2 herauskommen, mit 32-Bit alignment kommt 4 heraus.

von gert (Gast)


Lesenswert?

arbeiet mit win avr bzw avr-gcc - habe da leider zur zeit nicht die 
möglichkeit eine ausgabe zu machen - müsste erst uart routine dran 
hängen

von gert (Gast)


Lesenswert?

es scheint so als das vom struct gar nichts bei der funktion ankommt, 
egal welche werte ich übergebe, mein rechteck hat immer diesselbe 
farbe...

von Hugo Mildenberger (Gast)


Lesenswert?

In diesem Fall würde ich das struct testweise anders definieren:
typedef struct {
  uint16_t  color2;
  uint16_t  color;
} tSquare;

und dann so testen:

tSquare square;
square.color = BLUE;
square.color2 = BLUE;
ShowSquare(&square);

von gert (Gast)


Lesenswert?

geht leider auch nicht... hm

von Hugo Mildenberger (Gast)


Lesenswert?

Das ist aber eigenartig. Wie groß ist BLUE numerisch? Irgendwo in einem 
Header muß #define BLUE irgendwas stehen.

von gert (Gast)


Lesenswert?

#define BLUE=10

von Hugo Mildenberger (Gast)


Lesenswert?

Ist die Compiler-Optimierung ausgeschaltet? (-O0 für gcc)

von gert (Gast)


Lesenswert?

ja

ich werde in den nächsten tagen nochmals die struct übergabe getretnnt 
testen mit ausgabe über uart

scheint so dass diese nicht so richtig funktioniert - ich bekomme nicht 
die werte des structs übergebene in der funktion.

von Hugo Mildenberger (Gast)


Lesenswert?

Es sieht sehr nach Compiler-Bug aus. Interessant wäre vielleicht, in der 
Routine Show-Square BLUE nochmal explizit zuzuweisen, also 
pSquare->color=BLUE; vor dem Aufruf der lcd-Funktion, und wenn's dann 
geht, vor dem Aufruf etwas einzubauen wie if (pSquare!=NULL); um den 
Compiler zu zwingen den Pointer zu laden.

von gert (Gast)


Lesenswert?

das habe ich auch schon probiert

also wenn ich

pSquare->color=BLUE;

in die funktion showSquare einbaue dann gehts ... nur dort bringt es mir 
nichts ;)

von Hugo Mildenberger (Gast)


Lesenswert?

Schon klar. Es ging mir darum, das Problem einzugrenzen. Man könnte 
(außer einem Bug-Report) als Workaround auch versuchen, einen pointer 
auf einen pointer zu übergeben, also etwa tSquare **ppSquare.

von gert (Gast)


Lesenswert?

nur nächstes problem,:

falls ich nun in der struct einen weiteren wert habe:

typedef struct {
 uint16_t  color;
  uint8_t  x;
} tSquare;

GEHT ES NICHT MEHR


folgender versuch schlägt auch fehl (koordinatenübergabe)

typedef struct {
 uint8_t  x;
  uint8_t  x;
} tSquare;

werde mal den alten winavr installieren

von gert (Gast)


Lesenswert?

dasselbe phänomen ;)

von Hugo M. (hmld)


Lesenswert?

Geht was genau nicht mehr?

von Daniel (Gast)


Lesenswert?

und wenn du anstatt

glcdSetFgColor(pSquare->color);

glcdSetFgColor(BLUE);
aufrufst?

wenn sich wieder nix tut, ist compiler eindeutig nicht schuld ;)

von gert (Gast)


Lesenswert?

das funktioniert wie gesagt ;)

von Hugo M. (hmld)


Lesenswert?

Was mir gerade auffällt: Steht im Header wirklich
"#define BLUE=10"? Oder nicht vielmehr "#define BLUE 10" ?

von gert (Gast)


Lesenswert?

WAS SEHR INTERESSANTES HERAUSGEFUNDEN:

falls das struct global definiert wird, funktionierts nicht
falls es lokal definiert wird (innerhalb main) funktioniert es 
einwandfrei...

von gert (Gast)


Lesenswert?

besser gesagt: global ohne static funktioniert es nicht - global static 
funktionierts

von Daniel (Gast)


Lesenswert?

wenn struct so kleingewichtig ist, dann kann man
auf den Zeiger verzichten und per value übergeben.
Wenn es dann geht, dann macht Compiler was falsch.
Allerdings ist das so ein typischer Fall, wie du
es gebrauchst, dass mir ein Bug eher unwahrscheinlicher scheint.

Ok, das ist C.
#define BLUE=10

müsste so heissen
#define BLUE 10

10 ist dann vom Typ int. Aber das nur nebenbei.

Ich vermute, dass im .c file keine Declaration
für die Funktion vorliegt und Compiler was falsches annimt.
Das ist C wie gesagt :)

Kannst du den Compiler mit -Wall durchlaufen lassen?

von gert (Gast)


Lesenswert?

ja #define BLUE 10 ist klar ;) vertippt wegene andere progsprache

-wall ist standart on

wie gesagt:
varibale lokal - alles funzt
varibale gloabl static - alles funzt
varibale global - nix funzt

danke

von Hugo M. (hmld)


Lesenswert?

Das klingt nach verschiedenen Datensegmenten -- evtl. muß man den 
Pointer konvertieren oder je nach Zielspeicherbereich speziell 
definieren beim Atmel? Beim 8051 ist das so.

von gert (Gast)


Lesenswert?

SO JETZT DREH ICH BALD DURCH:

versuch 1:
//GLOBAL DEFINIERT
tSquare square;

versuch 2: !!! FUNKTIONIERT !!!
//GLOBAL DEFINIERT
tSquare mySquare;


d.h. name der variable geändert von 'square' auf 'mySquare' dann 
funktionierts auch glboal ohne static ???!?!?!?!?!?!?!?!?!?!?!!! (ist 
square reserviertes word ?)

von Hugo M. (hmld)


Lesenswert?

Nicht in C. Aber gibt es vielleicht eine Präprozessor-Definition für 
"square"?

von gert (Gast)


Lesenswert?

bin schon am googeln

von Hugo M. (hmld)


Lesenswert?

Nicht im internet, sondern in den Quelldateien natürlich!

von gert (Gast)


Lesenswert?

nein nicht in meinem projekt (google desktop)

von gert (Gast)


Lesenswert?

in der math.h von winavr ist square definiert

von Hugo M. (hmld)


Lesenswert?

hmm. Es ist spät -- ist das globale "mySquare" versus "square" 
reproduzierbar? Ein inkonsistenter Make könnte auch deartiges 
hervorbringen

von gert (Gast)


Lesenswert?

ja es ist spät

aber in der math.h definiert :

  /**
     \ingroup avr_math

     The function square() returns <tt>x * x</tt>.

     \note
     This function does not belong to the C standard definition.
  */
extern double square(double __x) _ATTR_CONST_;

von Hugo M. (hmld)


Lesenswert?

gert wrote:
> in der math.h von winavr ist square definiert

als #define oder als Prototyp?

von Hmm... (Gast)


Lesenswert?

Iss im Grunde egal,der Compiler sollte eine doppelt definiertes Symbol 
schon als Fehler melden...

von gert (Gast)


Lesenswert?

falls ich math.h direkt im file includiere macht er das auch ...

von gert (Gast)


Lesenswert?

ok danke inzischen allen - gute nacht

von Hugo M. (hmld)


Lesenswert?

Ich würde mir jetzt die Ausgabe der gcc --save-temps -Option ansehen.

von gert (Gast)


Lesenswert?

ist reproduzierbar:

falls variable 'square' heisst - gehts nicht
falls variable zb 'Square' oder zb 'square1' heisst - gehts

von Hugo M. (hmld)


Angehängte Dateien:

Lesenswert?

1.) gcc -O0 -save-temps gibt auch die Assembler-Datei aus (*.s). 
Vielleicht der einfachste Weg um zu sehen, welches Symbol tatsächlich an 
die Zeichenroutine übergeben wird.

2.) gcc -g -O0  -Wl,-M gibt die Linkmap aus. Darin nachsehen, was 
wirklich für das Symbol square gelinkt wird (und außerdem, welche 
Symbole in der Nähe liegen. Vielleicht wird square ja versehentlich 
innerhalb einer ISR überschrieben? Oder durch ein sprintf)?


3.) Anbei ein Testprogramm, welches ohne UART auskommt, indem es die 
Farbe des LCD ansteuert (ist natürlich anzupassen). Lokale Variablen 
können gleichnamige Funktionsdeklarationen überdecken, und sollen das 
auch können.

Denkbar wäre noch, daß der verwendete Compiler  "square" als 
intrinsische Funktion erkennt, und demnach die Adresse dieser Funktion 
"square" übergibt, anstatt die Adresse der Variablen. Dann wäre es eben 
doch ein Compiler-Fehler.

von Simon K. (simon) Benutzerseite


Lesenswert?

Übrigens würde ich erstmal nicht von einem Compiler-Bug aussehen. Man 
bräuchte erstmal mehr Informationen zum Quelltext, bzw. eine minimale 
Code-Version, bei der der Fehler auftritt. So ein Bug wäre mit 
Sicherheit schon aufgefallen.

von gert (Gast)


Lesenswert?

mit variablename 'square' wird im map-file ua. folgender block 
angeführt:

c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(square.o)
                              simple.o (square)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(square.o)  (__mulsf3)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3x.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3.o)  (__mulsf3x)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(fp_merge.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3.o)  (__fp_merge)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(fp_nan.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3x.o)  (__fp_nanx)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(fp_split.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(mulsf3.o)  (__fp_split3)
c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(fp_zero.o)
                              c:/program 
files/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5\ 
libc.a(fp_merge.o)  (__fp_zero)

von gert (Gast)


Lesenswert?

und im lss file ist das symbol 'square' definiert - und diese wird 
verwendet - natürlich steht hier nur schrott drinnen ;)

000011f8 <square>:
    11f8:  9b 01 ac 01 0c 94 00 09                             ........

von Hugo M. (hmld)


Lesenswert?

Ich kann mich Simon Küppers nur anschließen. Es ist Zeit für ein 
Minimalprogramm, welches den Fehler reproduziert. Anhand der hier 
gegebenen Daten kann man das nicht wirklich. Es ist klar, daß die 
Funktion square verwendet wird, aber es ist durchaus nicht 
nachvollziehbar, in welchem Zusammenhang.

von gert (Gast)


Lesenswert?

hi

folgende 2 test-programme zeigen den unterschied (erstellt unter 
avrstudio):

//=== 1 ========================
int test;
int main() {
  test += 1;
  return 0;
}

//=== 2 ========================
int square;
int main() {
  square += 1;
  return 0;
}

nach durchsicht des .lss und .map file wird der unterschied ersichtlich 
;)

im anhang mein eigentliches projekt:

atmega128/siemens s65 display
tetris portiert von c# nach c

gruss

von gert (Gast)


Angehängte Dateien:

Lesenswert?

hier nochmal der anhang

von Karl H. (kbuchegg)


Lesenswert?

Auch nicht schlecht:
1
int sqrt;
2
3
int main()
4
{
5
  sqrt += 1;
6
  return 0;
7
}

Warnung:
builtin function sqrt declared as non-function

Seit wann sind die Funktionen der Standardbibliothek reservierte
Wörter?
(Das EXE hat dann übrigens, 788 Bytes. Mit einem Variablennamen
'test' lediglich 178 Bytes)

Ich denke mal das ganze hängt damit zusammen, dass der Optimizer
über einige Funktionen Bescheid weiss und dieses Wissen zur
Optimierung benutzen kann.

Jörg: Sind das beim gcc nicht die intrinsischen (intrinsic)
Funktionen?

Wie ich den gcc kenen, gibt es da sicher einen Compilerswitch
mit dem man das abschalten kann. Nur finde den mal unter den
hunderten möglichen Switches.

Pragmatische Lösung: Nenne das Teil nicht 'square' sondern
'block' oder 'tile'.

von mthomas (Gast)


Lesenswert?

Ganz interessant sind auch die Analysen des Formatstrings und der 
Parameter, die neuere gcc (zumindest arm-elf) bei Xprintf schon zu 
Compilezeit durchführen. Praktisch.

von gert (Gast)


Lesenswert?

hi

variable wurde logischerweise umbenannt ;)

lustig dass bei 'square' nicht mal ne warnung rauschgeschrieben wird

danke

von Karl H. (kbuchegg)


Lesenswert?

gert wrote:
>
> lustig dass bei 'square' nicht mal ne warnung rauschgeschrieben wird
>

liegt vermutlich daran, dass square(), im Gegensatz zu sqrt(),
keine 'offizielle' Standardfunktion ist.

von gert (Gast)


Lesenswert?

denk ich auch - wie in math.h dokumentiert

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:

> Seit wann sind die Funktionen der Standardbibliothek reservierte
> Wörter?

  7.1.3 Reserved identifiers
...
  -- All identifiers with external linkage in any of the following
     subclauses (including the future library directions) are always
     reserved for use as identifiers with external linkage.157)

> Ich denke mal das ganze hängt damit zusammen, dass der Optimizer
> über einige Funktionen Bescheid weiss und dieses Wissen zur
> Optimierung benutzen kann.

Genau so ist es.

> Wie ich den gcc kenen, gibt es da sicher einen Compilerswitch
> mit dem man das abschalten kann. Nur finde den mal unter den
> hunderten möglichen Switches.

-ffreestanding :-)

Wir sollten unsere eigenen Erweiterungen unter Umständen so kapseln,
dass sie mit Schaltern wie -ansi nicht zur Verfügung stehen.

> Pragmatische Lösung: Nenne das Teil nicht 'square' sondern
> 'block' oder 'tile'.

Ja, das würde ich auch sagen.  "static" müsste auch helfen, wenn man
es auf file scope reduzieren kann.  (Das ist ohnehin eine sinnvolle
Idee für alles, was man tut: den Scope immer auf das notwendige
Minimum einengen.)

Wobei mir gerade nicht klar ist: wenn <math.h> nicht included ist,
sollte eigentlich nichts passieren.  Wenn es included ist, sollte der
Compiler sich darüber beschweren, dass die beiden Deklarationen/
Definitionen nicht zusammen passen.

von gert (Gast)


Lesenswert?

ja wurde eh umgetauft auf static mySquare

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch wrote:

> Wobei mir gerade nicht klar ist: wenn <math.h> nicht included ist,
> sollte eigentlich nichts passieren.

Das war auch meine Hypothese. Die ist aber kläglich gescheitert.
Ich konnte es gar nicht glauben :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:

>> Wobei mir gerade nicht klar ist: wenn <math.h> nicht included ist,
>> sollte eigentlich nichts passieren.
>
> Das war auch meine Hypothese. Die ist aber kläglich gescheitert.
> Ich konnte es gar nicht glauben :-)

Ich kann es allerdings nicht reproduzieren.  Wenn ich obigen simplen
Test (extra mit -O0, damit er die Variable nicht wegoptimiere)
compiliere, bekomme ich:
1
% avr-nm foo.elf
2
000000ba t .do_clear_bss_loop
3
000000bc t .do_clear_bss_start
4
...
5
00800100 A _edata
6
00800102 A _end
7
000000f4 T _etext
8
000000f2 T _exit
9
000000f2 W exit
10
000000ce T main
11
00800100 B square

also eindeutig eine Variable square im .bss.  Ja, ich habe gegen -lm
gelinkt (aber davon wird natürlich nichts benötigt).

Ah ja... ich seh da was.  Da wollte einer besonders gut sein und
war eher dilletantisch.  Verschiedene trigonometrische Funktionen
in libm.a referenzieren square() direkt.  Damit ist das Teil dann
natürlich drin und auch an jeglicher Typprüfung des Compilers vorbei.
Der Linker merkt das dann nicht mehr.

Bitte schreibt einen avr-libc-Bugreport.

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch wrote:
> Karl heinz Buchegger wrote:
>
>>> Wobei mir gerade nicht klar ist: wenn <math.h> nicht included ist,
>>> sollte eigentlich nichts passieren.
>>
>> Das war auch meine Hypothese. Die ist aber kläglich gescheitert.
>> Ich konnte es gar nicht glauben :-)
>
> Ich kann es allerdings nicht reproduzieren.  Wenn ich obigen simplen
> Test (extra mit -O0, damit er die Variable nicht wegoptimiere)

Ich hatte -Os benutzt und nicht gegen -lm gelinkt.

Nachtrag: Hab jetzt nochmal mit -O0 compiliert. Gleicher Effekt.
Ich hab hier den WinAVR-20070525

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Und du hast obiges ,,Minimalprogramm'' compiliert?

Kannst du mir die Compilerkommandozeile nennen und ggf. auch das
ELF-File hier als Attachment posten?

von Karl H. (kbuchegg)


Lesenswert?

Jörg Wunsch wrote:
> Und du hast obiges ,,Minimalprogramm'' compiliert?

Ja.
Genau so wie es da steht.
Ohne irgendwelche Includes.

> Kannst du mir die Compilerkommandozeile nennen und ggf. auch das
> ELF-File hier als Attachment posten?

Jetzt hast du mich erwischt :-)
Ich benutze die Standardeinstellung vom AVR-Studio.
Ich deh mal zu, dass ich an das Makefile rankomme, welches
AVR-Studio benutzt.

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Also:
Der Compileraufruf
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -O0 -MD -MP -MT ForumTest.o 
-MF dep/ForumTest.o.d -c ../ForumTest.c


Im Anhang das makefile und das ELF-File

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Moment mal, das ist aber das mit sqrt().

Seltsamerweise generiert das aber -- mit deinem Makefile -- bei mir
nicht dein Ergebnis:
1
% avr-objdump -d ForumTest.elf 
2
3
ForumTest.elf:     file format elf32-avr
4
5
Disassembly of section .text:
6
7
00000000 <__vectors>:
8
   0:   0c 94 2a 00     jmp     0x54    ; 0x54 <__ctors_end>
9
   4:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
10
   8:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
11
   c:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
12
  10:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
13
  14:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
14
  18:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
15
  1c:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
16
  20:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
17
  24:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
18
  28:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
19
  2c:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
20
  30:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
21
  34:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
22
  38:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
23
  3c:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
24
  40:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
25
  44:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
26
  48:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
27
  4c:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
28
  50:   0c 94 47 00     jmp     0x8e    ; 0x8e <__bad_interrupt>
29
30
00000054 <__ctors_end>:
31
  54:   11 24           eor     r1, r1
32
  56:   1f be           out     0x3f, r1        ; 63
33
  58:   cf e5           ldi     r28, 0x5F       ; 95
34
  5a:   d4 e0           ldi     r29, 0x04       ; 4
35
  5c:   de bf           out     0x3e, r29       ; 62
36
  5e:   cd bf           out     0x3d, r28       ; 61
37
38
00000060 <__do_copy_data>:
39
  60:   10 e0           ldi     r17, 0x00       ; 0
40
  62:   a0 e6           ldi     r26, 0x60       ; 96
41
  64:   b0 e0           ldi     r27, 0x00       ; 0
42
  66:   e8 eb           ldi     r30, 0xB8       ; 184
43
  68:   f0 e0           ldi     r31, 0x00       ; 0
44
  6a:   02 c0           rjmp    .+4             ; 0x70 <.do_copy_data_start>
45
46
0000006c <.do_copy_data_loop>:
47
  6c:   05 90           lpm     r0, Z+
48
  6e:   0d 92           st      X+, r0
49
50
00000070 <.do_copy_data_start>:
51
  70:   a0 36           cpi     r26, 0x60       ; 96
52
  72:   b1 07           cpc     r27, r17
53
  74:   d9 f7           brne    .-10            ; 0x6c <.do_copy_data_loop>
54
55
00000076 <__do_clear_bss>:
56
  76:   10 e0           ldi     r17, 0x00       ; 0
57
  78:   a0 e6           ldi     r26, 0x60       ; 96
58
  7a:   b0 e0           ldi     r27, 0x00       ; 0
59
  7c:   01 c0           rjmp    .+2             ; 0x80 <.do_clear_bss_start>
60
61
0000007e <.do_clear_bss_loop>:
62
  7e:   1d 92           st      X+, r1
63
64
00000080 <.do_clear_bss_start>:
65
  80:   a2 36           cpi     r26, 0x62       ; 98
66
  82:   b1 07           cpc     r27, r17
67
  84:   e1 f7           brne    .-8             ; 0x7e <.do_clear_bss_loop>
68
  86:   0e 94 49 00     call    0x92    ; 0x92 <main>
69
  8a:   0c 94 5b 00     jmp     0xb6    ; 0xb6 <_exit>
70
71
0000008e <__bad_interrupt>:
72
  8e:   0c 94 00 00     jmp     0       ; 0x0 <__heap_end>
73
74
00000092 <main>:
75
  92:   cf 93           push    r28
76
  94:   df 93           push    r29
77
  96:   cd b7           in      r28, 0x3d       ; 61
78
  98:   de b7           in      r29, 0x3e       ; 62
79
  9a:   80 91 60 00     lds     r24, 0x0060
80
  9e:   90 91 61 00     lds     r25, 0x0061
81
  a2:   01 96           adiw    r24, 0x01       ; 1
82
  a4:   90 93 61 00     sts     0x0061, r25
83
  a8:   80 93 60 00     sts     0x0060, r24
84
  ac:   80 e0           ldi     r24, 0x00       ; 0
85
  ae:   90 e0           ldi     r25, 0x00       ; 0
86
  b0:   df 91           pop     r29
87
  b2:   cf 91           pop     r28
88
  b4:   08 95           ret
89
90
000000b6 <_exit>:
91
  b6:   ff cf           rjmp    .-2             ; 0xb6 <_exit>

Es wird ganz normal eine Variable sqrt angelegt, die auf Adresse
0x[800]060 landet.

von gert (Gast)


Lesenswert?

mit 'square' wiederholen - dann klappts ;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, für mich klappt es nicht, egal wie ich es drehe.  Einziger
Unterschied hier: ich habe kein WinAVR, sondern benutze ,,nur''
das von Karl Heinz mitgegebene Makefile.  In jedem Falle wird bei
mir sqrt oder square eine Variable auf Adresse 0x60.  Es ist mir
auch nach wie vor komplett unlogisch, warum das anders sein soll --
schließlich wird -lm ja gar nicht angegeben, und sowohl square als
auch sqrt kommen ausschließlich in der libm.a vor, nicht in der
libc.a.  Selbst wenn sie in der libc.a wären, würden deren Module
von diesem einfachen Programm nicht referenziert, also holt sie
der Linker auch nicht rein.

Wie gesagt, ich sehe den Bug (die trigonometrischen Funktionen haben
nicht das Recht, eine Implementierung einer Hilfsfunktion namens
square mit ins Boot zu ziehen, da dieser Name im application name
space liegt), habe aber keinen Schimmer, warum der bei euch zuschlägt.

von gert (Gast)


Angehängte Dateien:

Lesenswert?

hi

hier nochmals mit AvrStudio (standart-einstellungen, makefile im anhang)

% avr-objdump -d SquareTest.elf

SquareTest.elf:     file format elf32-avr

Disassembly of section .text:

00000000 <__vectors>:
   0:  0c 94 46 00   jmp  0x8c  ; 0x8c <__ctors_end>
   4:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
   8:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
   c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  10:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  14:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  18:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  1c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  20:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  24:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  28:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  2c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  30:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  34:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  38:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  3c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  40:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  44:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  48:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  4c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  50:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  54:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  58:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  5c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  60:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  64:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  68:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  6c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  70:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  74:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  78:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  7c:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  80:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  84:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>
  88:  0c 94 63 00   jmp  0xc6  ; 0xc6 <__bad_interrupt>

0000008c <__ctors_end>:
  8c:  11 24         eor  r1, r1
  8e:  1f be         out  0x3f, r1  ; 63
  90:  cf ef         ldi  r28, 0xFF  ; 255
  92:  d0 e1         ldi  r29, 0x10  ; 16
  94:  de bf         out  0x3e, r29  ; 62
  96:  cd bf         out  0x3d, r28  ; 61

00000098 <__do_copy_data>:
  98:  11 e0         ldi  r17, 0x01  ; 1
  9a:  a0 e0         ldi  r26, 0x00  ; 0
  9c:  b1 e0         ldi  r27, 0x01  ; 1
  9e:  e2 e2         ldi  r30, 0x22  ; 34
  a0:  f2 e0         ldi  r31, 0x02  ; 2
  a2:  00 e0         ldi  r16, 0x00  ; 0
  a4:  0b bf         out  0x3b, r16  ; 59
  a6:  02 c0         rjmp  .+4        ; 0xac <__do_copy_data+0x14>
  a8:  07 90         elpm  r0, Z+
  aa:  0d 92         st  X+, r0
  ac:  a0 30         cpi  r26, 0x00  ; 0
  ae:  b1 07         cpc  r27, r17
  b0:  d9 f7         brne  .-10       ; 0xa8 <__do_copy_data+0x10>

000000b2 <__do_clear_bss>:
  b2:  11 e0         ldi  r17, 0x01  ; 1
  b4:  a0 e0         ldi  r26, 0x00  ; 0
  b6:  b1 e0         ldi  r27, 0x01  ; 1
  b8:  01 c0         rjmp  .+2        ; 0xbc <.do_clear_bss_start>

000000ba <.do_clear_bss_loop>:
  ba:  1d 92         st  X+, r1

000000bc <.do_clear_bss_start>:
  bc:  a0 30         cpi  r26, 0x00  ; 0
  be:  b1 07         cpc  r27, r17
  c0:  e1 f7         brne  .-8        ; 0xba <.do_clear_bss_loop>
  c2:  0c 94 65 00   jmp  0xca  ; 0xca <main>

000000c6 <__bad_interrupt>:
  c6:  0c 94 00 00   jmp  0  ; 0x0 <__vectors>

000000ca <main>:
  ca:  cf 93         push  r28
  cc:  df 93         push  r29
  ce:  cd b7         in  r28, 0x3d  ; 61
  d0:  de b7         in  r29, 0x3e  ; 62
  d2:  80 91 ee 00   lds  r24, 0x00EE
  d6:  90 91 ef 00   lds  r25, 0x00EF
  da:  01 96         adiw  r24, 0x01  ; 1
  dc:  90 93 ef 00   sts  0x00EF, r25
  e0:  80 93 ee 00   sts  0x00EE, r24
  e4:  80 e0         ldi  r24, 0x00  ; 0
  e6:  90 e0         ldi  r25, 0x00  ; 0
  e8:  df 91         pop  r29
  ea:  cf 91         pop  r28
  ec:  08 95         ret

000000ee <square>:
  ee:  9b 01 ac 01 0c 94 7b 00                             ......{.

000000f6 <__mulsf3>:
  f6:  67 d0         rcall  .+206      ; 0x1c6 <__fp_split3>
  f8:  01 d0         rcall  .+2        ; 0xfc <__mulsf3x>
  fa:  4a c0         rjmp  .+148      ; 0x190 <__fp_merge>

000000fc <__mulsf3x>:
  fc:  99 23         and  r25, r25
  fe:  39 f0         breq  .+14       ; 0x10e <__mulsf3x+0x12>
 100:  55 23         and  r21, r21
 102:  29 f0         breq  .+10       ; 0x10e <__mulsf3x+0x12>
 104:  9f 57         subi  r25, 0x7F  ; 127
 106:  5f 57         subi  r21, 0x7F  ; 127
 108:  95 0f         add  r25, r21
 10a:  13 f4         brvc  .+4        ; 0x110 <__mulsf3x+0x14>
 10c:  9a f1         brmi  .+102      ; 0x174 <__mulsf3x+0x78>
 10e:  87 c0         rjmp  .+270      ; 0x21e <__fp_zerox>
 110:  91 58         subi  r25, 0x81  ; 129
 112:  9f 3f         cpi  r25, 0xFF  ; 255
 114:  e1 f3         breq  .-8        ; 0x10e <__mulsf3x+0x12>
 116:  62 9f         mul  r22, r18
 118:  a1 2d         mov  r26, r1
 11a:  0f 92         push  r0
 11c:  bb 27         eor  r27, r27
 11e:  63 9f         mul  r22, r19
 120:  a0 0d         add  r26, r0
 122:  b1 1d         adc  r27, r1
 124:  ee 27         eor  r30, r30
 126:  72 9f         mul  r23, r18
 128:  a0 0d         add  r26, r0
 12a:  b1 1d         adc  r27, r1
 12c:  ee 1f         adc  r30, r30
 12e:  af 93         push  r26
 130:  aa 27         eor  r26, r26
 132:  64 9f         mul  r22, r20
 134:  b0 0d         add  r27, r0
 136:  e1 1d         adc  r30, r1
 138:  73 9f         mul  r23, r19
 13a:  b0 0d         add  r27, r0
 13c:  e1 1d         adc  r30, r1
 13e:  aa 1f         adc  r26, r26
 140:  66 27         eor  r22, r22
 142:  82 9f         mul  r24, r18
 144:  b0 0d         add  r27, r0
 146:  e1 1d         adc  r30, r1
 148:  a6 1f         adc  r26, r22
 14a:  55 27         eor  r21, r21
 14c:  74 9f         mul  r23, r20
 14e:  e0 0d         add  r30, r0
 150:  a1 1d         adc  r26, r1
 152:  55 1f         adc  r21, r21
 154:  83 9f         mul  r24, r19
 156:  e0 0d         add  r30, r0
 158:  a1 1d         adc  r26, r1
 15a:  56 1f         adc  r21, r22
 15c:  84 9f         mul  r24, r20
 15e:  a0 0d         add  r26, r0
 160:  51 1d         adc  r21, r1
 162:  85 2f         mov  r24, r21
 164:  7a 2f         mov  r23, r26
 166:  6e 2f         mov  r22, r30
 168:  1f 90         pop  r1
 16a:  0f 90         pop  r0
 16c:  88 23         and  r24, r24
 16e:  1a f4         brpl  .+6        ; 0x176 <__mulsf3x+0x7a>
 170:  93 95         inc  r25
 172:  39 f4         brne  .+14       ; 0x182 <__mulsf3x+0x86>
 174:  25 c0         rjmp  .+74       ; 0x1c0 <__fp_nan>
 176:  00 0c         add  r0, r0
 178:  11 1c         adc  r1, r1
 17a:  bb 1f         adc  r27, r27
 17c:  66 1f         adc  r22, r22
 17e:  77 1f         adc  r23, r23
 180:  88 1f         adc  r24, r24
 182:  01 28         or  r0, r1
 184:  08 95         ret
 186:  9a 95         dec  r25
 188:  bb 0f         add  r27, r27
 18a:  66 1f         adc  r22, r22
 18c:  77 1f         adc  r23, r23
 18e:  88 1f         adc  r24, r24

00000190 <__fp_merge>:
 190:  11 24         eor  r1, r1
 192:  99 23         and  r25, r25
 194:  a1 f0         breq  .+40       ; 0x1be <__fp_merge+0x2e>
 196:  88 23         and  r24, r24
 198:  b2 f7         brpl  .-20       ; 0x186 <__mulsf3x+0x8a>
 19a:  9f 3f         cpi  r25, 0xFF  ; 255
 19c:  59 f0         breq  .+22       ; 0x1b4 <__fp_merge+0x24>
 19e:  bb 0f         add  r27, r27
 1a0:  48 f4         brcc  .+18       ; 0x1b4 <__fp_merge+0x24>
 1a2:  21 f4         brne  .+8        ; 0x1ac <__fp_merge+0x1c>
 1a4:  00 20         and  r0, r0
 1a6:  11 f4         brne  .+4        ; 0x1ac <__fp_merge+0x1c>
 1a8:  60 ff         sbrs  r22, 0
 1aa:  04 c0         rjmp  .+8        ; 0x1b4 <__fp_merge+0x24>
 1ac:  6f 5f         subi  r22, 0xFF  ; 255
 1ae:  7f 4f         sbci  r23, 0xFF  ; 255
 1b0:  8f 4f         sbci  r24, 0xFF  ; 255
 1b2:  9f 4f         sbci  r25, 0xFF  ; 255
 1b4:  88 1f         adc  r24, r24
 1b6:  97 95         ror  r25
 1b8:  87 95         ror  r24
 1ba:  97 f9         bld  r25, 7
 1bc:  08 95         ret
 1be:  2c c0         rjmp  .+88       ; 0x218 <__fp_zero>

000001c0 <__fp_nan>:
 1c0:  9f ef         ldi  r25, 0xFF  ; 255
 1c2:  80 ec         ldi  r24, 0xC0  ; 192
 1c4:  08 95         ret

000001c6 <__fp_split3>:
 1c6:  05 2e         mov  r0, r21
 1c8:  09 26         eor  r0, r25
 1ca:  07 fa         bst  r0, 7

000001cc <__fp_split2>:
 1cc:  44 0f         add  r20, r20
 1ce:  55 1f         adc  r21, r21
 1d0:  5f 3f         cpi  r21, 0xFF  ; 255
 1d2:  79 f0         breq  .+30       ; 0x1f2 <__fp_split1+0x14>
 1d4:  aa 27         eor  r26, r26
 1d6:  a5 17         cp  r26, r21
 1d8:  08 f0         brcs  .+2        ; 0x1dc <__fp_split2+0x10>
 1da:  51 e0         ldi  r21, 0x01  ; 1
 1dc:  47 95         ror  r20

000001de <__fp_split1>:
 1de:  88 0f         add  r24, r24
 1e0:  99 1f         adc  r25, r25
 1e2:  9f 3f         cpi  r25, 0xFF  ; 255
 1e4:  31 f0         breq  .+12       ; 0x1f2 <__fp_split1+0x14>
 1e6:  bb 27         eor  r27, r27
 1e8:  b9 17         cp  r27, r25
 1ea:  08 f0         brcs  .+2        ; 0x1ee <__fp_split1+0x10>
 1ec:  91 e0         ldi  r25, 0x01  ; 1
 1ee:  87 95         ror  r24
 1f0:  08 95         ret
 1f2:  9f 91         pop  r25
 1f4:  9f 91         pop  r25
 1f6:  11 24         eor  r1, r1
 1f8:  e3 cf         rjmp  .-58       ; 0x1c0 <__fp_nan>

000001fa <__fp_split_a>:
 1fa:  97 fb         bst  r25, 7
 1fc:  88 0f         add  r24, r24
 1fe:  99 1f         adc  r25, r25
 200:  9f 3f         cpi  r25, 0xFF  ; 255
 202:  31 f0         breq  .+12       ; 0x210 <__fp_split_a+0x16>
 204:  bb 27         eor  r27, r27
 206:  b9 17         cp  r27, r25
 208:  08 f0         brcs  .+2        ; 0x20c <__fp_split_a+0x12>
 20a:  91 e0         ldi  r25, 0x01  ; 1
 20c:  87 95         ror  r24
 20e:  08 95         ret
 210:  9f 91         pop  r25
 212:  9f 91         pop  r25
 214:  11 24         eor  r1, r1
 216:  d4 cf         rjmp  .-88       ; 0x1c0 <__fp_nan>

00000218 <__fp_zero>:
 218:  66 27         eor  r22, r22
 21a:  77 27         eor  r23, r23
 21c:  88 27         eor  r24, r24

0000021e <__fp_zerox>:
 21e:  99 27         eor  r25, r25
 220:  08 95         ret

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kannst du mal die exakten Kommandozeilen posten, die bei AVR Studio
da benutzt werden?

Ich bekomme:
1
% gmake -f ../Makefile
2
avr-gcc  -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
3
avr-gcc -mmcu=atmega128 -Wl,-Map=SquareTest.map main.o     -o SquareTest.elf
4
avr-objcopy -O ihex -R .eeprom  SquareTest.elf SquareTest.hex
5
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex SquareTest.elf SquareTest.eep
6
avr-objcopy: there are no sections to be copied!
7
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
8
gmake: *** [SquareTest.eep] Error 1

Diesmal ist ein ATmega128 eingestellt, da liegt die Variable square
auf 0x100 bei mir.

von gert (Gast)


Lesenswert?

laut avrstudio output:
1
rm -rf main.o  SquareTest.elf dep/* SquareTest.hex SquareTest.eep SquareTest.lss SquareTest.map
2
Build succeeded with 0 Warnings...
3
avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
4
avr-gcc.exe -mmcu=atmega128  main.o     -o SquareTest.elf
5
avr-objcopy -O ihex -R .eeprom  SquareTest.elf SquareTest.hex
6
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex SquareTest.elf SquareTest.eep
7
c:\WinAVR\bin\avr-objcopy.exe: there are no sections to be copied!
8
c:\WinAVR\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
9
make: *** [SquareTest.eep] Error 1
10
Build succeeded with 0 Warnings...

von gert (Gast)


Lesenswert?

bzw mit .lss und .map file:
1
rm -rf main.o  SquareTest.elf dep/* SquareTest.hex SquareTest.eep
2
Build succeeded with 0 Warnings...
3
avr-gcc.exe  -mmcu=atmega128 -Wall -gdwarf-2  -O0 -fsigned-char -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
4
avr-gcc.exe -mmcu=atmega128 -Wl,-Map=SquareTest.map main.o     -o SquareTest.elf
5
avr-objcopy -O ihex -R .eeprom  SquareTest.elf SquareTest.hex
6
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex SquareTest.elf SquareTest.eep
7
c:\WinAVR\bin\avr-objcopy.exe: there are no sections to be copied!
8
c:\WinAVR\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
9
make: *** [SquareTest.eep] Error 1
10
Build succeeded with 0 Warnings...

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.