Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить линкер расположить обьект класса в ПЗУ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
scout
Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.
Линкер же упорно распологает объект такого класса в ОЗУ.
Как объяснить линкеру Иара мое пожелание?
boez
А если сам экземпляр объявлен константой? А модификатор вроде есть иаровский, чтоб переменные во флеш класть - не помогает?
Сергей Борщ
Цитата(scout @ Mar 9 2007, 09:05) *
Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.
Линкер же упорно распологает объект такого класса в ОЗУ.
Как объяснить линкеру Иара мое пожелание?
Объявить как структуру и инициализировать через {}. Другого способа я не нашел, и подозреваю, что его нет. Ибо (насколько помню) в С++ даже константные члены класса могут быть проинициализированы конструктором.

Исправлено:
константные члены класса могут быть проинициализированы только конструктором sad.gif
Alex03
Цитата(scout @ Mar 9 2007, 12:05) *
Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.
Линкер же упорно распологает объект такого класса в ОЗУ.
Как объяснить линкеру Иара мое пожелание?

Попробуйте эти константные члены объявить ещё и как static.
Они ж у Вас общие для всех объектов? Да и объект то поди один?
Да и методы можно все static-ом объявить, и экземпляр не создавать вообще! smile.gif

Не очень понимаю зачем оно надо, чего Вы хотите в результате? smile.gif
Сергей Борщ
Цитата(Alex03 @ Mar 11 2007, 09:31) *
Они ж у Вас общие для всех объектов? Да и объект то поди один?
Ну зачем же так жестоко smile.gif Навскидку:
Код
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, "Страдает мое чувство эстетического" чего-то там.
scout
Собственно говоря, нашел выход.
Для достижения требуемого нужно было написать:

class something
{

private:

const int var;

public:

something();

~something();

};


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

Всем спасибо за ответы.
Сергей Борщ
Цитата(scout @ Mar 12 2007, 09:16) *
Собственно говоря, нашел выход.
pragma location = "Имя сегмента в ПЗУ"
__no_init something test;
Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти.
Alex03
Цитата(Сергей Борщ @ Mar 11 2007, 17:59) *
Ну зачем же так жестоко smile.gif Навскидку:
....
Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны.

Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе.
А типа если выкинуть конструктор и члены сделать пабликами то
const pin_t LED = {PORTA, 4};
прокатит и во ФЛЭШ попадёт, но не красиво?
Сергей Борщ
Цитата(Alex03 @ Mar 12 2007, 11:02) *
А типа если выкинуть конструктор и члены сделать пабликами то
const pin_t LED = {PORTA, 4};
прокатит и во ФЛЭШ попадёт, но не красиво?
Дык
Цитата(Сергей Борщ @ Mar 10 2007, 22:44) *
Объявить как структуру и инициализировать через {}.
Но к черту летит все сокрытие и безопасность данных sad.gif
dxp
Цитата(Alex03 @ Mar 12 2007, 15:02) *
Цитата(Сергей Борщ @ Mar 11 2007, 17:59) *

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

Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе.
А типа если выкинуть конструктор и члены сделать пабликами то
const pin_t LED = {PORTA, 4};
прокатит и во ФЛЭШ попадёт, но не красиво?

Очевидно, компилятор не может размещать во флеши (сегменте констант) объекты не POD-типов.
scout
Цитата
Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти.


Была цель создать класс, позволяющий работать с переменными расположенными во Flash, как с обычными.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.