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

Как заставить линкер расположить обьект класса в ПЗУ?

Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.

Линкер же упорно распологает объект такого класса в ОЗУ.

Как объяснить линкеру Иара мое пожелание?

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


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

А если сам экземпляр объявлен константой? А модификатор вроде есть иаровский, чтоб переменные во флеш класть - не помогает?

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


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

Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.

Линкер же упорно распологает объект такого класса в ОЗУ.

Как объяснить линкеру Иара мое пожелание?

Объявить как структуру и инициализировать через {}. Другого способа я не нашел, и подозреваю, что его нет. Ибо (насколько помню) в С++ даже константные члены класса могут быть проинициализированы конструктором.

 

Исправлено:

константные члены класса могут быть проинициализированы только конструктором :(

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


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

Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.

Линкер же упорно распологает объект такого класса в ОЗУ.

Как объяснить линкеру Иара мое пожелание?

Попробуйте эти константные члены объявить ещё и как static.

Они ж у Вас общие для всех объектов? Да и объект то поди один?

Да и методы можно все static-ом объявить, и экземпляр не создавать вообще! :)

 

Не очень понимаю зачем оно надо, чего Вы хотите в результате? :)

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


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

Они ж у Вас общие для всех объектов? Да и объект то поди один?
Ну зачем же так жестоко :) Навскидку:

class pin_t
{
public:
   pin_t(uint8_t volatile *const port, uint8_t bit) : Port(port), Mask(1 << pin) {}
   void set();
   void clear();
   void toggle();
   bool state();
private:
   uint8_t volatile *const Port;
   uint8_t const Mask;
};
pin_t LED(PORTA,4);

Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны.

Что касается единственных экземпляров у которых все статик - да, и работает и правильно, но как же некрасиво. В глазах пестрит от обилия static и объявление одного экземпляра класса выливается не в одну строчку static class_t obj, как для обычных экземпляров, а в нудное объявление всех статических членов класса. Бррр. Как когда-то сказал уважаемый ReAl, "Страдает мое чувство эстетического" чего-то там.

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


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

Собственно говоря, нашел выход.

Для достижения требуемого нужно было написать:

 

class something

{

 

private:

 

const int var;

 

public:

 

something();

 

~something();

 

};

 

 

pragma location = "Имя сегмента в ПЗУ"

__no_init something test;

 

Всем спасибо за ответы.

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


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

Собственно говоря, нашел выход.

pragma location = "Имя сегмента в ПЗУ"

__no_init something test;

Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти.

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


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

Ну зачем же так жестоко :) Навскидку:

....

Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны.

Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе.

А типа если выкинуть конструктор и члены сделать пабликами то

const pin_t LED = {PORTA, 4};

прокатит и во ФЛЭШ попадёт, но не красиво?

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


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

А типа если выкинуть конструктор и члены сделать пабликами то

const pin_t LED = {PORTA, 4};

прокатит и во ФЛЭШ попадёт, но не красиво?

Дык
Объявить как структуру и инициализировать через {}.
Но к черту летит все сокрытие и безопасность данных :(

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


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

Ну зачем же так жестоко :) Навскидку:

....

Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны.

Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе.

А типа если выкинуть конструктор и члены сделать пабликами то

const pin_t LED = {PORTA, 4};

прокатит и во ФЛЭШ попадёт, но не красиво?

Очевидно, компилятор не может размещать во флеши (сегменте констант) объекты не POD-типов.

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


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

Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти.

 

Была цель создать класс, позволяющий работать с переменными расположенными во Flash, как с обычными.

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


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

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

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

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

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

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

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

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

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

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