Forum: Compiler & IDEs AVR GCC Compiler Verhalten unter Arduino IDE Management


von Gerhard O. (gerhard_)


Lesenswert?

Ich komme zu Euch mit einer Frage da ich mir momentan nicht selber 
weiter zu helfen vemag. Bitte lasst mich wissen ob ich die Quellen 
posten soll.

Das Problem und Hintergrund:

Ein von mir erstelltes Program für einen 1284P MCU welches als 
Einzelquell Datei im Arduino IDE einwandfrei funktioniert zeigt nach 
Umsetzung in ein modulares Programm mit zahlreichen Modulen nun ein 
sonderbares Verhalten mit statischen Variablen innerhalb ein paar 
Funktionen. Dieses Programm verwendet nur die Arduino EEPROM und Serial 
Libraries. Sonst ist es als so weit wie möglich als konventionell 
geschriebenes Program ausgeführt. Ich verwende sonst keine Arduino 
bezogene Anweisungen. Alle Hardware bezogenen Register Zugriffe sind in 
konventioneller Art ausgeführt. Mir ist ein Vetsagen von statischen 
Variablen noch nie vorgekommen.

Die Probleme traten in einer TIMER ISR und ADC ISR von mir auf und eine 
normale aufgerufene Funktion. Allen diesen Routinen ist gemeinsam, dass 
statische Variablen vorhanden sind. Die Statischen Zählervariablen 
zählen nicht richtig und statische boolean Flags haben Werte zwischen 0, 
1, und 2.

Sonst verhalten sich alle anderen Programm Funktionen richtig. Das 
komische ist, so bald ich die beiden Funktionen wieder in das 
Hauptprogram (.INO) zurück verfrachte, funktionieren alles wieder wie 
vorher einwandfrei.
Statische variablen als volatile globale zu deklarieren hat auch nicht 
geholfen.

Es gibt absolut keine Compiler Warnungen oder Fehler. die extra Programm 
Dateien von mir sind alle als ".cpp oder .h" ausgeführt.

Nun nehme ich vorerst nicht an, dass hier ein echter GCC Kompiler Fehler 
vorliegt. Eher vermute ich, dass irgendeine vom Arduino IDE gesetzte 
ungünstige Kompiler Flag oder Einstellung vielleicht das Problem 
irgendwie verursacht. Es ist auch möglich, dass Arduino Für mich 
ungünstige nicht ersichtliche Konfigurierungen vornimmt. Dieses Problem 
ist mir im Augenblick noch zu schwierig da ich die Feinheiten vom GCC 
Kompiler leider nicht im Griff habe.

Ich habe die Kommandoline modifiziert um einen Map File zu erhalten. 
Aber da muss ich mich erst mal durch arbeiten. Gibt es eine Symbol Table 
Datei wo die Adresse jeder Variablen gelistet ist?

Was meint Ihr dazu? Hoffnungsloser Fall? Soll ich das ganze Programm 
hier posten? Aufgeben?

Das Problem für mich liegt speziell auch in der Notwendigkeit, das 
Arduino IDE zur Wartung und Entwicklung benützen zu können, weil dies 
ein Open Source HW/SW Datenlogger Projekt sein soll.
Für mich selber würde ich mit CodevisionAVR oder unabhängigen GCC-AVR 
arbeiten und hätte dieses spezifische Problem schon von vornherein 
nicht. Ein sehr ähnliches Program funtioniert unter CV-AVR als modulares 
Programm sowieso einwandfrei. Aber diese Lösung verfehlt den Zweck 
dieses Projektes. Dieses Programm hat in ähnlicher Form ohne wesentliche 
Änderungen übrigens auch unter einigen PIC Familien(16/18/24/30/33), 
AVR, STM32, Z8, und 8051 immer einwandfrei funktioniert.

Zur Zeit habe ich leider AVR-GCC (noch) nicht als unabhängige Tool Chain 
installiert und müsste mir auch einen Makefile zusammenzustricken.

Ich bin Euch für jede Hilfe oder Denkanstoß recht dankbar. vielleicht 
ist die Lösung des Problems nachher sogar so einfach und offensichtlich 
dass ich mich danach schämen muß um nicht selber darauf gekommen zu 
sein. Zur Zeit habe ich leider noch große Balken vor dem Kopf.


