Это вопрос мой, писал коллега на работе
Вообщем идея такая: написать объект GPIO, структура инициализации и методы инициализации, передачи и возвращении состояния. Все реализованно, перегрузка операторов передачи и возвращения работают нормально, при инициализации как структуры в С (с помощью {}) структура пишется в flash (адрес 0x08......).
Все методы объявлены как const что говорит, что они не могут изменять поля. Класс лежащий во флеше вполне реально (пример это t_data1). Через "#pragma arm section code="sect"" и "__attribute__((section ("sect")))" пробовал, компилятор выдовал ошибку, что не может записать в RO сектор. Пробовал через __attribute__((constructor)) все хорошо (поставить его для t_data::Init()), но он вызывается только 1 раз (хотя очень удобная вещь, буду использовать))).
При добавлении конструктора и инициализации через него структура пишется в RAM. Видимо все из-за того что конструктор не объявляется как const, а __attribute__((const)) в данном случаи не работает. Конечно не так жалко 2 байта на 1 вывод GPIO, но всетаки когда пишешь библиотеки, хочется чтобы все было как можно более оптимизированно.
вот собственно сам объект
// объект портов ввода-вывода
class t_gpio {
private :
// структура конфигурации
t_gpio_config config;
// инициализация
void Init (void) const;
public :
// конструктор
// полная запись
t_gpio (const t_gpio_config config);
// значения по умолчанию
t_gpio (const t_gpio_port port, const uint8_t digit, const t_gpio_type type, const bool value);
// значения по умолчанию
t_gpio (const t_gpio_port port, const uint8_t digit, const t_gpio_type type);
// установка значения порта
inline void SetValue (const bool value) const;
bool operator = (const bool value) const;
// извлечение значения порта
inline bool GetValue (void) const;
operator bool (void) const;
// инвертирование значения порта
bool operator ++ (void) const;
bool operator -- (void) const;
bool operator ++ (const int) const;
bool operator -- (const int) const;
};
может тогда посоветуете как можно по другому что реализовать.