EEPROMエミュレーション・ライブラリ Pack02の最大データ数が255の訳がわかりません。

初めまして、RL78/G13を使い始めて2年生、ぴろと申します。自己紹介の代わりに使ってきたMPUを書き連ねると、H8/300,H8/500シリーズあたりからルネサス系(当時日立)を使いはじめ、ルネサスが主力を変える度にこちらも追従して来ました。R8Cシリーズに変え、現在はRL78/G13とRX621等に変遷してきました。

では本題です。対象となるRL78はR5F100LFAFAです。データフラッシュは8kbyte(8192byte)で。

RL78用に提供されている「EEPROMエミュレーション・ライブラリ Pack02」ではデフォルトで最大ユーザデータ長を255byteとしています。

それに管理用としてEELブロックヘッダが8byte、さらに格納データにはSoRとEoRフィールドがあり、合計で255+8+1+1 = 265byteとなり、

8192/265=30.9....と端数が出てしまいます。

30ブロックには出来ない、29ブロックとすると余り444byteとなり永遠に使われない無駄な領域が生まれることになるのでは?という疑問を持った次第です。

ライブラリでEELブロックヘッダやSoR,EoRで10byteつかうなら256-10=246byteを最大ユーザデータ長としたほうが256byteバウンダリーで使えて

8192/256=32ブロックピッタリ!となると思うのです。なぜ端数が出るような使い方をしているのでしょうか?私が何か大事な領域を見逃しているのでしょうか?

ご教示よろしくお願いします。

