Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нестандартная С++ функция в IAR EW AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Turion
Есть библиотека для работы с периферией и в ней три статические функции для обмена по 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 как можно решить эту проблему.
KRS
а
#pragma inline=forced
пробовали?
и еще можно функцию как static определить, тогда ей не будет предаваться this как параметр.
Собственно говоря в вашей реализации все функции могут быть static
Turion
Цитата(KRS @ Jun 29 2011, 12:41) *
а
#pragma inline=forced
пробовали?
и еще можно функцию как static определить, тогда ей не будет предаваться this как параметр.
Собственно говоря в вашей реализации все функции могут быть static


Все функции static изначально. Переход к виду:
CODE

inline static unsigned char IO::Exchange(unsigned char x)
{
SPDR = x;

return SPI::WaitExchange();
};

Как и для варианта:

static unsigned char IO::Exchange(unsigned char x)
{
SPDR = x;

#pragma inline = forced
return SPI::WaitExchange();
};

дает на выходе для каждого вызова функции:

ldi R16,0x**
out SPDR,R16

rcall WaitExchange


что отличается от того, что требуется.
KRS
А куда вы прагму то запихали?
ее надо перед описанием функции ставить, почитайте user manual.
И для вставки кода есть теги специальные.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.