Keil compiler oder FX2 ?

T

Thomas Hoppe

Guest
Hallo !

Ich habe unerklärliche Probleme mit dem Cypress FX2. Nach kleinen Änderungen
der Firmware habe ich oft das Problem das diese nicht mehr richtig
funktioniert. Tritt dieser Fall auf, reicht manchmal schon das Einfügen
einer relativ sinnlosen Sourcecode-Zeile (BYTE xdata dummy[] = "dummy";) und
schon funktioniert das Ganze wieder. Ich habe leider keine Ahnung was daran
Schuld ist. Der Keil-Compiler ? Der Linker ? Der FX2 ? Vielleicht hat schon
jemand Erfahrung mit diesem Problem gehabt ? Momentan muß ich einen größeren
Sourcecode zur Firmware hinzufügen. Laut meiner Debug-Ausgabe über die
serielle Schnittstelle startet die Firmware, bleibt dann aber nach einer
gewissen Zeit hängen (es kommt immer wieder das gleiche Zeichen über die
serielle Schnitstelle anstatt meiner Debug-Ausgaben.)
Mein Vorgänger hatte die gleichen Probleme und das Ganze tritt auf
verschiedener Hardware auf, es scheint also nicht bloß eine falsche
Code-Zeile oder eine defekte Hardware zu sein.

Vielen Dank schonmal,
Thomas Hoppe
 
Thomas Hoppe schrieb:
Hallo !

Ich habe unerklärliche Probleme mit dem Cypress FX2. Nach kleinen Änderungen
der Firmware habe ich oft das Problem das diese nicht mehr richtig
funktioniert. Tritt dieser Fall auf, reicht manchmal schon das Einfügen
einer relativ sinnlosen Sourcecode-Zeile (BYTE xdata dummy[] = "dummy";) und
schon funktioniert das Ganze wieder. Ich habe leider keine Ahnung was daran
Schuld ist. Der Keil-Compiler ? Der Linker ? Der FX2 ? Vielleicht hat schon

Hallo,
lies mal im Keil Compiler Manual über volatile nach, das sollte man bei
allen Peripheriezugriffen verwenden.
Dann solltest Du Dir mal im Assembler Listing anschauen was der Compiler
an solchen Stellen daraus macht.
Beim Optimieren des Codes können Schreiboperationen an eine Adresse, die
danach nicht mehr gelesen wird entfernt werden, da bei einem
Speicherzugriff diese Schreiboperationen keine Auswirkung haben. Wenn
man die Warnungen einschaltet und liest steht da: Operation with
possibly no effect.
Auch bei der Kommunikation über eine globale Variable kann volatil
wichtig sein bei entsprechenden RAM Zugriffen.

Schau dir auch mal die Compiler Options an, Object, Optimization Level 0
bis 6.
Stimmt das Timing bei Hardwarezugriffen? Evtl. ist der Prozessor zu
schnell und da müssen noch einige _nop_ dazwischen.

Bye
 
Hallo Thomas,

Ich habe unerklärliche Probleme mit dem Cypress FX2. Nach kleinen Änderungen
der Firmware habe ich oft das Problem das diese nicht mehr richtig
funktioniert. Tritt dieser Fall auf, reicht manchmal schon das Einfügen
einer relativ sinnlosen Sourcecode-Zeile (BYTE xdata dummy[] = "dummy";) und
schon funktioniert das Ganze wieder. Ich habe leider keine Ahnung was daran
Schuld ist. Der Keil-Compiler ? Der Linker ?
es könnte Dir hier vielleicht helfen kann, die Linker-Mapfile von einer
funktionierenden und einer abstürzenden Version zu vergleichen,
und den Code, der die Variablen vor und nach dem eingefügten Dummy-Array
benutzt, auf Array-Grenzen-Überschreitung überprüfen.
Eventuell auch mal bei der funktionierenden Version Code einbauen,
der den Inhalt des Dummy-Array ausgibt, evtl. wird dieser ja überschrieben?

Bei Keil/C51 ist ausserdem eine potentielle Fehlerquelle, dass die
im xdata - Speicher ab 0x0000 platzierte Variable die Adresse NULL
hat, Konstrukte wie

char xdata* p = dummy;
if (p == NULL)
{
}

funktionieren dann nicht wie erwartet, wenn dummy an xdata-Adresse 0 liegt.

Ansonsten tippe ich bei Deiner Fehlerbeschreibung eher auf Probleme mit
Interrupt-Routinen - evtl. gibt es Code-Stellen, bei denen Interrupts
gesperrt werden müssten, wo dies versäumt wurde.
Verwendung der gleichen 16-Bit-Variablen im Hauptprogramm und in der
Interrupt-Routine wäre so ein Fall...

Gruß
Ernst
 

Welcome to EDABoard.com

Sponsor

Back
Top