Код: Выделить всё
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 }};
Добавляем экземпляру структуры атрибут 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 }};
Очевидно, структура успешно переместилась из 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 это дефайн
Добавляем экземпляру класса атрибут const:
Код: Выделить всё
const TestClass B (GPIOC, 1<<7, Pull_Up_Inp);
Ничего не изменилось, очевидно экземпляр класса как был в RAM памяти, так там и остался.
Вопрос: как заставить компилятор располагать константные экземпляры классов в ROM?
Гуглом смог найти только это:
https://toster.ru/q/377806
Примерно понял что делает атрибут constexpr, однако не понял как его использовать, к тому же моя IDE'ха на него ругается "unknown type name 'constexpr'" (пишу в uVision Keil 5.21a)

