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

 
 
 
Reply to this topicStart new topic
> IAR C++
MALLOY2
сообщение Oct 24 2010, 19:27
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Есть шаблонный класс 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]"

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

Если сделать класс не шаблонным, то прагма работает на статические данные класса.
Как можно выкрутиться из этой ситуации ?
Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 25 2010, 06:51
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



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

В GCC __attribute__ ((section ("<section name>"))) в подобном случае с шаблонами работает корректно.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 25 2010, 07:55
Сообщение #3


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Не радует, что в IAR не работает, а в шаблон указатель передавать нельзя.

Пока вижу вариант создания специального алокатора для этого класса который динамически будет выделять память с специальной области.
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 25 2010, 09:53
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

Да, указатель неудобно. А что по поводу ссылки?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 25 2010, 09:54
Сообщение #5


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



УРА! все работает просто я не там все прописывал нужно так

Код
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. Утро вечера мудренее однако.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 25 2010, 09:57
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Попробовал так:

Код
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;


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


Go to the top of the page
 
+Quote Post
neiver
сообщение Oct 25 2010, 09:58
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



По стандарту-то можно передавать как шаблонный параметр и указатель и ссылку на глобальный объект, адрес которого известен на момент компиляции или линковки. Но вот не все компиляторы это поддерживают. Тот-же 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.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 25 2010, 10:06
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


Ну дык если бы компилер писал - нельзя использовать такой параметр шаблона - то все понятно. Но "Internal error: [Visit types]: Error type. Fatal error detected, aborting." - это ж баг все же. Кстати такая же фигня получается, если использовать указатель на функцию-член в параметре шиблона
Go to the top of the page
 
+Quote Post

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

 


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


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