Где хранятся ваши константы на микроконтроллере CortexM (на примере С++ IAR компилятора)
Я обучаю своих студентов работе с микроконтроллером STM32F411RE, на борту которого имеется аж целых 512 кБайт ROM и 128 кБайт ОЗУ
Обычно на этом микроконтроллере в
ROM память записывается программа, а в
RAM изменяемые данные и очень часто нужно сделать так, чтобы константы лежали в
ROM.
В микроконтроллере STM32F411RE,
ROM память расположена по адресам с
0x08000000...0x0807FFFF, а
RAM с
0x20000000...0x2001FFFF.
И если все настройки линкера правильные, студент рассчитывает, что вот в таком незамысловатом коде его константа лежит в
ROM:
class WantToBeInROM
{
private:
int i;
public:
WantToBeInROM(int value): i(value) {}
int Get() const
{
return i;
}
};
const WantToBeInROM myConstInROM(10);
int main()
{
std::cout << &myConstInROM << std::endl ;
}
Вы тоже можете пробовать ответить на вопрос: где лежит константа myConstInROM в
ROM или в
RAM?
Если вы ответили на этот вопрос, что в
ROM, поздравляю вас, на самом деле скорее всего вы не правы, константа в общем случае будет лежать в
RAM и чтобы разобраться, как правильно и законно расположить ваши константы в
ROM — добро пожаловать под кат.
Источник