这里只需要一个现实检查来确定我将使用多少PROGMEM。在下面的代码片段中,我存储了一个8x8字节数组。我可以假设(粗略地,可能有一些开销吗?)这将只占用64个字节的PROGMEM
(我意识到这有点像“谁被埋葬在格兰特的坟墓里?”有点问题,但我没有多使用PROGMEM而且我不想假设我有16k字节的内存(ATMEGA 168)芯片)只是发现当我生成真实的项目数据时,它不合适。)
prog_uint8_t datastore[] PROGMEM = {
0 , 0 , 0 , 255 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 255 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 255 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 255 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 255 ,
255 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 255 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 255 , 0 , 0 , 0 , 0 , 0
};
答案 0 :(得分:1)
想想我会把我的评论作为答案..随意向下投票
不,PROGMEM
数据没有额外开销。所有PROGMEM
标签都指示gcc将数据存储在闪存中,实际上与初始化SRAM数据相同。与自动从Flash加载到SRAM的SRAM数据相比,要使用PROGMEM
数据,您必须使用PROGMEM
识别的函数,这些函数在内部使用LPM
(=加载程序存储器)从Flash而不是SRAM加载数据的指令。它需要更长的时间(3个周期而不是1或2个SRAM)。
我相信你会意识到这一点,但实际上你的数据并没有16K的闪存:如果用数据填满闪存,你就没有空间用于程序本身:)