CODE
void IO::PreWrite(unsigned char x) // Передача
{
SPDR = x;
};
unsigned char IO::Exchange(unsigned char x) // Обмен данными
{
SPDR = x;
while((SPSR & (1 << SPIF)) == 0){ };
return SPDR;
};
unsigned char IO::WaitExchange(void) // Ожидание готовности
{
while((SPSR & (1 << SPIF)) == 0){ };
return SPDR;
};
Очевидно что Exchange и WaitExchange частично совпадают, поэтому попробуем их объединить:
unsigned char IO::Exchange(unsigned char x)
{
SPDR = x;
return SPI::WaitExchange();
};
{
SPDR = x;
};
unsigned char IO::Exchange(unsigned char x) // Обмен данными
{
SPDR = x;
while((SPSR & (1 << SPIF)) == 0){ };
return SPDR;
};
unsigned char IO::WaitExchange(void) // Ожидание готовности
{
while((SPSR & (1 << SPIF)) == 0){ };
return SPDR;
};
Очевидно что Exchange и WaitExchange частично совпадают, поэтому попробуем их объединить:
unsigned char IO::Exchange(unsigned char x)
{
SPDR = x;
return SPI::WaitExchange();
};
При компиляции в IAR AVR v5.30-v5.51 получается следующий код:
Exchange:
out SPDR,R16
rcall WaitExchange
Хотя я ожидал получить:
Exchange:
out SPDR,R16
WaitExchange:
in R16,SPSR
sbrs R16,7
rjmp WaitExchange
in R16,SPDR
ret
Вариации степеней оптимизации и преобразование IO::Exchange в inline эффекта не дали. Подскажите уважаемые гуру С++ и IAR как можно решить эту проблему.