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

 
 
 
Reply to this topicStart new topic
> Компиляция встроенной функции __reverse() в EWAVR 6.11, Либо я, либо компилятор глючит
VladislavS
сообщение May 29 2012, 07:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Здравствуйте.

Переполз с компилятора EW AVR 5.51 на 6.11 и поймал непонятный глюк cо встроенной функцией __reverse().
В 5.51 компилировалось без ошибок. 6.11 ругается на w5100_control.SIPR = __reverse(ip); ошибкой Error[Pa108]: no variant of the generic intrinsic function "" available for the type "unsigned long" D:\!Projects\Reverse_test\6.11\main.cpp 19

При этом в функции reverse() та же функция с теми же типами данных проходит. И дальше по коду return __reverse(x); тоже нормально. И если вместо __reverse() в проблемном месте использовать reverse(), то тоже нормально.

CODE
#include <ioavr.h>
#include <stdint.h>

typedef struct
{
uint32_t SIPR; // Source IP Address
} W5100_CONTROL;

//#pragma location=0x8000
__no_init volatile W5100_CONTROL w5100_control;

uint32_t reverse(uint32_t data)
{
return __reverse(data); //Вот так всё хорошо
}

class W5100
{
public:
void SetIP(uint32_t ip)
{
w5100_control.SIPR = __reverse(ip); //Тут проблема
// w5100_control.SIPR = reverse(ip); //А вот тут уже всё нормально
};
};

W5100 w5100;

int main()
{
w5100.SetIP(0x01020304);

uint32_t x=0xAAAAAAAA;
return __reverse(x); //Вот так всё хорошо
}


Хелп ми sm.gif

Проекты для 5.51 и 6.11 соответственно в архиве прилагаю.

Прикрепленный файл  Reverse_test.rar ( 16.2 килобайт ) Кол-во скачиваний: 67


Сообщение отредактировал IgorKossak - May 29 2012, 08:02
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post
Murk
сообщение Jun 4 2012, 00:22
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 150
Регистрация: 15-02-06
Из: ЛНР Рубежное
Пользователь №: 14 357



Было в АРМ_овской версии файл intrinsics.h кривой.


--------------------
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jun 4 2012, 13:49
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



В intrinsics.h всё одинаково за исключением одной строки к __reverse() не имеющей никакого отношения. Да и вообще__reverse в хидерах не встречается нигде. Зато внутри iccavr.exe встречается. Так что, больше на глюк компилятора смахивает.

А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse().
Код
inline uint32_t reverse(uint32_t data) { return __reverse(data); }
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 4 2012, 17:36
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (VladislavS @ Jun 4 2012, 16:49) *
А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse().
А на __reverse(uint32_t)ip) будет ругаться? И как объявлен ip?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jun 4 2012, 20:28
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Сергей Борщ @ Jun 4 2012, 21:36) *
А на __reverse(uint32_t)ip) будет ругаться?

Да, ничего не меняется, так как ip и есть uint32_t

Цитата(Сергей Борщ @ Jun 4 2012, 21:36) *
И как объявлен ip?

Как параметр функции-члена класса
Код
void SetIP(uint32_t ip)
{
   w5100_control.SIPR = __reverse(ip);
}

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 5 2012, 06:59
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (VladislavS @ Jun 4 2012, 23:28) *
Да, ничего не меняется, так как ip и есть uint32_t
Ну что сказать - похоже надо писать баг-репорт ИАРу.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Jun 7 2012, 14:39
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Написал для пробы:
Код
#include <intrinsics.h>

unsigned long aa = 0x2233aa55;
unsigned long bb = 0;
int main()
{
    bb = __REV(aa);          
  
      return 0;
}



Получил bb = 0x55AA3322

Я правильно понял вопрос?

Ах, прошу прощения. Я не заметил, что речь идет об AVR

Сообщение отредактировал Aleksandr Baranov - Jun 7 2012, 14:09


--------------------
ASB
Go to the top of the page
 
+Quote Post

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

 


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


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