Forum: Compiler & IDEs Initialisieren von Arrays und Strings klappt nicht


von rafael (Gast)


Lesenswert?

Hallo zusammen

Ich habe ein Problem mit dem Initialisieren von Arrays und Strings 
(sprich char-Arrays), das ich mir mit besten Willen nicht erklären kann.

Ich möchte Arrays in der Form
1
int i[] = {1,2,3,4,5};
2
char* s = "Hello World!";
initialiesieren. Dies funkioniert aber nicht. Die Arrays sind nacher mit 
Nullen oder irgendwelchen willkürlichen Zeichen gefüllt. Wenn ich die 
Arrays nur definiere und sie später im Code elementweise befülle, 
funktioniert alles wie erwartet.

Hintergrund ist die Implementierung der USART-Schnittstelle am 
Atmega1284p.

Ich habe das Gefühl, ich stehe auf dem Schlauch oder seh den Wald vor 
lauter Bäumen nicht. Muss ich irgend ein bestimmtes File includen oder 
dem Compiler bestimmte Optionen übergeben, damit die Initialisierung wie 
oben funktioniert? Leider finde ich auch in Beispielen und Anleitungnen 
im Netz keinen hilfreichen Hinweis.

Ich bedanke mich schon mal für eure Hilfe!

Gruss Rafael


Code-Ausschnitte (auf das wesentliche gekürzt):

main.c
1
#include <avr/io.h>
2
#include "usart.h"
3
4
int main (void){
5
    usart0_init();
6
    char s[] = "Hello World!";
7
    usart0_puts(s);
8
}

usart.c (usart0_putc() funktioniert einwandfrei)
1
void usart0_puts(char* s)
2
{
3
  uint8_t i = 0;
4
  while( s[i] != '\0' )
5
  {
6
    usart0_putc(s[i]);
7
    i++;
8
  }
9
  return;
10
}

Makefile
1
# Projektname
2
PROJECT = ng_quad_MEGA1284p_V0_1
3
# Quelldateien
4
SOURCES = main.c usart.c
5
# Compiler
6
CC = avr-gcc
7
# Objcopy
8
OBJCOPY = avr-objcopy
9
# AVR-Modell
10
MMCU = atmega1284p
11
# Frequenz
12
HZ = 20000000
13
14
# Compiler-Flags
15
CFLAGS=-mmcu=$(MMCU) -DF_CPU=$(HZ) -Os -Wall -std=c99
16
#  -mmcu    MCU-Typ
17
#  -DF_CPU    MCU-Takt
18
#  -Os      Optimisation "s"
19
#  -Wall    show all warnings
20
#  -std=c99  C99-Standard
21
22
23
# Erzeuge hex-File
24
$(PROJECT).hex: $(PROJECT).out
25
  $(OBJCOPY) -j .text -O ihex $(PROJECT).out $(PROJECT).hex
26
27
# Erzeuge out-files
28
$(PROJECT).out: $(SOURCES)
29
  $(CC) $(CFLAGS) -I./ -o $(PROJECT).out $(SOURCES)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stimmten die Parameter von objcopy?

von Stefan E. (sternst)


Lesenswert?

1
  $(OBJCOPY) -j .text -O ihex $(PROJECT).out $(PROJECT).hex
Du musst auch die .data Section ins Hex-File exportieren.

von Scherzo (Gast)


Lesenswert?

Kenn' mich mit dem AVR nicht so aus, aber mglw.
gibt es da Besonderheiten wegen der Harvard-Arch zu beachten.
Es könnte sein, dass der C-startup Code die Variablen init. müsste,
indem er aus dem Programmspeicher die Variablneinitialwerte in's RAM 
kopiert.
Dissassembliere doch 'mal Deinen Code (objdump -d pder -D)
und schau was er so treibt...


Scherzo

von rafael (Gast)


Lesenswert?

Ihr seid grossartig! Vielen tausend Dank für die hilfreichen Antworten 
innert kürzester Zeit.
1
$(OBJCOPY) -j .text -j .data -O ihex $(PROJECT).out $(PROJECT).hex

Die geänderte Zeile für objcopy löst das Problem und das Initialisieren 
funktioniert wie erwartet.

Diese Zeile habe ich aus einem Beispiel für Makefiles irgendwo aus dem 
Internet kopiert, ohne deren Funktion genauer zu hinterfragen. Fehlen 
mir da noch weitere wichtige Parameter, die mir später ähnliches 
Kopfzerbrechen bereiten könnten?

Gruss Rafael

von Oliver (Gast)


Lesenswert?

guggst du MFile

Oliver

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.