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

 
 
 
Reply to this topicStart new topic
> Нестандартная С++ функция в 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
KRS
сообщение Jun 29 2011, 08:41
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а
#pragma inline=forced
пробовали?
и еще можно функцию как static определить, тогда ей не будет предаваться this как параметр.
Собственно говоря в вашей реализации все функции могут быть static
Go to the top of the page
 
+Quote Post
Turion
сообщение Jun 29 2011, 11:52
Сообщение #3





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



Цитата(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


что отличается от того, что требуется.

Сообщение отредактировал IgorKossak - Jun 29 2011, 12:18
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 29 2011, 11:54
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А куда вы прагму то запихали?
ее надо перед описанием функции ставить, почитайте user manual.
И для вставки кода есть теги специальные.
Go to the top of the page
 
+Quote Post

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

 


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


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