Questions tagged «progmem»

1
我可以使用PROGMEM写入闪存吗?
在Arduino的文档中,我引用: http://playground.arduino.cc/Learning/Memory 注意:闪存(PROGMEM)存储器只能在程序刻录时填充。程序开始运行后,您将无法更改>闪存中的值。 并在PROGMEM说明中: http://arduino.cc/en/Reference/PROGMEM将 数据存储在闪存(程序)存储器中,而不是SRAM中。有Arduino板上可用的各种类型的内存的描述。 PROGMEM关键字是一个变量修饰符,仅应与pgmspace.h中定义的数据类型一起使用。它告诉编译器“将该信息放入闪存”,而不是通常存放在SRAM中。 那么我们可以还是不能?还是不一样?

2
为什么不能在PROGMEM中使用指针而不是数组?
我目前正在更改某些库,以使用闪存而不是RAM进行字符串存储,这样我就不会在项目上用完SRAM。 库中的某些字符串以这种方式声明: const char *testStringA = "ABC"; 这与我通常看到的情况不同: const char testStringB[] = "DEF"; 但是,我认为这两个在声明为const并在声明中进行初始化时是等效的。两者都在代码中正常工作。 我试图将它们移动到闪存: const prog_char *testStringC PROGMEM = "GHI"; 然后我发现这行不通。打印时正在产生gobbledegook。 但是,遵循以下更常见的模式: const prog_char testStringD[] PROGMEM = "JKL"; 工作正常。 我可以在反汇编中看到: 00000068 <testStringC>: 68: 04 01 .. 0000006a <_ZL11testStringD>: 6a: 4a 4b 4c 00 JKL. 因此很明显,指针和PROGMEM导致字符串/数组未初始化。 为什么是这样? 示例代码: #include <avr/pgmspace.h> …
11 progmem  pointer 

3
PROGMEM:是否必须将数据从闪存复制到RAM才能读取?
我在理解内存管理时遇到了一些困难。 Arduino文档说,可以在程序存储器中将常量(如字符串)或任何我不想更改的常量保留在程序存储器中。我认为它嵌入在代码段中的某个位置,这在von-Neumann体系结构内必须是完全可能的。我想以此来使我的UI菜单显示在LCD上。 但是,我对于那些仅从程序存储器中读取和打印数据的指令感到困惑: strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println( buffer ); 为什么在访问前我必须将该死的内容复制到RAM?如果这是真的,那么所有代码​​会怎样?它在执行之前也已加载到RAM吗?那么仅使用2kiB RAM时如何处理代码(32kiB)?那些拿着软盘的小妖精在哪里? 更有趣的是:像这样的表达式中的文字常量会发生什么: a = 5*(10+7) 在将5、10和7加载到寄存器之前,它们真的被复制到RAM了吗?我简直不敢相信。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.