Mfg,
Gerhard

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Gibt es eine Symbol Table Datei wo die Adresse jeder Variablen gelistet
> ist?

avr-nm <name der ELF-Datei>

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Gibt es eine Symbol Table Datei wo die Adresse jeder Variablen gelistet
>> ist?
>
> avr-nm <name der ELF-Datei>

Danke, Joerg! Werde das gleich anpacken.

Gruss,
Gerhard

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Gibt es eine Symbol Table Datei wo die Adresse jeder Variablen gelistet
>> ist?
>
> avr-nm <name der ELF-Datei>

Hallo Joerg,

hat funktioniert. Leider zeigen beide Programm Versionen keinen 
Unterschied außer einer geringfügiger Verschiebung der Variablen 
Adressen. Es sind alle der Problem statischen Variablen richtig nach Typ 
aufgelistet.

Trotzdem bin ich jetzt ein bischen weiter.


Gerhard

von Stefan E. (sternst)


Lesenswert?

Gerhard O. schrieb:
> Eher vermute ich, dass irgendeine vom Arduino IDE gesetzte
> ungünstige Kompiler Flag oder Einstellung vielleicht das Problem
> irgendwie verursacht. Es ist auch möglich, dass Arduino Für mich
> ungünstige nicht ersichtliche Konfigurierungen vornimmt.

Viel wahrscheinlicher ist es, dass das Problem in deinem Programm zu 
suchen ist, z.B. ein Schreiben über das Ende eines Arrays hinaus. Im 
(scheinbar) funktionierenden Fall wird dabei halt einfach nichts 
lebenswichtiges getroffen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan E. schrieb:
> Viel wahrscheinlicher ist es, dass das Problem in deinem Programm zu
> suchen ist, z.B. ein Schreiben über das Ende eines Arrays hinaus.

Yep, sowas wäre jetzt auch meine nächste Idee gewesen.

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Stefan E. schrieb:
>> Viel wahrscheinlicher ist es, dass das Problem in deinem Programm zu
>> suchen ist, z.B. ein Schreiben über das Ende eines Arrays hinaus.
>
> Yep, sowas wäre jetzt auch meine nächste Idee gewesen.

Hallo Stephan und Joerg,

Danke für den Hinweis, werde in dieser Richtung recherchieren.

Die in Frage kommenden Funktionen verwenden in der Tat Arrays;-)

Gerhard

: Bearbeitet durch User
von Gerhard O. (gerhard_)


Lesenswert?

Gerhard O. schrieb:
> Jörg W. schrieb:
>> Stefan E. schrieb:
>>> Viel wahrscheinlicher ist es, dass das Problem in deinem Programm zu
>>> suchen ist, z.B. ein Schreiben über das Ende eines Arrays hinaus.
>>
>> Yep, sowas wäre jetzt auch meine nächste Idee gewesen.
>
> Hallo Stephan und Joerg,
>
> Danke für den Hinweis, werde in dieser Richtung recherchieren.
>
> Die in Frage kommenden Funktionen verwenden in der Tat Arrays;-)
>
> Gerhard

Wenn ich die (globalen) Arrays als erstes deklariere und dann erst die 
paar anderen globalen variablen, dann funktioniert das Programm wieder 
richtig. Gegen Array Überschreitungen hatte ich entsprechenden Schutz 
Code eingebaut.

Sobald ich den alten Zustand wieder herstelle, habe ich wieder die alten 
Probleme.

Ganz klar ist mir im Augenblick nicht was hier vor sich geht. Man 
muesste das mal mit dem Debugger untersuchen.

Was mir auffällt ist, daß die Adreßbereiche der Arrays nicht aneinander 
gegliedert zu scheinen. Beim PIC Compiler waren in der Symbol Tabelle 
Arrays immer genau nach Groesse aneinander gereiht.


Vorerst vielen Dank,
Gerhard

von chris_ (Gast)


Lesenswert?

>Wenn ich die (globalen) Arrays als erstes deklariere und dann erst die
>paar anderen globalen variablen, dann funktioniert das Programm wieder
>richtig. Gegen Array Überschreitungen hatte ich entsprechenden Schutz
>Code eingebaut.

