Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Константные экземпляры классов в STM32

Вс авг 05, 2018 21:18:08

Описываем гипотетическую структуру:
Код:
struct TestStruct
{
    GPIO_TypeDef *_gpio [7];
    uint32_t     _pinMask [7];
};
Создаём экземпляр этой структуры:
Код:
TestStruct A = {{GPIOC, GPIOC, GPIOC, GPIOA, GPIOA, GPIOA, GPIOC},
                {1<<7,  1<<6,  1<<9,  1<<8,  1<<12, 1<<11, 1<<8 }};
Компилируем, получаем Program Size: Code=4192 RO-data=432 RW-data=124 ZI-data=8444
Добавляем экземпляру структуры атрибут const:
Код:
const TestStruct A = {{GPIOC, GPIOC, GPIOC, GPIOA, GPIOA, GPIOA, GPIOC},
                      {1<<7,  1<<6,  1<<9,  1<<8,  1<<12, 1<<11, 1<<8 }};
Копмилируем, получаем Program Size: Code=4192 RO-data=488 RW-data=68 ZI-data=8444
Очевидно, структура успешно переместилась из RAM в ROM.

Теперь проведём аналогичный эксперимент с классом, описываем гипотетический класс:
Код:
class TestClass
{
public:
    TestClass (GPIO_TypeDef *gpio, uint32_t pinMask, uint8_t pinMode) {_gpio=gpio; _pinMask=pinMask; _pinMode=pinMode;};
private:
    GPIO_TypeDef *_gpio;
    uint32_t     _pinMask;
    uint8_t      _pinMode;
};
Создаём экземпляр этого класса:
Код:
TestClass B (GPIOC, 1<<7, Pull_Up_Inp); // PS: Pull_Up_Inp это дефайн
Копмилируем, получаем Program Size: Code=4176 RO-data=432 RW-data=68 ZI-data=8420
Добавляем экземпляру класса атрибут const:
Код:
const TestClass B (GPIOC, 1<<7, Pull_Up_Inp);
Копмилируем, получаем Program Size: Code=4176 RO-data=432 RW-data=68 ZI-data=8420
Ничего не изменилось, очевидно экземпляр класса как был в RAM памяти, так там и остался.

Вопрос: как заставить компилятор располагать константные экземпляры классов в ROM?

Гуглом смог найти только это:
https://toster.ru/q/377806
Примерно понял что делает атрибут constexpr, однако не понял как его использовать, к тому же моя IDE'ха на него ругается "unknown type name 'constexpr'" (пишу в uVision Keil 5.21a)

Re: Константные экземпляры классов в STM32

Вс авг 05, 2018 22:10:20

Почитай про POD, твой класс не может находится во флеше, т.к. имеет конструктор и приватные поля. А вообще это все должно делаться через шаблоны, тогда полей не будет вообще, одни статические методы.

Re: Константные экземпляры классов в STM32

Пн авг 06, 2018 05:32:51

А судя по RW-data=68 как без класса, так и с классом, то оптимизатор его чики-чики.

Re: Константные экземпляры классов в STM32

Пн авг 06, 2018 10:56:08

А судя по RW-data=68 как без класса, так и с классом, то оптимизатор его чики-чики.
Оптимизация выставлена на 0.
+ для однозначности я добавил классу ещё 2 функции и мигал светодиодом.
Код:
class TestClass
{
public:
    TestClass (GPIO_TypeDef *gpio, uint32_t pinMask, uint8_t pinMode) {_gpio=gpio; _pinMask=pinMask; _pinMode=pinMode;};
    void set () const {_gpio->BSRR = _pinMask;};
    void clr () const {_gpio->BRR = _pinMask;};
private:
    GPIO_TypeDef *_gpio;
    uint32_t     _pinMask;
    uint8_t      _pinMode;
};
Оба эксперимента проводились в разных условиях и сравнивать размеры программ не имеет смысла.

Re: Константные экземпляры классов в STM32

Сб ноя 03, 2018 18:09:48

Конструктор не пустой, следовательно его нужно вызвать, следовательно экземпляр нельзя разместить в rom, он размещается в ram и генерируется вызов конструктора на этапе инициализации. Замените присвоение в конструкторе на список инициализации.
Ответить