フラッシュメモリデータ管理モジュールFIT

はじめまして。Giggsと申します。

RX72Mで、フラッシュメモリデータ管理モジュールFITを使用してデータフラッシュに書き込み/読み出ししようとしています。
データ番号0に書き込むことが出来たので、続けてデータ番号1に書き込もうとしましたがうまくできません。
書き込もうとすると「消去ブロックなしのため、データ更新処理実行不可能」になるので、
ブロック消去しようとすると「無効ブロックなし」になります。
データ番号0に書き込んでからデータ番号1に書き込む間で何か処理が必要でしょうか?

以上、宜しくお願い致します。

  • NoWayさん、IKUZOさん こんにちは。

    ルネサスから回答が来ました。

    私は、内蔵データーフラッシュの全ての領域がデーターの領域であると考え、1024バイト32個と定義していました。何なら確保した領域の中で消去などのやりくりをすると思っていました。

    DATFRX の PDF『6.3.3 ブロック管理』Format1、Format2 について説明していただきました。
    最小限の領域確保にしたところ「消去ブロックなしのため、データ更新処理実行不可能」は今のところ出ていません。

    割り当てていないところを空きブロックとして更新等に使うのですね。
    そして、使えるのは全ブロックの半分ということなんですね。

    (だったら 1024バイトといわず、もっと大きい領域を確保できるようにしてくれといいたくなりましたがしたが)

    全て私のせいです。お騒がせしました。
    もし私の記述に間違いがあれば仰ってください。

  • SAMさん、こんにちは。NoMaYです。

    すみません、何か話が腑に落ちないような気がしました。もし可能であれば、駄目だった時と、動くようになった時の、r_datfrx_rx_config.hをそれぞれ見せて頂くことは出来ませんでしょうか?

    直感として、1024バイトのデータ、というのは管理情報を含めると1025バイト以上ある筈で、それを32個定義した場合、そもそもRX72Nのデータフラッシュサイズ32Kバイトでは扱いきれないのでは?、と思ったのですけれども、、、

    > 1024バイト32個と定義

  • SAMさん、こんにちは。NoMaYです。

    あと、フラッシュメモリデータ管理モジュールは不意の電源OFFに対しても頑丈に動作するように意図して設計されていますので、新しいデータをデータフラッシュメモリに書き込む場合、新しいデータがしっかりと書き込まれたことが確認されるまでは、古いデータを残しておくようになっています。(新しいデータが書き込まれたことが確認されたら即座に古いデータが削除されるというわけでもないですけれども。) そういう意味では、コードフラッシュメモリのデュアルバンク機能のように、同時に記録することの出来るデータの最大量はデータフラッシュメモリの半分のサイズまでとなります。(管理データのことも考慮すると、もう少し減りますけれども。)

    > そして、使えるのは全ブロックの半分ということなんですね。

  • NoMaYさん、こんにちは。
    テキストファイルの添付方法が分からなかったので下記に抜粋します。

    変更前

    /************************************************************************************************
    DATA FLASH : SET THE DATA NUMBER OF THE DATA NUMBER
    *************************************************************************************************/
    /* Please set the data number to use by the data flash.
    The setable value is from 1 to 255. */
    #define FLASH_DM_CFG_DF_DATA_NUM (32)

    /************************************************************************************************
    DATA FLASH : SET THE DATA LENGTH FOR THE DATA NUMBER
    *************************************************************************************************/
    /* Please set the data size of the data number to use by the data flash.
    FLASH_TYPE1 = The setable value is from 0 to 255.
    FLASH_TYPE2,3,4 = The setable vlue is from 0 to 65535.
    The data size of the data number not to use is ignored.
    This number must be a multiple of the minimum programming size for memory area you are writing to.
    1 bytes (e.g. RX110, RX111, RX113, RX230, RX231) */
    #define FLASH_DM_CFG_DF_SIZE_NO0 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO1 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO2 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO3 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO4 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO5 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO6 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO7 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO8 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO9 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO10 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO11 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO12 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO13 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO14 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO15 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO16 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO17 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO18 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO19 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO20 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO21 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO22 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO23 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO24 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO25 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO26 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO27 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO28 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO29 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO30 (1024)
    #define FLASH_DM_CFG_DF_SIZE_NO31 (1024)

    変更後

    /************************************************************************************************
    DATA FLASH : SET THE DATA NUMBER OF THE DATA NUMBER
    *************************************************************************************************/
    /* Please set the data number to use by the data flash.
    The setable value is from 1 to 255. */
    #define FLASH_DM_CFG_DF_DATA_NUM (8)

    /************************************************************************************************
    DATA FLASH : SET THE DATA LENGTH FOR THE DATA NUMBER
    *************************************************************************************************/
    /* Please set the data size of the data number to use by the data flash.
    FLASH_TYPE1 = The setable value is from 0 to 255.
    FLASH_TYPE2,3,4 = The setable vlue is from 0 to 65535.
    The data size of the data number not to use is ignored.
    This number must be a multiple of the minimum programming size for memory area you are writing to.
    1 bytes (e.g. RX110, RX111, RX113, RX230, RX231) */
    #define FLASH_DM_CFG_DF_SIZE_NO0 (41)
    #define FLASH_DM_CFG_DF_SIZE_NO1 (94)
    #define FLASH_DM_CFG_DF_SIZE_NO2 (94)
    #define FLASH_DM_CFG_DF_SIZE_NO3 (412)
    #define FLASH_DM_CFG_DF_SIZE_NO4 (518)
    #define FLASH_DM_CFG_DF_SIZE_NO5 (412)
    #define FLASH_DM_CFG_DF_SIZE_NO6 (412)
    #define FLASH_DM_CFG_DF_SIZE_NO7 (1024)

    これで分かりますか?
    SAM

  • SAMさん、こんにちは。NoMaYです。

    変更前と変更後のr_datfrx_rx_config.hをどうもありがとうございました。ファイル比較ツールで比較すると以下の画面コピーの通りに変更されたのですね。(よくよく考えてみれば、変更前のものは期待したように動作しなかった、とのことだったわけなので、腑に落ちない、ような気がしたのも、それはそうですよね、という突っ込みがあってもおかしくないようなリプライをしてしまったことに、いまさら気付きました、、、)

    抜粋ということで、以下のドキュメントの画面コピーにも載せたFLASH_DM_CFG_DF_BLOCK_NUMの値は、ちょっと分かりませんでしたの計算してみようかなと思いまして考え始めたところ、先の投稿に書いた、同時に記録することの出来るデータの最大量はデータフラッシュメモリの半分のサイズ、というのは、理屈としては正しくないのかも、とも思い始めました。

    記録されているブロックがフラグメント化してしまう可能性を脇に置くと、また、データ管理情報のサイズのことも脇に置くと、不意の電源OFFに対しても頑丈に動作するようにと、新しいデータをデータフラッシュメモリに書き込む場合に、新しいデータがしっかりと書き込まれたことが確認されるまでは、古いデータを残しておくようにしていたとしても、データの書き換えは今回は全部で8種類あるデータの1種類ずつしか書き換え出来ませんので、以下の式になるような気もしました。

    FLASH_DM_CFG_DF_BLOCK_NUM ≒ ((41 + 94 + 94 + 412 + 518 + 412 + 412 + 1024) + 1024※1) ÷ 64※2 ≒ 63

    ※1 : 8種類あるデータの中で最大サイズのデータのサイズ
    ※2 : RX72Nのデータフラッシュメモリのブロックサイズ

    でも、これだとギリギリですので、どんぶり勘定でマージンを取って、128ブロック程度にすれば良いのかな、、、

    あるいは、特殊な事情があって、データフラッシュメモリの幾らかを別のやり方で管理しなければならなくなった、というような場合以外は、マイコンに搭載されているデータフラッシュメモリの全てのブロックを割り当てるのが普通のような気もしました。

    ひょっとして、ルネサスさんが、使えるのは全ブロックの半分ですよ、と言ったのかも知れないのですが、そうだとしたら、フラグメント化とかデータ管理情報サイズとか、そんなこんなで、ざっくりマージンを見込むと、定義したデータの総合計サイズは、それぐらいまでにした方が良いですよ、ぐらいの意味なのかなぁ、と推測(というか妄想)し始めました。

    実際に定義したデータの全てを使用するとして、定義したデータの総合計サイズが大きくなるようなユーザさんは、ルネサスさんと相談してフラッシュメモリデータ管理モジュールを使い始めるのが良いのかなぁ、とか思いました。

    以下、ファイル比較ツールやドキュメントの画面コピーです。






     

  • NoMaYさん、こんにちは。
    返信が遅くなり申し訳ありません。

    FLASH_DM_CFG_DF_BLOCK_NUM は全領域を使用するので 512 と思っていました。

    ひょっとして、ルネサスさんが、使えるのは全ブロックの半分ですよ、と言ったのかも知れないの

    ルネサスさんは1ブロック分の管理情報及びデーターサイズを教えてくれました。
    半分とは私のどんぶり勘定です。
    512ブロックの半分は全くの空きとしておいた方がいいのかなと思ったということです。
    計算式参考にさせていただきます。
    ありがとうございました。
    ルネサスさんのチケットは本日クローズします。