Optimierung scheint zu gut (Code wird nicht ausgeführt)

Gast #768461
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe mal wieder eine OptimierungsSache:

tInt8 ReadBatteryStatus (void)
  {
    tIntU8 Data [3];
    nLastBatteryStatus = SW_UNKNOWN_ERROR;
    Data [0] = BATTERY_STATUS;
    tInt8 Ret = TWI_ReadWord (TWI_SLA_ADDR, Data, 1);
    if (Ret == TWI_NO_ERROR)
      {
        nLastBatteryStatus  = Data [1];
        nLastBatteryStatus |= Data [2] << 8;
      }
    return ((tInt8)Ret);
  }

tSMBusResult BatteryStatusOk (void)
  {
    tInt8 Ret = ReadBatteryStatus ();
//+++++++++++++++++++++++++++++++++
    if (Ret == ((tInt8)TWI_NO_ERROR))
      {
        if (chk_bit (nLastBatteryStatus, SW_OK) != 0)
          return idSMBusResOk;
      }
//+++++++++++++++++++++++++++++++++
    return idSMBusResErr;
  }

Der Code zw. den //++++ wird nir aufgerufen. Habe jetzt schon alle 
optimierungsvarianten durch.

Ich haenge mal das lls dran.
Da ich in asm nur ein gefährliches Halbwissen habe, könnte ich jetzt nur 
mit 50%tigen Sicherheit sagen, dass der Code wegoptimiert wird.
Aber warum?

Danke
Alex
Angehängte Dateien:
Gast #768482
Lesenswert?
• ▲
▼
Hallo,

vielleicht ist SW_OK = 0 und es war eigentlich die Bitnummer 0 gemeint.
Dann sollte das Makro aber so aussehen:

#define chk_bit(x,y) (x & (1 << y))   // Check bit y in byte x

Gruß,
Martin
Gast #768489
Lesenswert?
• ▲
▼
Wird denn
1
tInt8 ReadBatteryStatus (void)
2
  {
3
   ...
4
   if (Ret == TWI_NO_ERROR)
5
      {
6
       ...
7
      }
8
   ...
9
  }
jemals aufgerufen?

Ich meine, wenn Ret niemals TWI_NO_ERROR ist, dann wird in Deine 
Abfrage logischerweise auch nie verzweigt.

Was mir noch auffällt:
In ReadBatteryStatus() vergleichst Du
1
if (Ret == TWI_NO_ERROR)

In BatteryStatusOk() castest Du
1
if (Ret == ((tInt8)TWI_NO_ERROR))

Kann da der Hund begraben liegen?
Gast #768499
Lesenswert?
• ▲
▼
>Optimierung scheint zu gut (Code wird nicht ausgeführt)

An der Optimierung liegt es nicht, und der Code wird auch nicht 
wegoptimiert. Wenn er nicht ausgeführt wird, kanns nur daran liegen, daß
1
if (Ret == ((tInt8)TWI_NO_ERROR))
 nicht erfüllt wird.
Das aber liegt nicht in der Gewalt des Compilers :-)

Was ist denn ein tInt8? Gefallen dir die vordefinierten Typen aus 
stdint.h nicht?

Oliver
#768500
Lesenswert?
• ▲
▼
Stefan wrote:

> if (Ret == ((tInt8)TWI_NO_ERROR))
>
> Kann da der Hund begraben liegen?

Nein. Denn Ret ist vom Typ tInt8 und (tInt8)TWI_NO_ERROR liegt folglich 
in dessen Wertebereich. Und daher kann dieses Statement zwar inhaltlich 
Blödsinn sein, der Compiler darf es aber nicht ignorieren.
Gast #768519
Lesenswert?
• ▲
▼
Andreas Kaiser wrote:
>Denn Ret ist vom Typ tInt8 und (tInt8)TWI_NO_ERROR liegt folglich
>in dessen Wertebereich.
Prinzipiell schon, aber TWI_NO_ERROR muss nicht vom Typ tInt8 sein, 
weshalb ja gecastet wird.
Möglicherweise (Fälschlicherweise) interpretiert der Compiler einen 
Vergleich
1
Ret == TWI_NO_ERROR
anders als
1
Ret == (tInt8)TWI_NO_ERROR
?!
Gast #768527
Lesenswert?
• ▲
▼
Da ReadBatteryStatus (); den Wert schon als tInt8 zurückgibt, kann es 
daran nicht liegen.

Aber egal, da hilft nur debuggen. uart-ausgaben einbauen, LED'S an 
freien Ports an- und auschalten, VMLAB-Modell bauen, JTAG, was auch 
immer.

Da muß jeder irgendwann  mal durch.

Olvier
#768530
Lesenswert?
• ▲
▼
Andreas Kaiser wrote:
> Es fehlt immer noch die Definition von SW_OK.

Ja. Die wäre interessant.
Wenn da steht

#define SW_OK  0

dann wäre das alles erklärbar.
So gross scheint das Programm ja nicht zu sein.
Poste mal alles. Ansonsten ist das ein Stochern im Nebel.

Die Wahrscheinlichkeit dass du einen Programmfehler hast
ist um einige Zehnerpotenzen größer, als das du einen Fehler
im Compiler entdeckt hast.
Gast #768533
Lesenswert?
• ▲
▼
Nachtrag:
1
tInt8 Ret = TWI_ReadWord (TWI_SLA_ADDR, Data, 1);

Ist denn sicher, daß die TWI-Kommunikation überhaupt funktioniert? Wenn 
da immer TWI_ERROR zurückkommt, braucht man weiter unten nicht mehr zu 
suchen.

Oliver

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.