はじめまして。Giggsと申します。
RX72Mで、フラッシュメモリデータ管理モジュールFITを使用してデータフラッシュに書き込み/読み出ししようとしています。データ番号0に書き込むことが出来たので、続けてデータ番号1に書き込もうとしましたがうまくできません。書き込もうとすると「消去ブロックなしのため、データ更新処理実行不可能」になるので、ブロック消去しようとすると「無効ブロックなし」になります。データ番号0に書き込んでからデータ番号1に書き込む間で何か処理が必要でしょうか?
以上、宜しくお願い致します。
Giggsです。
上記の件ですが、ほぼサンプルコードを使用しています。
「RXファミリ フラッシュメモリ データ管理モジュール Firmware Integration Technology Rev.2.01 - Sample Code
type4_rx65n_2mb_rsk_sample」
Giggsさん、こんにちは。NoMaYと申します。FITモジュールから返って来ているエラーは、これらでしょうかね。私の場合ですと、FITモジュールはソースが全公開されているので(ごく僅かに例外がありますが)、恐れずにエラーの発生箇所までステップ実行して行って、原因を調べようとします。「ほぼサンプルコードを使用」とのことですけれど、試しにステップ実行して行って、まさにエラーが発生している箇所を教えて頂くことは出来ませんでしょうか?消去ブロックなしのため、データ更新処理実行不可能 → FLASH_DM_ERR_REQUEST_ERASE無効ブロックなし → FLASH_DM_NO_INVALID_BLOCKソースコードをgrepしてみると、FLASH_DM_ERR_REQUEST_ERASEは、以下の6箇所で見つかりますね。
smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(491): ret = FLASH_DM_ERR_REQUEST_ERASE;smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1423): g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1424): ret = FLASH_DM_ERR_REQUEST_ERASE;smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(491): ret = FLASH_DM_ERR_REQUEST_ERASE;smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1423): g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1424): ret = FLASH_DM_ERR_REQUEST_ERASE;
[関連リンク]Renesas検索: RXファミリ フラッシュメモリ データ管理モジュールwww.renesas.com/jp/ja/search?keywords=RXファミリ フラッシュメモリ データ管理モジュール
NoMaY様、早速の回答有難う御座います。
ご指摘の件、確認したところ上記の(1423)(1424)にて発生しています。
何かわかりますでしょうか?
Giggsさん、こんにちは。NoMaYです。ここですね。考えてみます。
static e_flash_dm_status_t r_flash_dm_d2_write(st_flash_dm_info_t * p_flash_dm_info){ e_flash_dm_status_t ret = FLASH_DM_SUCCESS; uint8_t tmp = g_flash_dm_handle->api_call; int16_t free = 0; /* === Check the parameter. === */ if (0 == g_flash_dm_handle) { ret = FLASH_DM_ERR_ARGUMENT; } /* === Check the data_no and p_data. === */ else if ((p_flash_dm_info->data_no >= r_flash_dm_drvif_get_datanum()) || (0 == p_flash_dm_info->p_data)) { ret = FLASH_DM_ERR_ARGUMENT; } /* ==== Check busy. ==== */ else if(g_flash_dm_handle->activity != FLASH_DM_ACT_IDLE) { ret = FLASH_DM_ERR_BUSY; } else { /* ==== Check status. ==== */ ret = r_flash_dm_1st_check(FLASH_DM_WRITE_1ST_CHECK); if((FLASH_DM_ERR_BUSY != ret) && (FLASH_DM_ERR_REQUEST_INIT != ret)) { g_flash_dm_handle->data_no = p_flash_dm_info->data_no; g_flash_dm_handle->user_data = p_flash_dm_info->p_data; /* === This module checks whether initialization has been done. === */ if (g_flash_dm_handle->initialized != FLASH_DM_INITIALIZED_ID) { g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_INIT; ret = FLASH_DM_ERR_REQUEST_INIT; } else if(g_flash_dm_handle->flash_state == DATF_FLASH_CALL) { ret = FLASH_DM_ERR_BUSY; } /* === Start processing. ===*/ else { /* cast from uint16_t to uint16_t */ free = (int16_t)(((g_flash_dm_handle->erase_block_num - 2) * DATF_F2_DATASIZE) + DATF_F1_DATASIZE); if (free < gc_dm_data_size[p_flash_dm_info->data_no]) { g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE; ret = FLASH_DM_ERR_REQUEST_ERASE; } else { ret = r_flash_dm_dispatch(DATF_USER_WRITE); } } } } g_flash_dm_handle->api_call = tmp; return ret;} /* End of function r_flash_dm_d2_write() */
Giggsさん、こんにちは。NoMaYです。ちなみに、以下での次の値は幾つでしたでしょうか?(1) g_flash_dm_handle->erase_block_num(2) free(3) p_flash_dm_info->data_no(4) gc_dm_data_size[p_flash_dm_info->data_no]
/* cast from uint16_t to uint16_t */ free = (int16_t)(((g_flash_dm_handle->erase_block_num - 2) * DATF_F2_DATASIZE) + DATF_F1_DATASIZE); if (free < gc_dm_data_size[p_flash_dm_info->data_no]) { g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE; ret = FLASH_DM_ERR_REQUEST_ERASE; } else { ret = r_flash_dm_dispatch(DATF_USER_WRITE); }
Giggsさん、こんにちは。NoMaYです。あと、別のアプローチとして確認したいのですけれど、「ほぼサンプルコードを使用」とのことですけど、どのような変更をされたのでしょうか?自分で試していない状態で書くのも何ですけれど、こんな感じでしょうか?(CS+では無くe2 studioなのはFITがそちら優先なので。)(1) e2 studioでデモプロジェクトを開いてRXスマートコンフィグレータ上でターゲットデバイスをRX72Mへ変更したor(2) e2 studioでRX72Mの新規プロジェクトを作成して必要なFITモジュールを追加してr_datfrx_rx_main.cを追加した
NoMaYさん、有難う御座います。
変更点は以下の通りです。(1)CS+でRX72Mの新規プロジェクトを作成(2)スマート・コンフィグレータで必要なFITモジュールを追加(3)r_datfrx_rx_main.cを追加(4)r_flash_rx_config.hの「#define FLASH_CFG_DATA_FLASH_BGO (0)」を「#define FLASH_CFG_DATA_FLASH_BGO (1)」に変更(5)r_datfrx_rx_config.hの「#define FLASH_DM_CFG_DF_SIZE_NO0 (1)」を「#define FLASH_DM_CFG_DF_SIZE_NO0 (***)」に変更(6)r_datfrx_rx_config.hの「#define FLASH_DM_CFG_DF_SIZE_NO1 (1)」を「#define FLASH_DM_CFG_DF_SIZE_NO1 (***)」に変更(7)r_datfrx_rx_main.cの「#define TEST_BUFF_NUM (256)」を「#define TEST_BUFF_NUM (***)」に変更思考錯誤しながら、現状は以上の状態です。
下記の値は今のところ(1)しか確認できていません...。値の確認方法を調べていますが...、経験が浅く、すみません。なんとか確認したいと思います。(1) g_flash_dm_handle->erase_block_num = 1(2) free(3) p_flash_dm_info->data_no(4) gc_dm_data_size[p_flash_dm_info->data_no]
Giggsさん、こんにちは。NoMaYです。すみません、最近のかふぇルネの投稿システムにはバグがあるらしくて、数値が伏字になってしまうことがあります。今回も頂いたリプライの一部が伏字になってしまっていました。(5)~(7)の数値を教えて頂けませんか?また、以下は、ひょっとして、コンパイラの最適化を掛けたままデバッグしていませんか?そうだとしたら、最適化を無しに変更してビルドし直してデバッグしてみて下さい。> 下記の値は今のところ(1)しか確認できていません...。> 値の確認方法を調べていますが...、経験が浅く、すみません。なんとか確認したいと思います。
本当だ。***になってますね...。(5)~(7)はの値は全て「***」です。
コンパイラの最適化の設定なんですね。最適化レベルを0にしたら値が出ました!
データ番号0のとき(1) g_flash_dm_handle->erase_block_num = 3(2) free = 94(3) p_flash_dm_info->data_no = 0(4) gc_dm_data_size[p_flash_dm_info->data_no] = ***
データ番号1のとき(1) g_flash_dm_handle->erase_block_num = 1(2) free = -12(3) p_flash_dm_info->data_no = 1(4) gc_dm_data_size[p_flash_dm_info->data_no] = ***
g_flash_dm_handle->erase_block_numを遡ってみたりしていますが、イマイチわかりません...。
またですね...。
***は全て64です。