реклама на сайте
подробности

 
 
> Нестандартная С++ функция в IAR EW AVR
Turion
сообщение Jun 29 2011, 07:38
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 28-11-05
Пользователь №: 11 498



Есть библиотека для работы с периферией и в ней три статические функции для обмена по 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]
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 22:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.02151 секунд с 7
ELECTRONIX ©2004-2016