Forum: Compiler & IDEs String an Funktion übergeben


von Max (Gast)


Lesenswert?

Hallo,

ich arbeite mit einem ATMega32 und dem Display EA DOGM128W-6.
Irgendwie bin ich zu blöd einen String "BOOT" in der Bootloadersection 
(ab 0x7c00)an eine Funktion zu geben.

Hier der relevante Auszug aus dem LSS File:
1
char *text = "BOOT";
2
  boot_display(text);
3
    7cd6:  80 e3         ldi  r24, 0x30  ; 48
4
    7cd8:  94 e0         ldi  r25, 0x04  ; 4
5
    7cda:  0e 94 d9 3e   call  0x7db2  ; 0x7db2 <boot_display>
6
  
7
  display_char('y');
8
    7cde:  89 e7         ldi  r24, 0x79  ; 121
9
    7ce0:  0e 94 a1 3e   call  0x7d42  ; 0x7d42 <display_char>
10
    7ce4:  ff cf         rjmp  .-2        ; 0x7ce4 <main+0x22>
11
12
....
13
14
15
void boot_display(char *str)
16
{
17
    7db2:  0f 93         push  r16
18
    7db4:  1f 93         push  r17
19
    7db6:  8c 01         movw  r16, r24
20
  
21
display_char(str[0]);
22
    7db8:  fc 01         movw  r30, r24
23
    7dba:  80 81         ld  r24, Z
24
    7dbc:  0e 94 a1 3e   call  0x7d42  ; 0x7d42 <display_char>
25
display_char(str[1]);
26
    7dc0:  f8 01         movw  r30, r16
27
    7dc2:  81 81         ldd  r24, Z+1  ; 0x01
28
    7dc4:  0e 94 a1 3e   call  0x7d42  ; 0x7d42 <display_char>
29
display_char(str[2]);
30
    7dc8:  f8 01         movw  r30, r16
31
    7dca:  82 81         ldd  r24, Z+2  ; 0x02
32
    7dcc:  0e 94 a1 3e   call  0x7d42  ; 0x7d42 <display_char>
33
display_char(str[3]);
34
    7dd0:  f8 01         movw  r30, r16
35
    7dd2:  83 81         ldd  r24, Z+3  ; 0x03
36
    7dd4:  0e 94 a1 3e   call  0x7d42  ; 0x7d42 <display_char>
37
  }


Das "y" wird einwandfrei auf dem Display ausgegeben.
Der Text "BOOT" wird nur "OT" ausgegeben. Die beiden letzten ZEichen 
fehlen immer. Sieht jemand woran das liegt?
Wenn ich anstatt
    display_char(str[0]); display_char('B');
und display_char(str[1]); display_char('O');
und display_char(str[2]); display_char('O');
und display_char(str[3]); display_char('T');

schriebe, dann funktioniert es. Also muss es an der übergabe des Textes 
per Pointer an boot_display(char *str) ein Problem geben.


Was macht diese Zeile:
7dba:  80 81         ld  r24, Z

und woher kommt "Z"?

Ich hoffe jemand kann mir da weiterhelfen...
Danke!!

Max

von Karl H. (kbuchegg)


Lesenswert?

Max schrieb:

> Was macht diese Zeile:
> 7dba:  80 81         ld  r24, Z
>
> und woher kommt "Z"?
>

Z ist die Schreibweise für den 'Z-Pointer', die Zusammenfassung der 
Register R30 und R31 zu einem einzigen 16 Bit Register, das zur 
Adressierung benutzt werden kann.
Das ist schon alles richtig.

Die Frage lautet vielmehr, ist hier die richtige Adresse angegeben 
worden
1
char *text = "BOOT";
2
  boot_display(text);
3
    7cd6:  80 e3         ldi  r24, 0x30  ; 48
4
    7cd8:  94 e0         ldi  r25, 0x04  ; 4
5
    7cda:  0e 94 d9 3e   call  0x7db2  ; 0x7db2 <boot_display>
bzw. warum findet sich im SRAM an dieser Stelle nicht mehr der von dir 
angegebene Text im Speicher?

Das kann zb auch die Ursache haben, dass du irgendwo vorher im Programm 
einen Out-Of-Bounds Arrayzugriffsfehler hast und dir selber diesen 
Speicher niedergebügelt hast.
Das ist aber nur 1 Möglichkeit, es gibt noch andere.

von Max (Gast)


Lesenswert?

Hallo Karl Heinz,

danke für deine Antwort.

Dein Tip war schon ganz gut. Ich hatte mich zu sehr darauf verbissen, 
dass ich irgendetwas falsch programmiert hatte. Vor allem weil ich teile 
von Funktionen in andere Sections ausgelagert habe.

Es war ganz simpel, dass der SRAM zu voll war.

Ich muss unbedingt eine Routine bauen die mir zur Laufzeit den 
Stackpointer ausgibt so das ich mir Prozentual den aktuellen Verbrauch 
ansehen kann.
Ich dachte sowas mal gelesen zu haben.

Vielleicht weis das auch einer kurz auswendig und würde es 
freundlicherweise kurz posten.

Danke!!!!!!

Max

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.