Есть библиотека для работы с периферией и в ней три статические функции для обмена по SPI-интерфейсу:
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();
};
При компиляции в 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 как можно решить эту проблему.
Сообщение отредактировал IgorKossak - Jun 29 2011, 12:17
Причина редактирования: [codebox]