質問: 1回のEEPROM.read()の処理に10ms程度、EEPROM.write()の処理に57ms程度かかっています。 Spresense用スケッチ例のeeprom_readやeeprom_writeをそのままでdelay()をコメントアウトしただけのコードでも上記の時間がかかるのですが、Arduino IDEでの開発だとこの程度の時間がかかってしまうのでしょうか。 ### 追記 コメントありがとうございます。 使っているのは、spresenseメインボードに内蔵されている8MBのフラッシュメモリーです。 SpresenseのArduino IDEデベロッパーガイドには 「SpresenseではEEPROMが搭載されていないので、SPI-Flashメモリを用いてEEPROMをエミュレートしています。 EEPROMライブラリは、SPI-FlashによってエミュレートされたEEPROM に対して、書き込みと読み込みを可能にします。」 と記述されています。 EEPROM.hに記述されているE2ENDの値を変えてEEPROMのサイズを大きくしたところ、EEPROM.read()や.write()の速度も遅くなりました。 EEPROM.read()で1バイト操作する場合でも、確保したEEPROMすべての領域にアクセスしているから遅くなっているという可能性があるのでしょうか。
回答: 一般的に EEPROM と呼ばれているメモリには次のような特徴があります。 - 1バイト単位で読み書き可能 - 複数バイトを書きたい場合、「ページ」範囲内で可能 - 書き込む際に事前の消去は必要ない(メモリチップ内で消去→書き込みしてるかもしれないが、プログラマはそれを意識する必要はない) - 書き込み命令を送ったら、内部の処理が完了するまで次の読み書きができない 一方で、一般的に NOR-Flash メモリには次のような特徴があります。 - 1バイト単位で読み込み可能 - 数バイト~数百バイト単位の固定サイズで書き込み可能 (例: 256byte 単位で書き込み可能) - 数キロバイト単位の固定サイズで消去可能 (例: 4096byte/32768byte 単位で消去可能) - 消去済み領域にのみ書き込み可能 (書き込み済み領域に上書きはできない) - 消去・書き込み命令を送ったら、内部の処理が完了するまで次の読み書きができない そのため NOR-Flash で EEPROM の真似をするためには - 消去領域を一度 RAM に読み込む - 読み込んだ RAM 上で値の変更を行う - 消去する - 書き込む という手続きが必要になります(意外にめんどくさい) 今オイラの手元にあるチップ(品名出していいのかな?)の仕様書によると - SPI クロック最大周波数 108MHz - Erase 4096byte の tSE (time for sector erase) typ 38msec - Program 256byte の tPP (time for program page) typ 0.8msec - 新品メモリはたいていもっと速い なので SPI 信号をハードウェアで生成しているのであれば、提示読み込み時間は信じられないくらい遅すぎです(計測が誤っていると疑われるレベル)。逆にソフトウエアで生成しているのであればそんなものかもしれません。バス上どのくらいのクロック周波数が生成されているのか次第。 書き込み時間は上記手続きをまじめにやっているなら、そんなものだと思います。