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

 
 
> stm32 Keil
Kenshin
сообщение Apr 8 2013, 10:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 8-06-06
Из: Тула
Пользователь №: 17 887



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

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

CODE
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 память мк?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SChe
сообщение Apr 9 2013, 18:28
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 8-04-13
Пользователь №: 76 408



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

Вообщем идея такая: написать объект 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, но всетаки когда пишешь библиотеки, хочется чтобы все было как можно более оптимизированно.

вот собственно сам объект
CODE
// объект портов ввода-вывода
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 - Apr 9 2013, 18:00
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 17th August 2025 - 11:34
Рейтинг@Mail.ru


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