|
|
  |
Как заставить линкер расположить обьект класса в ПЗУ? |
|
|
|
Mar 9 2007, 10:05
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание?
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Mar 10 2007, 23:44
|

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

|
Цитата(scout @ Mar 9 2007, 09:05)  Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание? Объявить как структуру и инициализировать через {}. Другого способа я не нашел, и подозреваю, что его нет. Ибо (насколько помню) в С++ даже константные члены класса могут быть проинициализированы конструктором. Исправлено: константные члены класса могут быть проинициализированы только конструктором
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 11 2007, 10:31
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(scout @ Mar 9 2007, 12:05)  Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание? Попробуйте эти константные члены объявить ещё и как static. Они ж у Вас общие для всех объектов? Да и объект то поди один? Да и методы можно все static-ом объявить, и экземпляр не создавать вообще!  Не очень понимаю зачем оно надо, чего Вы хотите в результате?
|
|
|
|
|
Mar 11 2007, 15:59
|

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

|
Цитата(Alex03 @ Mar 11 2007, 09:31)  Они ж у Вас общие для всех объектов? Да и объект то поди один? Ну зачем же так жестоко  Навскидку: Код 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)
|
|
|
|
|
Mar 12 2007, 10:16
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Собственно говоря, нашел выход. Для достижения требуемого нужно было написать:
class something {
private:
const int var;
public:
something();
~something();
};
pragma location = "Имя сегмента в ПЗУ" __no_init something test;
Всем спасибо за ответы.
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
Mar 12 2007, 11:12
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 12 2007, 12:02
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(Сергей Борщ @ Mar 11 2007, 17:59)  Ну зачем же так жестоко  Навскидку: .... Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны. Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе. А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво?
|
|
|
|
|
Mar 12 2007, 14:03
|

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

|
Цитата(Alex03 @ Mar 12 2007, 11:02)  А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво? Дык Цитата(Сергей Борщ @ Mar 10 2007, 22:44)  Объявить как структуру и инициализировать через {}. Но к черту летит все сокрытие и безопасность данных
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 12 2007, 14:08
|

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

|
Цитата(Alex03 @ Mar 12 2007, 15:02)  Цитата(Сергей Борщ @ Mar 11 2007, 17:59)  Ну зачем же так жестоко  Навскидку: .... Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны. Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе. А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво? Очевидно, компилятор не может размещать во флеши (сегменте констант) объекты не POD-типов.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 12 2007, 21:45
|
Частый гость
 
Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837

|
Цитата Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти. Была цель создать класс, позволяющий работать с переменными расположенными во Flash, как с обычными.
--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью. Конфуций
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|