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

 
 
 
Reply to this topicStart new topic
> Как заставить линкер расположить обьект класса в ПЗУ?
scout
сообщение Mar 9 2007, 10:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Хочется чтобы класс имеющий только константные члены распологался в ПЗУ.
Линкер же упорно распологает объект такого класса в ОЗУ.
Как объяснить линкеру Иара мое пожелание?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
boez
сообщение Mar 10 2007, 21:26
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868



А если сам экземпляр объявлен константой? А модификатор вроде есть иаровский, чтоб переменные во флеш класть - не помогает?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 10 2007, 23:44
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex03
сообщение Mar 11 2007, 10:31
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



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

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

Не очень понимаю зачем оно надо, чего Вы хотите в результате? smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 11 2007, 15:59
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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, "Страдает мое чувство эстетического" чего-то там.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scout
сообщение Mar 12 2007, 10:16
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Собственно говоря, нашел выход.
Для достижения требуемого нужно было написать:

class something
{

private:

const int var;

public:

something();

~something();

};


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

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


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 12 2007, 11:12
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex03
сообщение Mar 12 2007, 12:02
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(Сергей Борщ @ Mar 11 2007, 17:59) *
Ну зачем же так жестоко smile.gif Навскидку:
....
Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны.

Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе.
А типа если выкинуть конструктор и члены сделать пабликами то
const pin_t LED = {PORTA, 4};
прокатит и во ФЛЭШ попадёт, но не красиво?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 12 2007, 14:03
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 12 2007, 14:08
Сообщение #10


Adept
******

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



Цитата(Alex03 @ Mar 12 2007, 15:02) *
Цитата(Сергей Борщ @ Mar 11 2007, 17:59) *

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

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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
scout
сообщение Mar 12 2007, 21:45
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



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


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


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post

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

 


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


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