Forum: Mikrocontroller und Digitale Elektronik (STM32) Änderung an nicht verwendeter Funktion ändert Gesamtfunktionalität


von Andi (Gast)


Lesenswert?

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:
1
void neverCalledFunction()
2
{
3
  if (DISABLE_INTERFACE_CHECK == 1 || incomingInterface == INT_USART)
4
  {
5
    static Packet packetF2;    
6
    packetF2 = generatePacket(data,len);
7
    
8
    if (packetF2.data[1] == getId())
9
    {
10
      run_bootloader();  //Uses LVDS1
11
    }
12
    else
13
    {
14
      uint8_t myId = getId();
15
      uint8_t updateId = packetF2.data[1];
16
      Packet F6response = prepareF6UpdateConfirmation();
17
      flatPacket(F6response, txData);
18
      USART_Disable();
19
      
20
      if((packetF2.data[1] >= 2) && (updateId-2 == myId) || updateId+2 == myId)
21
      //if((myId < 2) && (packetF2.data[1] >= 2) && (updateId-2 == myId))
22
      {
23
        LVDS_Disable(LVDS1);
24
        //SetFWUpdateFlag(1);
25
      }
26
    }                
27
  }
28
}

Hat jemand eine Idee, was das Problem sein könnte?

von Coder (Gast)


Lesenswert?

Das kann eigentlich nicht sein. Funktioniert denn die Firmware sonst 
Fehlerfrei ?

von Arne (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Johannes E. (cpt_nemo)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Arne (Gast)


Lesenswert?

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.

von Johannes E. (cpt_nemo)


Lesenswert?

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.

von Reinhard Kern (Gast)


Lesenswert?

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

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.