Перейти к содержанию
    

Компиляция встроенной функции __reverse() в EWAVR 6.11

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

 

Переполз с компилятора 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

Изменено пользователем IgorKossak
[codebox] для длинного кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse().

inline uint32_t reverse(uint32_t data) { return __reverse(data); }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ещё инлайнит за милую душу вот такую функцию в том месте где выдаёт ошибку на обычный __reverse().
А на __reverse(uint32_t)ip) будет ругаться? И как объявлен ip?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А на __reverse(uint32_t)ip) будет ругаться?

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

 

И как объявлен ip?

Как параметр функции-члена класса

void SetIP(uint32_t ip)
{
   w5100_control.SIPR = __reverse(ip);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, ничего не меняется, так как ip и есть uint32_t
Ну что сказать - похоже надо писать баг-репорт ИАРу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал для пробы:

#include <intrinsics.h>

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

 

 

Получил bb = 0x55AA3322

 

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

 

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

Изменено пользователем Aleksandr Baranov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...