Описываем гипотетическую структуру:
Код:
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)