Перейти к содержанию
    

stm32 Keil

микроконтроллер STM32 компилятор Keil 4.70

 

Есть два класса t_data и t_data1, отличаются только наличием конструктора. При инициализации класса при отсутствии конструктора данные пишутся во flash, при добавлении конструктора все пишется в оперативную память. Атрибут __attribute__((const)) перед конструктором не помогает, как константу его объявить нельзя.

 

class t_data {
   public :
   const uint32_t value;
   uint32_t Get () const {return value;};
   void Init (void) const {};
   t_data (const uint32_t v) : value(v) {Init();};
};


class t_data1 {
   public :
   uint32_t value;
   uint32_t Get () const {return value;};
   void Init (void) const {};
};

const t_data data (0x1234);
const t_data1 data1 = {0x1234};

const t_data * pointer = &data; // 0x2000xxxx - value записалось в RAM
const t_data1 * pointer1 = &data1; // 0x0800xxxx - value записалось во flash

 

Как записать объект проинициализированный с помощью конструктора в flash память мк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде как через #pragma и указать секцию куда поместить объект, переменную, структуру. А линкеру указать что секция лежит во флэше.

Но в целом это крайне странно, как класс лежащий во флэше, особенно с public полями использовать? Ведь изменив значение поля, оно само собой во флэшке не поменяется. Там необходимо блоки стирать и так далее... Вы уверены что это адресное пространство флэши а не HEAP или стэка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вопрос мой, писал коллега на работе

 

Вообщем идея такая: написать объект 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;
};

 

может тогда посоветуете как можно по другому что реализовать.

Изменено пользователем SChe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я помню таки надо конструктор сделать private , а для получения объекта делать по принципу именнованного конструктора http://www.parashift.com/c++-faq-lite/named-ctor-idiom.html

Коллега наверное молодой ? Я тоже лет 10 назад страдал такой фигней, как использование С++ для микроконтроллеров. Сейчас не использую даже для двуядерных ARM 1.5 ГГц. Ибо нахрен никому не надо, глюков добавит точно. Тут С99 толком мало кто поддерживает, а вы с++ захотели да еще на каком-то Кейле.

 

Кстати у вас же неявный конструктор в этом примере будет, стоит сделать его явным и закрытым. И почитайте куда приводят мечты http://www.rsdn.ru/forum/cpp/349749.flat

Я б вашу библиотеку сразу в ведро отправил, уж простите, разбираться что там и как в каком порядке вызывается, если уж Микрософт этого толком не знает - это черсчур

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет конструктора копирования все верно, его стоит объявить явно и копировать значения порта, а не конфигурацию объекта (как по умолчанию), просто руки еще не дошли.

 

Если сделать private конструктор по данному примеру, то выполняются два разных static конструктора указанные явно, это никак не укажет компилятору куда записать класс. И данная запись имеет смысл, только если очень нужно получить одинаковые имена классов (перегрузка конструкторов с одинаковыми входными данными). На мой взгляд, намного лучше с данной задачей справилось бы наследование+полиморфизм, да хотя классы объявлять разные, кода также минимум и более привычная форма объявления.

Изменено пользователем SChe

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все равно не понимаю, зачем мудрить с полиморфизом когда речь идет о ножках.Получать тормоза? Да и ножка — это не объект, который создается динамически, зачем тут классы (зачем они вообще в embedded, сурцы линукса нв голом С, но все понятно и расширямо, и концепции ооп видны, без жуткого ++ синтаксиса. И ваша библиотека окромя кейла нигде больше работать не будет без напильника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО это всё через шаблоны стоит делать...

Более того Антоха уже это всё сделал и демонстрировал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...