www.mikrocontroller.net

Forum: Compiler & IDEs Probleme AVR-GCC und Arrays


Autor: Bernd Klein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ? -

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Fleury (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Bernd Klein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd Klein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.