我有这个代码
class IO {
public:
IO(LPC_GPIO_TypeDef* port, int pin) : _pin(pin), _port(port) {};
const int _pin;
LPC_GPIO_TypeDef* const _port;
void test() {
LPC_GPIO0->FIOSET = 0;
}
};
IO led1(LPC_GPIO0, 5);
int main() {
led1.test();
return 0;
}
当我编译它时,我得到了
text data bss dec hex filename
656 0 8 664 298 lpc17xx
我希望 const _port 和 _pin 变量存储在闪存中,因为它们被标记为 const 并且初始化值在编译时已知,但它们在 .bss 部分中分配。有什么办法可以让它们驻留在闪存中吗?
编辑: 我试过这个:
struct IO {
LPC_GPIO_TypeDef* port;
int pin;
void test() const {
//_port->FIOSET = _pin;
LPC_GPIO0->FIOSET = 0;
}
};
const IO led1 = {LPC_GPIO0, 5};
text data bss dec hex filename
520 0 0 520 208 lpc17xx
似乎可以解决问题。为什么它不适用于类?
最佳答案
构造函数的参数是变量,您将一个变量分配给一个常量,这在构造函数中是可以的,但是虽然智能优化器可能会发现静态实例化中常量表达式的出现,但您可能会问一个很多,因为一般情况需要构造函数接受变量,并且将为一般情况生成代码。
您可能可以使用模板类实现您想要的,并将端口/引脚作为模板参数而不是构造函数参数传递。
它可能依赖于编译器,但根据我的经验,您必须将变量声明为静态常量才能将其强制放入 Flash,但这对您尝试执行的操作不起作用。
关于c++ - ARM C++ - 如何将 const 成员放入闪存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7712617/