Das klingt ziemlich nach einem Pointerüberlauf.
Du könntest zum Test Deine Arrays ein wenig größer als benötigt machen.

An die AVR-GCC Experten: Wie ist es mit einen Stack-Überlauf? Wie groß 
ist eigentlich der Stack und wo liegt er?

von Gerhard O. (gerhard_)


Lesenswert?

chris_ schrieb:
>>Wenn ich die (globalen) Arrays als erstes deklariere und dann erst die
>>paar anderen globalen variablen, dann funktioniert das Programm wieder
>>richtig. Gegen Array Überschreitungen hatte ich entsprechenden Schutz
>>Code eingebaut.
>
> Das klingt ziemlich nach einem Pointerüberlauf.
> Du könntest zum Test Deine Arrays ein wenig größer als benötigt machen.

Danke für den Hinweis. Werde ein paar Versuche in dieser Richtung 
unternehmen.

Nachtrag: Habe den Nichtsnutz gerade überführt: Das 16-bit Resultat 
Array für die ADC ISR Ausgabe hat einen Array Ueberlauf produziert. Ich 
hatte da in der Tat einen Gerhard-BUG(!) welche einen Array Überlauf 
(n+1) verursacht hatte. Nach Behebung lässt sich das Programm nun jetzt 
durch nichts mehr stören. Saß der Übeltäter doch tatsächlich vor dem 
Computer...


Gerhard
>
> An die AVR-GCC Experten: Wie ist es mit einen Stack-Überlauf? Wie groß
> ist eigentlich der Stack und wo liegt er?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

chris_ schrieb:
> An die AVR-GCC Experten: Wie ist es mit einen Stack-Überlauf?

Unwahrscheinlich.

> Wie groß
> ist eigentlich der Stack und wo liegt er?

By default werden die Daten von unten nach oben im SRAM abgelegt,
der Stack vom Ende nach unten.  Solange der SRAM nicht schon zu 98 %
mit statischen/globalen Daten gefüllt ist, läuft der Stack da
normalerweise nicht rein.

Schön, Gerhard, dass du's gefunden hast.  Ein ATmega1284P hat JTAG,
da könntest du übrigens auch Breakpoints auf Daten setzen und dann
sehen, wer da was überschreibt.

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> chris_ schrieb:
>> An die AVR-GCC Experten: Wie ist es mit einen Stack-Überlauf?
>
> Unwahrscheinlich.
>
>> Wie groß
>> ist eigentlich der Stack und wo liegt er?
>
> By default werden die Daten von unten nach oben im SRAM abgelegt,
> der Stack vom Ende nach unten.  Solange der SRAM nicht schon zu 98 %
> mit statischen/globalen Daten gefüllt ist, läuft der Stack da
> normalerweise nicht rein.
>
> Schön, Gerhard, dass du's gefunden hast.  Ein ATmega1284P hat JTAG,
> da könntest du übrigens auch Breakpoints auf Daten setzen und dann
> sehen, wer da was überschreibt.

Die JTAG Pins sind zur Not über einen Header zugänglich . Z.Zt. habe ich 
allerdings  den JTAG Port über eine Fuse Setting abgeschaltet weil ich 
einige der JTAG für die Applikation brauche. Der Fehler war allerdings, 
nachdem Ihr mich mit der Nase auf die mögliche Ursache gestupst hattet, 
gleich gefunden. Dieser Bug existierte, wie ich jetzt mit rotem Gesicht 
zugeben muß, schon viele Jahre lang auf allen möglichen MCUs und 
Projekten ohne sich jemals vorher auf diese Art bemerkbar zu machen. Ist 
also ein  Fehler mit Stealth Verhalten - Sehr nasty!!!


Gruss,
Gerhard

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Z.Zt. habe ich allerdings  den JTAG Port über eine Fuse Setting
> abgeschaltet weil ich einige der JTAG für die Applikation brauche.

Nicht ganz so geschickt.  Schalt' ihn lieber per JTD-Bit ab, dann
kannst du bei Bedarf das JTAG trotzdem noch nutzen: entweder eine
Firmware einspielen, die JTD eben nicht setzt, oder genau auf die
timed sequence, mit der man JTD aktiviert, erstmal einen Breakpoint,
dann per single-step durch – damit ist die timed sequence im Eimer,
und das JTAG bleibt aktiviiert. ;-)  Wenn man an die JTAG-Pins dann
ein paar nicht ganz so wichtige LEDs klemmt, stört das auch nicht so
sehr.

