小编sig*_*maN的帖子

嵌入式C++ 11代码 - 我需要volatile吗?

带Cortex M3 MCU的嵌入式设备(STM32F1).它有嵌入式闪存(64K).MCU固件可以在运行时重新编程闪存扇区; 这是由闪存控制器(FMC)寄存器完成的(所以它不像a = b那么容易).FMC获取缓冲区指针并将数据刻录到某个闪存扇区.

我想将最后一个闪存扇区用于设备配置参数.参数存储在带有数组的压缩结构中,并包含一些自定义类.

可以在运行时更改参数(复制到RAM,使用FMC更改并回显到闪存).

所以有一些问题:

  1. FMC硬件改变参数struct的状态(按位).C++编译器不知道它是否被更改. 这是否意味着我应该将所有struct成员声明为volatile? 我想是的.

  2. 应该在编译时静态初始化Struct(默认参数).Struct应该是POD(TriviallyCopyable并具有标准布局).请记住,那里有一些自定义类,所以我记住这些类也应该是POD.但是有一些问题: cppreference.com

    唯一可复制的类型是标量类型,平凡的可复制类,以及此类类型/类的数组(可能是const限定的, 但不是volatile限定的).

这意味着我不能让我的班级POD和易变? 那么我该如何解决这个问题呢?

在参数struct中只能使用标量类型,但它可能会导致配置处理周围的代码更加干净......

PS 它甚至没有易失性,但我担心有一天,一些聪明的LTO编译器会看到静态初始化,不会改变(通过C++)struct并优化对底层内存地址的一些访问.这意味着不会应用新编程的参数,因为它们是由编译器内联的.

编辑:可以在不使用volatile的情况下解决问题.它似乎更正确.

您需要在单独的转换单元(.cpp文件)中定义config struct变量,并且不要初始化变量以避免在LTO期间替换值.如果不使用LTO - 一切正常,因为优化是一次在一个转换单元中完成的,因此不应优化具有静态存储持续时间和在专用转换单元中定义的外部链接的变量.只有LTO可以抛弃它或者在不发出内存提取的情况下进行值替换.特别是在将变量定义为const时.我认为如果不使用LTO,初始化变量是可以的.

c++ embedded arm stm32 c++11

5
推荐指数
1
解决办法
713
查看次数

标签 统计

arm ×1

c++ ×1

c++11 ×1

embedded ×1

stm32 ×1