Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR C++
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MALLOY2
Есть шаблонный класс FIFO для периферии его отличия от обычного в том что буфер статический.

Код
template <typename T,int TCOUNT>
class THwFIFO
{
private:
  static T buff[TCOUNT];
  volatile uint32_t size;
  T first;
  T last;
public:
...
}


Дальше объявляем переменные
Код
template <typename T, int FSIZE>
T THwFIFO<T,FSIZE>::buff[FSIZE];


Все работает, но теперь нужно buff положить в специальную секцию и тут засада

Код
#pragma location = ".not_cached"
template <typename T, int FSIZE>
T THwFIFO<T,FSIZE>::buff[FSIZE];


На что получил
Цитата
Warning[Pe609]: this kind of pragma may not be used here C:\Temp\1\main.cpp 16
detected during implicit definition of "char THwFIFO<T, FSIZE>::buff[100] [with T=char, FSIZE=100]"

Естественно данные не попали в секцию.

Если сделать класс не шаблонным, то прагма работает на статические данные класса.
Как можно выкрутиться из этой ситуации ?
neiver
Видимо это такое ограничение #pragma location в IAR, которая не дружит с шаблонами.
Как вариант, можно объявить буффер вне шаблона и передавать в шаблон указатель на него (хотя, это неудобное решение).

В GCC __attribute__ ((section ("<section name>"))) в подобном случае с шаблонами работает корректно.
MALLOY2
Не радует, что в IAR не работает, а в шаблон указатель передавать нельзя.

Пока вижу вариант создания специального алокатора для этого класса который динамически будет выделять память с специальной области.
dxp
Цитата(neiver @ Oct 25 2010, 13:51) *
Видимо это такое ограничение #pragma location в IAR, которая не дружит с шаблонами.
Как вариант, можно объявить буффер вне шаблона и передавать в шаблон указатель на него (хотя, это неудобное решение).

Да, указатель неудобно. А что по поводу ссылки?
MALLOY2
УРА! все работает просто я не там все прописывал нужно так

Код
template <typename T,int TCOUNT>
class THwFIFO
{
private:
  static T buff[TCOUNT] @ ".not_cached";
  volatile uint32_t size;
  T first;
  T last;
public:
...


И все стало на свои места

P.S. Утро вечера мудренее однако.
Непомнящий Евгений
Попробовал так:

Код
template <typename T, T *buff, int TCOUNT>
class THwFIFO
{
...
};


char buff1[100];

THwFIFO<char, buff1, 100> fifo;


на IAR 4.4 выдает
Internal error: [Visit types]: Error type
Fatal error detected, aborting.

Может на более новом компилере проканает

А вот так - работает:

Код
struct BuffChar100
{
  static char buff[100];
};

template <typename T, typename B, int TCOUNT>
class THwFIFO
{
private:
  T* buff() const { return B::buff; }

};


THwFIFO<char, BuffChar100, 100> fifo;


Хотя конечно не слишком удобно, это да.


neiver
По стандарту-то можно передавать как шаблонный параметр и указатель и ссылку на глобальный объект, адрес которого известен на момент компиляции или линковки. Но вот не все компиляторы это поддерживают. Тот-же GCC поддерживает, IAR - нет.
По стандарту должно быть возможно писать так:

Код
template<class T, int Size, T Ptr[Size]>
class Foo
{
  void DoSomethisngWithPtr()
  {
    for(int i =0; i<Size; ++i)
      Putch(Ptr[i]);
  }
};
...
const int BufSize=10;
char Buf1[BufSize];
...
Foo<char, BufSize, Buf1> foo_1;
...
foo_1.DoSomethisngWithPtr();


В GCC это работает, в IAR - нет.

Однако, можно глобальную переменную обернуть в тип, и передать уже как типовой параметр.
Например так.

Компиляторы от IAR во многих местах не соответствуют стандарту С++. Но IAR Systems и не деклариует, что они ему соответствуют. Декларируется только следование ISO/ANSI C94 и С99.
Непомнящий Евгений
Цитата(neiver @ Oct 25 2010, 13:58) *
Компиляторы от IAR во многих местах не соответствуют стандарту С++. Но IAR Systems и не деклариует, что они ему соответствуют. Декларируется только следование ISO/ANSI C94 и С99.


Ну дык если бы компилер писал - нельзя использовать такой параметр шаблона - то все понятно. Но "Internal error: [Visit types]: Error type. Fatal error detected, aborting." - это ж баг все же. Кстати такая же фигня получается, если использовать указатель на функцию-член в параметре шиблона
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.