mikrocontroller.net

Forum: Compiler & IDEs Optimierung scheint zu gut (Code wird nicht ausgeführt)


Autor: Alex1 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau ist chk_bit? Kann es sein, dass diese Funktion / dieser Macro 
mit diesen Parametern grundsätzlich nur 0 liefert?

Autor: Alex1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, chk_bit ist ein Makro:
#define chk_bit(x,y) (x & (y))   // Check bit y in byte x

Alex

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird denn
tInt8 ReadBatteryStatus (void)
  {
   ...
   if (Ret == TWI_NO_ERROR)
      {
       ...
      }
   ...
  }
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
if (Ret == TWI_NO_ERROR)

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

Kann da der Hund begraben liegen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagen denn die Compilerwarnungen bei -Wall -Wextra so?

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß
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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt immer noch die Definition von SW_OK.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Ret == TWI_NO_ERROR
anders als
Ret == (tInt8)TWI_NO_ERROR
?!

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir sollten warten bis der Fragesteller Antwort auf die SW_OK Frage 
gibt, das halte ich nämlich für die wahrscheinlichste Ursache. 
Vielleicht hat er das ja auch schon gemerkt und sich längst ausgeklinkt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SW_OK ist 0. Das ergibt sich aus dem Listing
    tIntU16 nBatteryStatus = SW_OK;
      d0:  1a 82         std  Y+2, r1  ; 0x02
      d2:  19 82         std  Y+1, r1  ; 0x01

r1 ist bei GCC immer 0, wenn ich mich nicht irre.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann... case closed. Alex1 hätte sich freilich noch mal melden 
können.

Autor: Alex1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

das ist ja ein Ding!!! So viele Rückmeldungengen in so kurzer Zeit...

Es war das makro (war immer false).

Danke

Alex

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.