c++ - ARM C++ - 如何将 const 成员放入闪存中?

标签 c++ embedded constants

我有这个代码

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/

相关文章:

C++ 连接

c++ - 在 C++ 中注册访问

c - 为 FSMC LCD 编写非阻塞代码

c++ - 如果从未通过它们进行修改,是否允许对实际 const 对象的引用进行 const 转换?

c++ - data_condition 等待无效参数错误

c++ - 使用成员函数更改对象或返回它并分配它是否被认为是更好的做法?

c++ - VS2012 预编译头文件 : how does my . h 文件知道包含在 stdafx.h 中吗?

unit-testing - 单元测试嵌入式软件

java - 常量实用程序类中的最终关键字

c++ - 'strcpy' : cannot convert parameter 2 from 'WCHAR *' to 'const char *