(STM32) Änderung an nicht verwendeter Funktion ändert Gesamtfunktionalität

Gast #3041486
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?
Gast #3041819
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?
#3041828
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.
#3041849
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.
#3041943
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.
Gast #3042477
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren