我需要将一些大数据块存储在闪存中,在闪存中可以经常读取,偶尔也可以使用SPM重写。我已经知道如何使用指针
__flash
和
pgm_read_byte
要访问它,如何不忽略
const
(尽管我写了这篇文章),如何在循环中实际访问数组,以便它不会得到完全优化(内联后),但我真的不知道如何声明我的数组。
const uint8_t persistent_data[1024] __attribute__(( aligned(SPM_PAGESIZE),
section("mycustomdata") )) = {};
很好,只是我不想初始化它。在对我的设备(Arduino ATmega328P)进行编程时,我希望保留此部分,以便它保留应用程序先前写入的数据。上面的零初始化它,我的十六进制文件包含零,程序员很乐意使用这些零来覆盖我的数据。
使用
__闪光灯
修改器而不是
__attribute__(( section("â¦") ))
在这里也是一样的,只是它将数组放在其他地方,我无法控制它放在哪里。当我使用
__闪光灯
省略初始化(尽管我得到了一个“
未初始化变量“persistent\u data”放入程序内存区[-Wuninitialized]
“警告”)。
现在我试图省略初始化器:
const uint8_t persistent_data[1024] __attribute__(( aligned(SPM_PAGESIZE),
section("mycustomdata") ));
并得到意想不到的结果。中的节数据。lss输出显示
Idx Name Size VMA LMA File off Algn
â¦
1 mycustomdata 00000480 00800480 000055e2 00005700 2**7
CONTENTS, ALLOC, LOAD, DATA
2 .text 00005280 00000000 00000000 000000d4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
这会将所有初始化零放在十六进制文件中的加载内存地址55E2处(而不是忽略它们),而虚拟内存地址(变量
persistent_data
指向)参考0480-在文本部分的代码中间!
(我还试图省略
常量
,并省略
常量
和初始化器,两者的效果与仅省略初始化器相同)。
我不知所措。我需要使用
extern
大概(任何这样做的尝试最终都会导致“
对persistent\u数据的未定义引用
“错误)。是否需要使用链接器脚本?
我该怎么做
persistent\u数据
引用的位置是没有被任何其他数据使用的程序内存,并且编译器没有在十六进制文件中为该位置发出任何初始化数据吗?