Hallo,
ich habe eine STM32-FW, die die Funktionalität ändert, wenn ich eine
Funktion ändere, die im ausgeführten Testfall nie aufgerufen wird!
Für die Entwicklung setze ich IAR Studio ein.
Hier mein Codeausschnitt:
Der IAR Linker unterstützt IIRC selective linking ergo sollte Deine
Gunktion gar nicht im Object auftauchen. Irgendwelche Auffälligkeiten im
Map-File? Die Start-, Endadressen im Linkerskript passen?
Es sind durchaus Szenarien denkbar, in denen eine nicht aufgerufene
Funktion eine gewisse Rolle spielt. Sogar dann, wenn der Linker sie
rauswirft.
So kann sich dadurch ändern, ob eine andere Funktion inlined wird,
beispielsweise wenn sie als Folge der Änderung nur einmal aufgerufen
wird. Und der Optimizer dich infolgedessen subtil auf Programmierfehler
aufmerksam macht. Dies nur als Beispiel.
Andi schrieb:> wenn ich eine> Funktion ändere, die im ausgeführten Testfall nie aufgerufen wird!
Es kommt nicht unbedingt drauf an, ob die Funktion in deinem Testfall
ausgeführt wird, sondern, ob die Funktion überhaupt irgendwo verwendet
wird.
Nur wenn sie gar nie verwendet wird, kann der Kompiler bzw. Linker die
Funktion ignorieren und dann sollte sie auch keine Auswirkung auf das
erzeugte Kompilat haben.
Du verwenderst eine static-Variable:
> static Packet packetF2;
Diese wird auf dem heap angelegt, wodurch sich die Speicherstellen von
anderen Variablen verschieben können. Evtl. bewirkts das die von dir
beobachtete Veränderung.
Johannes E. schrieb:> Du verwenderst eine static-Variable:> Diese wird auf dem heap angelegt,
Zwar kenne ich den IAR nicht, aber das wäre schon sehr exotisch.
A. K. schrieb:> Johannes E. schrieb:>> Du verwenderst eine static-Variable:>> Diese wird auf dem heap angelegt,>> Zwar kenne ich den IAR nicht, aber das wäre schon sehr exotisch.
Da hast Du recht: das ist Quark.
Daher ja auch meine Frage wg. Map-File.
A. K. schrieb:> Johannes E. schrieb:>> Du verwenderst eine static-Variable:>> Diese wird auf dem heap angelegt,>> Zwar kenne ich den IAR nicht, aber das wäre schon sehr exotisch.
OK, das war vermutlich falsch. Ich wollte damit sagen, dass die static
variable nicht auf dem Stack abgelegt wird, sondern dort, wo globale
Variablen auch liegen (wie immer dieser Speicherbereich auch heist).
Deswegen können sich die Speicherplätze der anderen globalen Variablen
verschieben, wenn eine Funktion mit static variablen vorhanden ist.
Und diese Verschiebung kann sich irgendwie auf die Funktionalität des
Programms auswirken, auch wenn die Funktion gar nicht aufgerufen wird.
Johannes E. schrieb:> Und diese Verschiebung kann sich irgendwie auf die Funktionalität des> Programms auswirken, auch wenn die Funktion gar nicht aufgerufen wird.
Nicht wenn das Programm korrekt ist - aber das ist eben der GAU beim
Programmieren, irgendwo ist ein Fehler drin, aber wo ganz anders, und
indirekt wirkt sich der Fehler dann darüber unterschiedlich aus, dass
variable an anderen Adressen stehen (was ja eigentlich völlig egal sein
sollte).
Einfaches Beispiel: durch einen falschen Index oder pointer wird eine
Speicherstelle überschrieben (u.a. overflow), aber eine bei der das
zufällig nichts ausmacht oder man es zumindest nicht bemerkt. Durch eine
Verschiebung der Adressen ist aber plötzlich eine wichtige Funktion
betroffen.
Gruss Reinhard