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

C++ c шаблонами

Заткнулся на одной задачке. CortexM3, GCC.

 

Есть структура во флеше с настройками. Адрес структуры зафиксирован линкером.

Запись настроек производится однократно, в произвольном порядке.

 

Для облегчения записи сделал класс

 

CFwSetting {
public:
static bool IsPresent () { ... }
static bool Write (const void * data) { ... }
static bool Compare (const void * data) { ... }
};

 

Теперь пытаюсь сделать его шаблонным, чтобы использовать для каждого поля:

template <int Addr, int Len>
class CFwSetting_Base {
...
};

typedef CFwSetting_Base <(int)&Settings.SerialNumber, sizeof(Settings.SerialNumber)>        CFwSerial;

 

Проблем две:

1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво...

 

2) некрасиво указывать название поля два раза - для адреса и для размера.

 

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


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

Мне показалось, что на шаблонах пяток таких микро-классов будет удобнее всего сделать. Другие варианты?

 

Settings - const struct, лежащая во флеше, в отдельной секции. Имеет несколько полей (от uint32_t до массива байтов; может быть ещё что-то будет). Поля записываются в произвольном порядке (как пользователь захочет), но только один раз.

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


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

зачем здесь класс и тем-более шаблоны, из приведённого кода это всё лишнее

 

В CFwSetting, если это структура (ключевое слово не видно) директива public: лишняя. У структур члены по умолчанию public

 

PS Если структура настроек расположена во флешке (ROM) как её писать планируется?

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

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


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

Параметры шаблона должны быть константами времени компиляции, иногда можно константы времени компановки(но не все компиляторы это едят, хотя ГЦЦ должен).

То есть Объект Settings должен быть размещен по известному в точке инстанцирования адресу, хотя-бы во время линковки.

 

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


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

1) оно в принципе не работает. Компилятор говорит "не знаю я адрес твоей структуры!". Если адрес вбить константой, работает. Но некрасиво...

 

Если есть возможность получить константу адреса, то можно сделать так:

typedef CFwSetting_Base<STRUCT_ADDRESS + offsetof(Settings, SerialNumber, sizeof(Settings.SerialNumber))> CFwSerial;

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


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

Потыкался, переделал на единый класс. При обращении к конкретному полю создаю экземпляр класса, в конструктор передаю адрес поля, с которым оно будет работать.

 

 

И новые грабли: http://cpp.sh/2w2n.

Для простоты понимания вырезал весь тот функционал, о котором я говорил выше, оставил только получение адреса-размера.

Если передавать в функцию ссылку на не-однобайтовую переменную в упакованной структуре, происходит странное.

ARM-GCC копирует её в стек, а только потом передаёт в функцию. Соответственно, адрес этой переменной ничего общего с реальным уже не имеет. Онлайновый GCC по ссылке так и вовсе ругается.

 

Очередной вопрос: как указать "функция принимает аргументы со смещённым адресом" ?

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


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

С упакованными структурами, скорее всего, ничего не получится. Я не помню точно, как это формулируется, но суть такая: int (для примера) в упакованной структуре и просто int - это как бы разные типы. Они совместимы по присваиванию, но не идентичны. Поэтому так и получается.

 

---

Вот тут почитайте на эту тему: тынц.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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