本帖最后由 tsaiwn 于 2015-4-10 11:49 编辑
suoma 发表于 2015-4-10 09:08 
谢谢,我再检查一下
还有,
“书上说arduino uno的SRAM31.5K” 这句是错的 !
实际上是:
(1)RAM (即 SRAM)只有 2KB
(2)Flash (ROM)有 32KB, Bootloader 0.5K,
所以 Flash 剩下 31.5KB
不过你程序才 24KB, 还剩 7.5KB
(3)一般像 Arduino 这种开发板或 Embedded system,
程序是上传烧入 Flash ROM, 执行时不是在 RAM,
是变量(Variable)才在 RAM,
RAM 只有 2KB(SRAM 是 RAM 的一种, 通常比 DRAM 快一点);
在 Arduino, 如果 RAM 用光了程序有可能错乱(不会报错!),
严重也可能死机!
所以, 如果用太多 String 相关语句, RAM 会用比较多 !
(4)如果2KB 的RAM貌似用光了, 但程序码离 31.5KB还剩很多
那可以尽量把一些不会变的变量写在 ROM,
例如:
原先写 unsigned long ggg = 1234567;
如果这 ggg 都不会变,
那可改为
Unsigned long ggg PROGMEM = 1234567;
这样, ggg 会被安排在程序码空间 Flash, 不会占用 RAM,
可以省下 4 bytes;
(5)又如:
Serial.println("Hello there");
这时 "Hello there" 也是占用 RAM, 你可以改为如下:
Serial.println( F("Hello there") );
这样, "Hello there" 会被访入 program space 的 Flash ROM, 不占用 RAM
或是自己这样写也是效果相同:
const char you[ ] PROGMEM = "Hello there";
Serial.println(you);
|