String an Funktion übergeben

Gast #2700406
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
#2700653
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.
Gast #2700703
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.