過去の記事の検索が簡単にできるよ (・∀・) 例 ランチャー9
その中の記事で
PIC HI-TECH CでEEPROMアクセスという記事があり、EEPROMの読み書きに専用のソースコードが書かれていたので、私はいつも使うEEPROM_READ,EEPROM_WRITEの事をコメントしてみた。そうすると、驚くべき事実が分かったのである。
1.EEIF (EEPROM write complete bit)をチェックしていない
但し、「EEIFビット」(書き込み完了判断)をチェックはしていないが、書き込み前に「WRビット」(書き込み中判断)をチェックしているので、書いた直後にすかさず読みに行くケースでもなければ特に問題にならないであろう。(コメントを頂きました。ありがとう御座います)
2.マクロ定義ということで、コードサイズが大きくなる 用意されていた定義文を疑問に持たずに使っていたのだが、マクロ定義なら、使えば使うほどプログラムが肥大する。そこで、ちょっと実験を行ってみた。
早速検証開始
私が公開している
LCD VUメータのソースコードを使用することにした。これはEEPROM_READ 27箇所、EEPROM_WRITE 3箇所がmainで使われているので、その効果がよくわかる筈だ。
Memory Summary:
Program space used F88h ( 3976) of 1000h words ( 97.1%)
殆どギリギリ状態
これを元に、ソースコードを改造してみる。
EEPROM_READとEEPROM_WRITEをeeprom.cにてまとめた場合
unsigned char E2promRead( unsigned char adr ){
return(EEPROM_READ( adr ));
}
void E2promWrite( unsigned char adr, unsigned char data ){
EEPROM_WRITE( adr,data);
}
【結果】
Memory Summary:
Program space used E5Bh ( 3675) of 1000h words ( 89.7%)
何と、301ワードも節約した。
【結果】
Memory Summary:
Program space used E40h ( 3648) of 1000h words ( 89.1%)
更に27ワード小さくなっている。ちょうどEEPROM_READの個数分。
最初の時より328ワードも節約されている。
もちろん、3種類ともすべて動作確認済みである。
【考察】
用意されているEEPROM_READとEEPROM_WRITEはマクロ定義なので、使えば使うほど大きくなる。頻度に使用する場合は関数化して使用するとプログラム容量を大きく減らす事ができる。
更に、用意されているマクロを使わず、浜松マイコン工房の様なEEPROMのアクセスする関数にすると、更にプログラム容量を増やせられる。
これは目からウロコ。Lite版でもまだまだ捨てたものではないなぁ。浜松マイコン工房ニュースの記事が無かったら、ずっと分からずじまいであった。
※良い情報に巡りあったことに感謝致します。
※PICは1オペコードは8ビットでないので、バイト→ワードに修正しました。
えええ!! EEIFチェックしていないんですかぁ? じゃあ連続WRITEすると不具合が発生することもあるんですね。
わたしも知らずに使っていました。なんかショックw
幸いまだ遭遇していませんが、可能性は無きにしもあらずですね。
よく調べないと分からない事があります。
こんにちは。
マクロでは、「EEIFビット」(書き込み完了判断)をチェックしていませんが
書き込み前に「WRビット」(書き込み中判断)をチェックしているので
書き込みが失敗することはないと考えます。
マクロで問題になるのは、書き込み直後の読出しです。
書き込みが終了しないまま、読み込み動作に入れる為です。
通常は、書き込み直後に読出しをおこなうことは少ないと思うので
あまり問題にならないのではないでしょうか。
ご参考になれば。
宇都宮様、
そういう事だったのですね。ご丁寧に教えて頂き恐縮です。
本文も修正させて頂きます。
わたしも知らずに使っていました。なんかショックw