2017年3月13日 星期一

[Arduino] 淺談記憶體1 -- Memory

要善用 Arduino 就必須要徹底了解它的硬體架構與記憶體管理。本章旨在說明 Arduino 的記憶體,硬體架構則是在其它地方說明。

在基於 AVR 的 Arduino 板子上有三種可以儲存資料的地方:
1.快閃記憶體(Flash)。程式碼是儲存在這個地方。
2.靜態隨機存取記憶體(SRAM)。程式在運行時創建和操作變數的地方。
3.EEPROM。這個地方可以讓程式設計師長期存放資料。

儲存在 Flash 和 EEPROM 裏的資料,即使關閉電源它也不會消失;但儲存在 SRAM 裏的資料,一旦關閉電源它就會消失。

Arduino UNO 上面的 ATmega328 晶片有下列記憶體容量:
Flash           32k bytes (但其中 5k 已被使用於 bootloader)
SRAM        2k bytes
EEPROM   1k bytes


由上表可以知道,您的程式碼有 27k bytes 的記憶空間可用,但用來處理變數的記憶空間(SRAM)只有 2k bytes,假如我們在程式之中宣告一個字串變數

char message[] = "I support the Cape Wind project.";

這個字串有 32 個字元,每一個字元會占用 1 byte 的 SRAM,32 個字元將會占用 32 bytes 的 SRAM,再加上一個看不見的結尾字元 "\0",總共占用掉 33 bytes 的 SRAM。

2k bytes 等於 2048 bytes,2048 減 33 還剩 2015 bytes,或許這在你看來並非用掉了很多 SRAM,但是當你有一大篇字串要顯示或處理時,特別是在使用查表法時,這 2k bytes 的空間將會很快地被用完。

如果你把 SRAM 用完了,你的程序可能會以意想不到的方式失敗:它會顯示上傳成功,但不會運行,或者運行奇怪。要檢查這是否發生,你可以嘗試註釋掉或縮短程式中的字串或其他數據結構(在不更改程式碼情況下)。然後,如果它運行成功了,就表示你可能已用完了 SRAM。

您可以做一些事情來解決上述問題:

如果你是使用桌上型電腦或筆記型電腦來跟 Arduino 作溝通,那麼你可以嘗試將數據或需要計算的資料這樣的工作轉移到電腦上面,藉以減少 Arduino 的負擔。

如果有用到查表法或有大型資料,請使用存儲所需值的最小資料型態來宣告:例如 int 會佔用 2 個 bytes,而 byte 只會占用 1 個 byte (但是只能存儲較小範圍的值)。

如果程式在運行時不需要修改字符串或數據,則可以將它們存儲在 Flash (程式) 記憶體中,而不是 SRAM ;要做到這一點,可以使用 PROGMEM 關鍵字(註A)。


註A:LED_Cube 程式碼中使用大量的查表資料用來顯示 LED 圖案,此時就用到了 PROGRAM 關鍵字。


相關連結

淺談記憶體2 -- PROGRAM http://pizgchen.blogspot.tw/2017/03/arduino-2-program.html

Arduino Memory https://www.arduino.cc/en/tutorial/memory

各類型 Arduino 板子的記憶體大小 http://playground.arduino.cc/Learning/Memory

葉難 http://yehnan.blogspot.tw/2013/08/arduino.html

Adafruit https://cdn-learn.adafruit.com/downloads/pdf/memories-of-an-arduino.pdf

沒有留言:

張貼留言