von Gerhard O. (gerhard_)


Lesenswert?

Vielen Dank für Deine JTAG Hinweise. Bis jetzt hatte ich mich mit den 
JTAG Funktionen des 1284P nicht befasst weil ich ursprünglich keine 
Absicht gehabt hatte JTAG zu verwenden.

Welche JTAG Debug Software ist für Windows) am günstigsten und welches 
JTAG Interface hat sich hier am besten bewährt?


mfg,
Gerhard

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Z.Zt. habe ich allerdings  den JTAG Port über eine Fuse Setting
>> abgeschaltet weil ich einige der JTAG für die Applikation brauche.
>
> Nicht ganz so geschickt.  Schalt' ihn lieber per JTD-Bit ab, dann
> kannst du bei Bedarf das JTAG trotzdem noch nutzen: entweder eine
> Firmware einspielen, die JTD eben nicht setzt, oder genau auf die
> timed sequence, mit der man JTD aktiviert, erstmal einen Breakpoint,
> dann per single-step durch – damit ist die timed sequence im Eimer,
> und das JTAG bleibt aktiviiert. ;-)  Wenn man an die JTAG-Pins dann
> ein paar nicht ganz so wichtige LEDs klemmt, stört das auch nicht so
> sehr.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Welche JTAG Debug Software ist für Windows) am günstigsten

Für Windows: nimm das Hersteller-Tool, Atmel Studio.

> und welches
> JTAG Interface hat sich hier am besten bewährt?

Die gehen alle, aktuell (falls du noch keinst hast) würde ich das
Atmel-ICE kaufen.  Bietet das beste Preis-/Leistungsverhältnis.

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Welche JTAG Debug Software ist für Windows) am günstigsten
>
> Für Windows: nimm das Hersteller-Tool, Atmel Studio.
>
>> und welches
>> JTAG Interface hat sich hier am besten bewährt?
>
> Die gehen alle, aktuell (falls du noch keinst hast) würde ich das
> Atmel-ICE kaufen.  Bietet das beste Preis-/Leistungsverhältnis.

Danke für Deine Hinweise. Ich habe mal kurz recherchiert und fand ein 
Atmel JTAG-ICE:

http://www.ebay.ca/itm/like/111529325052?limghlpsr=true&hlpht=true&ul_noapp=true&hlpv=2&chn=ps&lpid=116&ops=true&viphx=1

Werde ich mir auf alle Fälle zulegen und ausprobieren damit ich nächstes 
mal für den "Fall aller Fälle" gewappnet bin;-)

Mit JTAG habe ich bis jetzt nur mit LPC ARM und STM32 gearbeitet. Wäre 
toll wenn das auf dem AVR genauso gut funktionieren würde. Bin froh dass 
ich die JTAG Pins schon auf einem Header zugänglich habe. Das Kabel 
Pinout wird allerdings nicht stimmen. Aber das ist ja kein wirkliches 
Problem.


Gruss,
Gerhard

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Ich habe mal kurz recherchiert und fand ein Atmel JTAG-ICE:

Nope.  Das ist entweder ein AVRISPmkII (so man auf dem schwammigen
Foto erkennen kann) oder ein billigst-Clone des 15 Jahre alten
ersten JTAGICE von Atmel (später zuweilen als JTAGICEmkI bezeichnet).
Ersteres ist ein reiner Programmer, letzteres völlig obsolet, damit
kann man nur hornaltes Zeug debuggen (maximal ATmega128, AT90CAN128
oder ATmega169).

Ich meine dieses hier:

http://www.digikey.com/product-detail/en/ATATMEL-ICE-BASIC/ATATMEL-ICE-BASIC-ND/4753381

bzw. mit allen Kabeln:

http://www.digikey.com/product-detail/en/ATATMEL-ICE/ATATMEL-ICE-ND/4753379

Gibt's auch als nacktes Board:

http://www.digikey.com/product-detail/en/ATATMEL-ICE-PCBA/ATATMEL-ICE-PCBA-ND/4753383

aber den Stress, sich die Kabel für Stecker mit 1,27 mm Rastermaß
selbst zu fummeln, würde ich mir an deiner Stelle nicht antun.

: Bearbeitet durch Moderator
von Gerhard O. (gerhard_)


Lesenswert?

Bin froh, dass ich den noch nicht bestellt habe. Das wäre offensichtlich 
ins Auge gegangen. Ich wunderte mich schon dass D.K. den von eBAy nicht 
im Lieferprogramm aufführte. Danke.

Der Link mit den Kabel scheint keine schlechte Wahl zu sein, da viele 
Anschlussmöglichkeiten bestehen. Für ein neues Design könnte man dann 
schon von Anfang an den JTAG Anschluss kompatibel zu belegen.

Gerhard


Jörg W. schrieb:
> Gerhard O. schrieb:
>> Ich habe mal kurz recherchiert und fand ein Atmel JTAG-ICE:
>
> Nope.  Das ist entweder ein AVRISPmkII (so man auf dem schwammigen
> Foto erkennen kann) oder ein billigst-Clone des 15 Jahre alten
> ersten JTAGICE von Atmel (später zuweilen als JTAGICEmkI bezeichnet).
> Ersteres ist ein reiner Programmer, letzteres völlig obsolet, damit
> kann man nur hornaltes Zeug debuggen (maximal ATmega128, AT90CAN128
> oder ATmega169).
>
> Ich meine dieses hier:
>
> 
http://www.digikey.com/product-detail/en/ATATMEL-ICE-BASIC/ATATMEL-ICE-BASIC-ND/4753381
>
> bzw. mit allen Kabeln:
>
> http://www.digikey.com/product-detail/en/ATATMEL-ICE/ATATMEL-ICE-ND/4753379

>
> Gibt's auch als nacktes Board:
>
> 
http://www.digikey.com/product-detail/en/ATATMEL-ICE-PCBA/ATATMEL-ICE-PCBA-ND/4753383
>
> aber den Stress, sich die Kabel für Stecker mit 1,27 mm Rastermaß
> selbst zu fummeln, würde ich mir an deiner Stelle nicht antun.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Für ein neues Design könnte man dann schon von Anfang an den JTAG
> Anschluss kompatibel zu belegen.

Und wenn du die „Luxusversion“ kaufst, dann hast du noch diesen
„Tintenfisch-Adapter“, mit dem du auf einem beliebigen Board die
JTAG-Pins abgreifen kannst. ;-)

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Für ein neues Design könnte man dann schon von Anfang an den JTAG
>> Anschluss kompatibel zu belegen.
>
> Und wenn du die „Luxusversion“ kaufst, dann hast du noch diesen
> „Tintenfisch-Adapter“, mit dem du auf einem beliebigen Board die
> JTAG-Pins abgreifen kannst. ;-)

Ist das die kleine Adapter Stecker Platine?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Gerhard O. schrieb:
> Ist das die kleine Adapter Stecker Platine?

Nein, das Kabel hier.

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Ist das die kleine Adapter Stecker Platine?
>
> Nein, das Kabel hier.

Mit einiger Fantasie sieht es tatsächlich Tintenfisch Tentakel 
ähnlich;-)

Gruss,
Gerhard

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Gerhard O. schrieb:
> Mit einiger Fantasie sieht es tatsächlich Tintenfisch Tentakel
> ähnlich;-)

Beim Vorvorgänger (JTAGICEmkII) sah es einem solchen noch deutlich
ähnlicher. ;)

Dumm nur, dass sie das mit dem Widerstands-Farbcode-codierten Kabel
nicht geschnallt haben und Pin 1 auf schwarz, Pin 2 auf weiß etc.
gelegt haben.

von Gerhard O. (gerhard_)


Lesenswert?

Jörg W. schrieb:
> Gerhard O. schrieb:
>> Mit einiger Fantasie sieht es tatsächlich Tintenfisch Tentakel
>> ähnlich;-)
>
> Beim Vorvorgänger (JTAGICEmkII) sah es einem solchen noch deutlich
> ähnlicher. ;)
>
> Dumm nur, dass sie das mit dem Widerstands-Farbcode-codierten Kabel
> nicht geschnallt haben und Pin 1 auf schwarz, Pin 2 auf weiß etc.
> gelegt haben.

Ja, das wäre mir auch lieber.

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.