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
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
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
>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
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.
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
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
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.
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.
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