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

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

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

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

Parents
  • はじめまして、SAM と申します。

    『書き込みできました。』ということでしたが、その後いかがでしょうか。
    私は RX72N を使っていますが、しばらく書き込むと書き込みができなくなります。
    Giggs さんと同様に書き込もうとすると「消去ブロックなしのため、データ更新処理実行不可能」になります。
    ここからが違っていて R_FLASH_DM_Erase() で FLASH_DM_FINISH_ERASE が返ってきたので、次は書き込めるのかなと思うと同じ状態になります。

    ルネサスに質問していますが、まだ回答はありません。
    フラッシュメモリデータ管理モジュールFIT について質問しているのが Giggs さんだけでしたのでこのような Reply をさせていただきました。
    ご迷惑でしたらすみません。

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

    このスレッドに関わっていましたので気になっているのですけれども、先日のGiggsさんのリプライ以降で何か状況に変わりはありましたでしょうか?(動いていましたよ、の返事の後に見直したら問題箇所が見付かった、ルネサスさんからなかなか回答が来なかったけれども、ようやく回答があって問題箇所が分かった、とか。)

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

    いえ、そういう目的であれば、このスレッドで扱ったr_datfrx_rxモジュールは不要ですよ。r_flash_rxモジュールでコードフラッシュを書き換えることが出来ますよ。(r_datfrx_rxモジュールが不要というより、ルネサスさんの返信とおり、r_datfrx_rxモジュールはコードフラッシュに対して使うように設計されたものでは無いです。)

    デュアルバンクでのコードフラッシュの書き換えについては、咄嗟に探して、以下のスレッドがあるのですけれども、参考にはならないでしょうか?ひょっとして、r_flash_rxモジュールで書き換え出来ることは分かっているけれども、それでも、r_datfrx_rxモジュールが持つ何かの特徴ゆえにを使おうとしているのですか?思うに、そのようなことであれば、別のレッドを立てるのが良さそうに思うのです。(ただ、その場合でも、私からのリプライも、r_datfrx_rxモジュールはコードフラッシュに対して使うように設計されたものでは無いのです、というのが前提になってしまうのですけれども。)

    RX66Nでデュアルバンク機能の起動バンク選択機能でのプログラム切り替えが上手くいかない
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/8077/rx66n

    flash_demo_rskrxについて
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7949/flash_demo_rskrx

    r_flash_rx のサンプルについて
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7726/r_flash_rx

    デュアルバンク機能時のオブジェクトダウンロード方法とVECTRESETの割り当てについて
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7901/vectreset

    スマートコンフィグレータ使用時のブート領域、フラッシュ領域の分割方法について
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7915/thread
     

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

    それとも、デュアルバンクでのコードフラッシュの書き換えだけでなく、プログラムとして、フラッシュメモリデータ管理モジュールによるデータフラッシュ書き換えも、両方扱うように作っていて、それでそういう設定になっていた、ということでしょうか、、、

  • NoWayさん、こんにちは。

    NoWayさんのおっしゃる通りです。
    パラメーターの保存にデーターフラッシュを使います。
    RX210 の時にいくつかのブロックに分けて格納していましたが、サイズが増えてブロックが複数に亘り、ブロックがずれて、痛い目にあったので DATFRX に飛びついたのです。
    (マクロを使えば良かったとは思ったのですが)
    デュアルバンクは、遠隔ファームウェアバックアップしたいなということで設定だけしていました。

    SAM

  • 横から意見を述べて失礼します

    ブロック消去しようとすると「無効ブロックなし」になります。

    ということですが

    ブロックを確保するAPIを何度も呼んでブロック確保しないのが原因ではないですか

    ブロックはすぐに無くなってしまいます

    イレースする前には十分なブロックを確保してからでないとエラーになります。

  • 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ブロックの半分は全くの空きとしておいた方がいいのかなと思ったということです。
    計算式参考にさせていただきます。
    ありがとうございました。
    ルネサスさんのチケットは本日クローズします。

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

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

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

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

Children
No Data