roman555 0 9 марта, 2007 Опубликовано 9 марта, 2007 · Жалоба Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boez 0 10 марта, 2007 Опубликовано 10 марта, 2007 · Жалоба А если сам экземпляр объявлен константой? А модификатор вроде есть иаровский, чтоб переменные во флеш класть - не помогает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 10 марта, 2007 Опубликовано 10 марта, 2007 · Жалоба Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание? Объявить как структуру и инициализировать через {}. Другого способа я не нашел, и подозреваю, что его нет. Ибо (насколько помню) в С++ даже константные члены класса могут быть проинициализированы конструктором. Исправлено: константные члены класса могут быть проинициализированы только конструктором :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 11 марта, 2007 Опубликовано 11 марта, 2007 · Жалоба Хочется чтобы класс имеющий только константные члены распологался в ПЗУ. Линкер же упорно распологает объект такого класса в ОЗУ. Как объяснить линкеру Иара мое пожелание? Попробуйте эти константные члены объявить ещё и как static. Они ж у Вас общие для всех объектов? Да и объект то поди один? Да и методы можно все static-ом объявить, и экземпляр не создавать вообще! :) Не очень понимаю зачем оно надо, чего Вы хотите в результате? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 11 марта, 2007 Опубликовано 11 марта, 2007 · Жалоба Они ж у Вас общие для всех объектов? Да и объект то поди один?Ну зачем же так жестоко :) Навскидку: 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, "Страдает мое чувство эстетического" чего-то там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roman555 0 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба Собственно говоря, нашел выход. Для достижения требуемого нужно было написать: class something { private: const int var; public: something(); ~something(); }; pragma location = "Имя сегмента в ПЗУ" __no_init something test; Всем спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба Собственно говоря, нашел выход. pragma location = "Имя сегмента в ПЗУ" __no_init something test; Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба Ну зачем же так жестоко :) Навскидку: .... Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны. Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе. А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво? ДыкОбъявить как структуру и инициализировать через {}.Но к черту летит все сокрытие и безопасность данных :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 36 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба Ну зачем же так жестоко :) Навскидку: .... Логично предположить что в процессе работы программы светодиод висит на одной и той же ножке, все члены константны. Ок. Понятно. Но и то что оно в РАМ-е вполне логично, ибо инициализируется в конструкторе. А типа если выкинуть конструктор и члены сделать пабликами то const pin_t LED = {PORTA, 4}; прокатит и во ФЛЭШ попадёт, но не красиво? Очевидно, компилятор не может размещать во флеши (сегменте констант) объекты не POD-типов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roman555 0 12 марта, 2007 Опубликовано 12 марта, 2007 · Жалоба Очень интересно. А какой толк в константном непроинициализированном объекте? С тем же успехом можно было указателю на этот объект присвоить адрес любой ячейки памяти. Была цель создать класс, позволяющий работать с переменными расположенными во Flash, как с обычными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться