|

Arduino新款EEPROM函式庫小觀察

   

作者:陸向陽

在Arduino的微控器晶片內,其實有0.5KB到4KB不等的EEPROM記憶體,可以用來儲存一些斷電後仍要留存的資料。

Arduino開始於2005年,2007年6月開始有EEPROM的函式庫,只有簡單的讀取與寫入功能,即EEPROM.read、EEPROM.write,之後雖有少許修正,但大體就這兩個函式,維持相當長一段時間。

也由於單純的讀、寫操作不是很好用,因此除了EEPROM.h外,也有人加寫了eeprom_anything.h作為補充。

但到了2015年3月,Arduino推出1.6.2版後,對EEPROM函式庫部分進行更新,原有的EEPROM.read、EEPROM.write方法都還在,但又多了3個新方法可用,如EEPROM.update、EEPROM.get、EEPROM.put等。

5140100_orig

不僅如此,範例程式部分也多了3個實用的新範例,即EEPROM_clear、EEPROM_crc、EEPROM_iteration,以下將對這些進行講解。

新函式庫:EEPROM.update

EEPROM.update跟EEPROM.write一樣,是一種將數值寫入EEPROM的動作,但差別是,EEPROM.update會先把要寫入位置的原本資料,與即將要寫入的資料進行比較,若是數值相同,就不執行寫入動作,反之,會用新數值覆蓋掉舊數值。

若是原本的EEPROM.write,無論即將寫入位置的數值為何,一概不理會,直接將數值寫進去。

同樣是寫入,為何要多一個EEPROM.update呢?因為,EEPROM是有寫入次數的,晶片商只保證每個位置可以寫入10萬次,10萬次之內的寫入,保證讀出來的資料是當初寫入的,擔保正確性,而一旦寫入次數超過10萬次,就不再保證。

由於某些Arduino應用可能會頻繁寫入EEPROM,造成某些位置的寫入次數很快就超過10萬次,超過後等於該區記憶體無法保證未來儲存的資料是否正確,必須換一顆新晶片。為了避免這種情形,所以多出一個EEPROM.update,若寫入數值相同,可以減少無謂的寫入次數。

新函式庫:EEPROM.put、EEPROM.get

由於EEPROM.write、EEPROM.read每次只能操作1個Byte(位元組)的資料,而不能以其他的資料型態來處理,例如浮點數一次就佔用4個Byte,等於要額外撰寫程式,才能完成4次的搬運。而新增的EEPROM.put、get,則可以用不同的資料型態來讀寫,例如float、byte、char、int等均可,一次完成一筆資料的搬運,不用再去逐Byte處理。

事實上eeprom_anything.h的部份好處也在於此,能以一個變數為單位進行資料讀寫,而非一律以Byte為單位。不過,如此EEPROM.put、get納入標準,未來使用eeprom_anything.h的機會會變少,而put其實就是寫入,get是讀出。

新範例:EEPROM_clear、EEPROM_crc

至於EEPROM_clear,是可以一次清除EEPROM內所有資料的方法,有需要可以使用,但也等於立即耗損所有位置一次的寫入次數。

EEPROM_crc則是查核驗算,用來驗證原本儲存的EEPROM資料是否正確無誤,沒無遭到竄改?細節有機會再說。EEPROM_iteration則是示範用while、for等方式,批次對EEPROM位置進行操作,類似把EEPROM以陣列的資料格式來讀寫操作,是一個片段性的示範。

陸向陽
陸向陽

Author: 陸向陽

從電子科系畢業後,即以媒體人的角色繼續這段與「電子科技」的不解之緣。歷任電子技術專書作者、電子媒體記者、分析師等角色,並持續寫作不殆。近來投入Arduino、Raspberry Pi等開放硬體的研究與教程介紹。

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *