Forum: Compiler & IDEs Probleme AVR-GCC und Arrays


von Bernd Klein (Gast)


Lesenswert?

Hallo Leute,
ich hab ein Problem mit Arrays und weiß nicht woran das liegt. Ich 
möchte einen Steppertreiber schreiben. Folgendes funktioniert bei mir 
nicht
(alles mit avr-gcc, neuste Version )

/********************************************/
const char step_pattern[]={0xC,0x6,0x3,0x9) ;
for (;;) {
  for unit8_t x=0; x<= 3; x++) {
    outp ( step_pattern[x], PORTC) ;
    /* Kurze Pause */
  }
}

/********************************************/
/* mache ich das Ganze dann aber so, gehts  */
/* einwandfrei           */
/********************************************/
for (;;) {
  outp(0xC, PORTC) ;
  /* kurze Pause */
  outp(0x6, PORTC) ;
  /* kurze Pause */
  outp(0x3, PORTC) ;
  /* kurze Pause */
  outp(0x9, PORTC) ;
  /* kurze Pause */

}

Also keine Compilerfehler oder sowas, nur bei der Schleife mit dem 
Array, dreht sich nix am Motor.
Hat jemand eine Erklärung dafür.
Übrigens, das Ganze soll auf einem AT90S2333 laufen.
Gruß
Bernd.

Und nochwas, gestern habe ich das schon mal gepostet, aber heute ist 
meine Frage nicht mehr im Forum enthalten - WARUM ? -

von Joerg Wunsch (Gast)


Lesenswert?

So, wie es dasteht, muß es aber Compilerfehler geben. ;-)
Es fehlt mindestens eine Klammer.  Mit der Deklaration einer
Variablen innerhalb einer for-Anweisung würde ich mich persönlich
auch schwer tun, das Feature gibt es zwar schon eine Weile bei
C++, aber bei C ist es erst im C99 enthalten (zu dem der gcc
derzeit noch nicht völlig kompatibel ist), außerdem hat sich
selbst bei C++ der Scope der Variablen im Laufe der Jahre noch
geändert...

outp() ist übrigens deprecated, und es gibt keinen Grund, warum
Du nicht gleich

PORTC = 0xc;

schreiben solltest.

Ansonsten wüßte ich aber nicht, was an Deinem Array falsch
sein sollte.

von Peter Fleury (Gast)


Angehängte Dateien:

Lesenswert?

Habe Bernd's Code Fragmente zu einem kompleten Programm zusammengebaut 
und in der Tat Probleme mit der Init vom globalen Arrays festgestellt 
(siehe Anhang).

Offenbar wird
static const uint8_t step1[]={0xC,0x6,0x3,0x9} ;
nicht bei der Programm Initialisierung gesetzt.

von Christian Schifferle (Gast)


Lesenswert?

Hallo Leute

Ich habe ähnliche Erfahrungen gemacht mit Strings, die ich im Flash 
ablegen wollte. Das hat nur geklappt, wenn ich die entsprechenden 
Variablendeklarationen innerhalb eines Funktionsbody gemacht habe, und 
wenn auc nur in main().
Somit scheint der GCC hier wirklich ein paar Probleme zu haben mit 
globalen Arrays.
Aber bei dem Preis kann man ja nicht meckern ;-)

Gruss
Christian

von Joerg Wunsch (Gast)


Lesenswert?

Habe es mit

avr-gcc -O -o foo -mmcu=at90s2333 foo.c

compiliert und mit avr-objdump -d foo disassembliert.  Ich
sehe in __do_copy_data das Kopieren von Flash-Adresse 0xc0 nach
RAM-Adresse 0x60 ... < 0x64.

Die Initialisierung des Z-Registers mutet sehr umständlich
an, wahrscheinlich liegt das daran, daß der Compiler ja
verschieblichen Code erzeugt.  Es passiert in main() in
Adresse 0x72...0x7f.  Dafür ist dann der für die Schleife
erzeugte Code wieder recht kompakt.

von Joerg Wunsch (Gast)


Lesenswert?

Nee, man, bitte keine Polemik.  Der GCC mag Bugs haben, aber
die manifestieren sich nicht in kaputtem Code (wenn man einen
Bug erwischt, bekommt man das in aller Regel laut und deutlich
gesagt ;-).

Gerade Variablen im Flash ablegen ist nicht ganz so trivial.
Ein Array von Strings, die selbst auch wieder im Flash sind,
muß man (leider) recht umständlich anlegen, siehe FAQ.

Ein normales initialisiertes Array muß aber funktionieren, und
das Compilat aus Peters Beispiels sieht auch ordentlich aus.  In
leicht anderer Form habe ich sowas auch selbst schon benutzt.
Wenn das also irgendwo nicht geht, sollten wir das eigentliche
Problem klären, statt hier die Behauptung im Raum stehen zu
lassen, daß eine Initialisierung globaler Variablen nicht tun
würde.

Nur mal am Rande: das avr-objcopy, mit dem Ihr das File für
den Programmer erzeugt, kopiert aber hoffentlich sowohl text
als auch data Section, ja?  Ansonsten braucht Ihr Euch nicht
wundern...

von Bernd Klein (Gast)


Lesenswert?

Hallo Leute,

erstmal Danke für die rege Beteiligung an meinem Problem.

So den Code hab ich nicht via Copy&Past eingefügt sondern selbst schnell 
runter geklimpert.

Ich benutzt zum download "sp12" der müsste eigentlich die DATA section 
korrekt downloaden - aber das prüf ich nochmals nach - danke für den 
Tip.
Also mit dem disassemblieren habe ich auch alles gemacht und die 
gleichen Ergebnisse wie Jörg gehabt. Nun ja aus der Not eine Tugend 
gemacht, habe ich halt das Ganze nicht mit einem Array gemacht.
Sollte von Euch doch noch jemand des Rätsels Lösung finden, würde ich 
mich über das Ergebnis freuen.

Erstmals vielen Dank für Eure Hilfen

Gruß

Bernd

von Joerg Wunsch (Gast)


Lesenswert?

> Ich benutzt zum download "sp12" der müsste eigentlich die
> DATA section korrekt downloaden [...]

Nee du.  Das hat mit der Programmiersoftware nun gar nichts zu
tun, es sei denn, Du hättest einen programmer, dem Du das
elf32-avr File direkt unterschieben kannst, aber davon gehe ich
jetzt nicht aus.  Du wirst wohl eher ein Intel Hex (oder Motorola
Srecord oder binary) File benötigen -- und das ist das Ergebnis
eines avr-objcopy aus dem ELF file.  Ebendieses avr-objcopy
muß nun .text und .data (und nur diese) kopieren.  Wenn gar nichts
angegeben ist, werden alle sections mit Inhalt kopiert, das
würde zur Not auch gehen, belegt Dir aber zusätzlichen Flash
(sinnloserweise), falls Du mal EEPROM-Variablen noch hast.

von Bernd Klein (Gast)


Lesenswert?

Oh, das ist ja gut zu wissen. Nunja bin halt noch ein AVR Neuling.

Also nochmals Danke für die vielen guten Tips und nun weiß ich ja

wenn ich mal ein Problem hab, dann frag ich ....


Gruss
Bernd

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.