Parents
  • 訂正です。
    30ブロックはとれますね。 265×30 = 7950byteで、 8192 - 7950 = 242byte の端数です。
    よろしくお願いします。
  • チョコです。
    単に8ビットで管理するために最大が255になっただけだと思いますよ。
    実際に使うときに必要に応じて値を決めてしまうだけです。
    確実なところは仕様を決めたルネサスに問い合わせてみてください。
  • > 10ページの「図 2-7 有効なEELブロックの例」です。EELが255byteまでしかサポートしていないのにこの図は1kbyteの大きさ。

    1ページ目からこのマニュアルでの用語が解説されていますが、それを参照されると疑問も解決されると思います。
  • チョコです。
    >EELが255byteまでしかサポートしていないのにこの図は1kbyteの大きさ。
    1kbyteは物理的なデータフラッシュ(EELで使用する領域)の大きさです。
    実際に格納しているデータそのものは下側から並んでいる部分です。3つのデータ(ID=0x01,0x04,0x02)を格納している例が図2-7です。ひろさんが,気にしている個々のデータはID=0x01が4バイト,ID=-0x04が2バイト,ID=0x02が1バイトです(全て255バイト以下です)。

    >5行目の「ユーザ・データの推奨サイズ 注1」の記述では1014/2 バイトとあり、507byteが推奨???。
    EELは1ブロック(1kbyte)に2つ以上のデータを書き込めるように考えているので,こうなります。
    単純に大きいデータを書き込むのであれば,EELではなく,データ・フラッシュ・ライブラリを使ってください。
    基本的な使い方は短いデータをブロックの中に入る範囲でデータを書き換えるのではなく(フラッシュは書き換えはできない),新たに追加で書き込んでいき,もう書けなくなったら次のブロックに移るものです。新たに書かれたデータが有効であることを示すために参照領域を使って管理しています。おそらく,次にID=0x01に新たなデータを書き込むと,相対アドレス0x000Eに0x01が,0x000Fに0xFEが書き込まれることになります。新しいデータは0x03F5~0x03F8に書き込まれるはずです。

    >皆さんよくこのマニュアルでプログラム作れるなぁ???と感心
    別に図2-7を理解しておく必要はなく,単にライブラリで準備された関数を介して使用するだけです。中の構造は知らなくても使いこなせますよ。
  • ぴろです。
    文字数制限があるようで長々書いたReplyがエラーになりました。
    1/3位に分割してReplyします。
    その1です。
    ぴろです。
    皆さんのいろいろな見方を拝見して、曲解・誤解していた点が解消しました。
    誤解点:EELブロックはEELブロックヘッダデータ部でのみ構成されていて、ヘッダ+データで263byte/ブロック。
    -> EELブロックはEELブロックヘッダ+複数のSoR+EoR+セパレータ+データ領域で1024byte/ブロック。
    ブロックヘッダ+参照領域+セパレータ=16byteで、残り1008byteをデータ領域として使えるが、データ長が255なので
    255 x 3 = 765byte、 255 x 4= 1020 から使えるのは3データ長分のみで、1008-765 = 243byteが端数となり無駄になる。
    誤解点:データはアドレスの小さいほうからデータを格納していくの?
    ->アドレスの大きいほうから書いていく。
  • その2です。
    疑問点:EELブロックのどこからどこまでにどのくらいのbyte数で書かれているかを管理するデータはどこ?
    ->eel_descriptor.hの#define EEL_VAR_NO 8 の記述から
    __far const eel_u08 eel_descriptor[EEL_VAR_NO+2] = テーブルを参照し、
    (eel_u08)(sizeof(type_Z)), /* id=8 */ \
    を引っぱってくるからデータは255byte毎であることが判る。
  • その3です。
    実際EELを使って書き込んだDATAFLASH領域を確認すると
    0xf1000  01 FE 00 FF FF FF FF FF 08 F7 08 F7 08 F7 FF FF ←ブロックヘッダと3個のSoR,EoRとセパレータ
    マニュアル8ページの表の記載から、ブロックヘッダの状態は無効ブロックになっている。
    0xf1010 - 0xf1102までがすべて0xFFで此処が端数部分
    0xf1013から0xf13FFまでに255byte毎のデータが並んでいました。
    0xf1400から次ぎのEELブロックを示す
    02 FD 00 FF FF FF FF FF 08 F7 08 F7 08 F7 FF FF
    となっていました。
    このブロックもすでに無効ブロックになっています。
    0xf1800からは EELブロックヘッダが03 FC FF FFとあり、此処が現在使用中のブロックだということが判りました。 

    ここまでは理解出来ました。
    皆さん、どうもありがとうございました。
  • わわいです
    まずはフラッシュメモリというのがどういうものかを勉強しましょう。
    そして、そのライブラリは、フラッシュメモリを使ってなにを実現しようとしているのか、というのを読み取りましょう。

    フラッシュメモリには大きな欠点があります。 それをなんとか回避/緩和するためにいろいろ面倒なことをしていたりします。
    それがなにか、また、それをどうやって回避させようとしているのか、を理解する必要があります
  • チョコです。

    >を引っぱってくるからデータは255byte毎であることが判る。
    少し気になったので,コメントしておきます。
    type_A~type_F及びtype_Xは2~20バイトであり,255バイトになっているのはtype_Zだけです。
    ここらは,"eel_user_types.h"で定義している例がそうなっているだけです。おそらく,type_Zはここまで使えることを示すために最大のサイズにしているだけでしょう。実際に使用する場合には,保存したいデータに合わせて個々のデータのサイズを指定することになります。
    1回のデータ書き換え(実際は追記)では,データ+2バイトが必要なので,あまり小さなサイズのデータが多いとメモリ効率が悪くなります。逆に大きなサイズのデータでは,ブロックの切り替えが頻発して,処理時間が長くなってしまうので,注意が必要です。
  • わいわいさん、ありがとうございます。
    マイコンをいじる方は何方もフラッシュメモリーについての常識的範囲での知識は持っておられると考えています。自分も常識的範囲での知識は持っているつもりです。RL78のデータシートの何処にも書いて有りませんが、RL78が持っているフラッシュメモリーはコードフラッシュもデータフラッシュも任意アドレスに任意サイズでREADアクセス可能な点からNOR型構造のFLASHかな?と想像しています。保証する書き換え回数に大きな差があるのはフローティングゲートの構造に差を付けてるのか?とかも想像しています。このような情報はハードウェアマニュアルには一切記載されていないので想像範囲内でしか有りません。(書いて欲しいな。特定ユーザーには教えているんでしょうが。)
    フラッシュには寿命があるというのはSDカードやUSBメモリーの故障でよく経験する事です。最近はPCに内蔵されるSSDなども普及してきていますが「記憶素子に原理的書き換え寿命があるものを汎用記憶装置として使うってのはすげ~」とも考えています。HDDも寿命がありますが、寿命を決めているのは機械的要因(磁性体がディスクからはがれるような事も含めて)がほとんどで記憶している磁性体そのものに書き換え寿命があるという話は聞きません。
    話が横道にそれましたが、RL78のデータフラッシュの特性(書き換え保証回数)から、データフラッシュをむやみに書き換えしないようなプログラムを作っていますし、コードフラッシュにも寿命がありますのでデバッグ用と製品用のMPU基板を作っています。
  • ちょこさんコメントありがとうございます。
    今回のデータフラッシュの利用方法は「250byteほどのRAM上のデータテーブルを外部指示でデータフラッシュに記憶する。データフラッシュに記憶されているデータは電源投入時にRAMにコピーされ初期値情報として使用する。」と言う用途です。ですので今回はtype_Zで使います。type_Zの設定値はいじるかもしれませんし、type_Yを作るかもしれません。
  • ちょこさん、わいわいさん
    コメントありがとうございました。お二人の説明を聞いてEELについて自分なりに判ったつもり?になっています。
    このスレッドはこれにてCLOSEしたいと思います。
    今後ともよろしくお願いします。
Reply
  • ちょこさん、わいわいさん
    コメントありがとうございました。お二人の説明を聞いてEELについて自分なりに判ったつもり?になっています。
    このスレッドはこれにてCLOSEしたいと思います。
    今後ともよろしくお願いします。
Children
No Data