danimath
25.08.2011, 19:11
Moin *,
nur des Verständnisses wegen (weil ich gerade mit dem I2C-Bus kämpfe ;)).
Zur Funktion:
uint8_t getCommand(void)
{
if(I2CTWI_writeRegisters[I2C_REGW_CMD] && !I2CTWI_writeBusy)
{
cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)
param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...
param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];
param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];
param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];
param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];
param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];
return true;
}
return false;
}
1. Die if-Bedingung würde ich umdrehen:
if (!I2CTWI_writeBusy && I2CTWI_writeRegisters[I2C_REGW_CMD])
Wenn der Compiler optimiert, braucht der "teure" Indexzugriff nicht ausgeführt werden, wenn die erste Bedingung schon falsch ist. Oder?
2. clear command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0;
Wenn ich das richtig verstanden habe, dann dient das Zurücksetzen dazu, dem Master zu signalisieren, dass der Slave den Befehl verstanden und die Parameter gespeichert hat. Sollte das denn nicht am Ende (nach den param-Zuweisungen) stehen? So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben. Oder?
Ja - ich weiß - es steht in vielen Kommentaren, dass die Programme Raum für Verbesserungen bieten (und SlyD hat das ja auch mehrfach betont!). Gehört diese Funktion auch dazu?
viele Grüße
Andreas
nur des Verständnisses wegen (weil ich gerade mit dem I2C-Bus kämpfe ;)).
Zur Funktion:
uint8_t getCommand(void)
{
if(I2CTWI_writeRegisters[I2C_REGW_CMD] && !I2CTWI_writeBusy)
{
cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)
param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...
param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];
param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];
param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];
param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];
param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];
return true;
}
return false;
}
1. Die if-Bedingung würde ich umdrehen:
if (!I2CTWI_writeBusy && I2CTWI_writeRegisters[I2C_REGW_CMD])
Wenn der Compiler optimiert, braucht der "teure" Indexzugriff nicht ausgeführt werden, wenn die erste Bedingung schon falsch ist. Oder?
2. clear command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0;
Wenn ich das richtig verstanden habe, dann dient das Zurücksetzen dazu, dem Master zu signalisieren, dass der Slave den Befehl verstanden und die Parameter gespeichert hat. Sollte das denn nicht am Ende (nach den param-Zuweisungen) stehen? So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben. Oder?
Ja - ich weiß - es steht in vielen Kommentaren, dass die Programme Raum für Verbesserungen bieten (und SlyD hat das ja auch mehrfach betont!). Gehört diese Funktion auch dazu?
viele Grüße
Andreas