Arduino記憶體的二三事

在任何電子裝置中記憶體的操作與管理是很重要的是,尤其是在記憶體容量較小的微控制器上。Programmer必須考量到需要儲存資料的量,以及未來若需要擴充的解決方案。否則就會面臨資料錯誤或損失的窘境。


以avr-based的Arduino控制器來看內建記憶體可分為3種
1.Flash memory
2.SRAM 
3.EEPROM 
Flash memory稱為快閃記憶體,在Arduino中是用來儲存你所撰寫的程式碼的。
SRAM稱為隨機存取記憶體,是用來存放執行時期的資源和變數,所以當設備斷電後記憶體內的資源也隨之被釋放掉。
EEPROM則是電子抹除式可複寫唯讀記憶體,是用來存放長期資料的,當有資料不想要在系統斷電後就消失掉,那就放在這邊吧。

UNO使用的ATmega328記憶體規格如下
Flash  32k bytes (of which .5k is used for the bootloader)
SRAM   2k bytes
EEPROM 1k byte

Mega2560使用的ATmega2560記憶體規格如下

Flash  256k bytes (of which 8k is used for the bootloader)
SRAM   8k bytes
EEPROM 4k byte
我們可以注意到UNO的SRAM只有2K,這個容量很容易就會用完了,舉個例子來說。
假設你宣個一個字元陣列如下
char message[] = "I support the Cape Wind project.";
每一個字元都佔一個bytes,所以這樣你就已經用掉了33 個bytes。
你就會發現如果你需要處理很多字串或用到很多變數,你很容易就到達2048的上限。

當到記憶體(SRAM)達上限後會發什麼事情?
大多情況下程式可能還是可以運作,只是可能不會是你預期的情況,你的資料可能錯誤,或者遺失。更慘的,甚至你的程式可能完全無法動作。

那我們要如何解決這個問題呢?
你可以:
1.把資料丟到其他儲存裝置上
2.可以用較小的資料型態來存放變數,如用byte取代int,前提是你確定不會有溢位的情況。
3.使用flash記憶體取代sram,不過當程式在運行時不能修改資料。(使用PROGRAM關鍵字)
4.使用EEPROM library。EEPROM就像微控制器的硬碟,提供寫入與讀取的功能。
5.外接EEPROM。這裡提供幾個如24AA256/24LC256/24FC256都是低功率的CMOS EEPROM 容量有32Kbytes。
這裡比較值得注意的是外接EEPROM為了節省角位,一般都是使用串列傳輸介面。串列傳輸介面又有分很多種。
如AVR內建的SPI、I2C就是串列傳輸介面

而在Arduino要操做EEPROM很簡單
寫入指令: EEPROM.write(addr, val);
讀取指令: EEPROM.read(addr);
其實library都幫你寫好了,我們只要直接使用就可以。
詳細其他的指令可以參考:https://www.arduino.cc/en/Reference/EEPROM



參考資料:https://www.arduino.cc/en/Tutorial/Memory
http://makerpro.cc/2014/12/how-to-control-arduino%CA%BBs-built-in-eeprom/

留言

這個網誌中的熱門文章

Fragment中的ViewPager--使用Nested Fragment