VladislavS 39 29 мая, 2012 Опубликовано 29 мая, 2012 (изменено) · Жалоба Здравствуйте. Переполз с компилятора 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(), то тоже нормально. #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); //Вот так всё хорошо } Хелп ми :) Проекты для 5.51 и 6.11 соответственно в архиве прилагаю. Reverse_test.rar Изменено 29 мая, 2012 пользователем IgorKossak [codebox] для длинного кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Murka 0 4 июня, 2012 Опубликовано 4 июня, 2012 · Жалоба Было в АРМ_овской версии файл intrinsics.h кривой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 июня, 2012 Опубликовано 4 июня, 2012 · Жалоба В intrinsics.h всё одинаково за исключением одной строки к __reverse() не имеющей никакого отношения. Да и вообще__reverse в хидерах не встречается нигде. Зато внутри iccavr.exe встречается. Так что, больше на глюк компилятора смахивает. А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse(). inline uint32_t reverse(uint32_t data) { return __reverse(data); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 4 июня, 2012 Опубликовано 4 июня, 2012 · Жалоба А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse().А на __reverse(uint32_t)ip) будет ругаться? И как объявлен ip? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 4 июня, 2012 Опубликовано 4 июня, 2012 · Жалоба А на __reverse(uint32_t)ip) будет ругаться? Да, ничего не меняется, так как ip и есть uint32_t И как объявлен ip? Как параметр функции-члена класса void SetIP(uint32_t ip) { w5100_control.SIPR = __reverse(ip); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 5 июня, 2012 Опубликовано 5 июня, 2012 · Жалоба Да, ничего не меняется, так как ip и есть uint32_tНу что сказать - похоже надо писать баг-репорт ИАРу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 7 июня, 2012 Опубликовано 7 июня, 2012 (изменено) · Жалоба Написал для пробы: #include <intrinsics.h> unsigned long aa = 0x2233aa55; unsigned long bb = 0; int main() { bb = __REV(aa); return 0; } Получил bb = 0x55AA3322 Я правильно понял вопрос? Ах, прошу прощения. Я не заметил, что речь идет об AVR Изменено 7 июня, 2012 пользователем Aleksandr Baranov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться