RX71M StarterKit を使用してフラシュアクセスのデモ(flash_demo_rskrx64m)をテストしています。
デモ単体では動作確認できたのですが、CMT(r_cmt_rx)を組み込んでLEDを点灯させようとしました。
フラシュのデモは動作して、CMTのLED点灯だけでも動作しましたが、両方を同時に実行したらフラッシュのアクセス時に停止してしまいました。
(たぶん、CMTの割り込みでハングした)
RXのフラッシュ・アプリケーションノートによると、FRDYI割り込み(ベクタ23)を使用しているとの事で、
デモプログラムでは
static void flash_copy_vector_table(void){ uint32_t *pvect_table;
pvect_table = (uint32_t *)__sectop("C$VECT"); ram_vector_table[23] = pvect_table[23]; set_intb((void *)ram_vector_table);}
と在ったので、23以外(0~255)もコピーするようにしました。(CMTの割り込みベクタもコピー??)
ベクタテーブルのコピーだけではだめで、
さらに、フラッシュにアクセス(R_FLASH_Open)する前に R_CMT_Stop(cmt_hdl); を使用してCMTを停止しないと
フラッシュのEraseで停止する。(停止して、フラッシュアクセス終了で R_CMT_Control(cmt_hdl,CMT_RX_CMD_RESTART,0); でリスタートで問題なし)
フラッシュアクセスとCMT動作は何か関連があるのでしょうか?
フラッシュアクセス時はCMTを停止する必要がある? (とは思えないので)、
割り込みベクタ関連でコピー以外に何か必要な事があるのでしょうか?
r_flash_fcu.c にある
R_BSP_PRAGMA_STATIC_INTERRUPT(Excep_FCU_FRDYI,VECT(FCU,FRDYI))FLASH_PE_MODE_SECTIONR_BSP_ATTRIB_STATIC_INTERRUPT void Excep_FCU_FRDYI(void){
が関係しているのかな?とは思うのですが、R_BSP_PRAGMA_STATIC_INTERRUPT(Excep_FCU_FRDYI,VECT(FCU,FRDYI)) が
何をしているのか理解できていません。これは一体何を示しているのでしょうか?
よろしくお願いいたします。
ka.makiharaさん、こんにちは。NoMaYです。> R_BSP_PRAGMA_STATIC_INTERRUPT(Excep_FCU_FRDYI,VECT(FCU,FRDYI)) が> 何をしているのか理解できていません。これは一体何を示しているのでしょうか?私が昔提案した、CC-RX/GNURX/ICCRXの3種類のコンパイラに対応したソースを記述する為のマクロを使ったものですね。CC-RXでは以下のように展開されたと思います。(他のコンパイラでは他のコンパイラ用の記述に展開されます。)#pragma interrupt Excep_FCU_FRDYI(VECT(FCU,FRDYI))> フラッシュアクセスとCMT動作は何か関連があるのでしょうか?> フラッシュアクセス時はCMTを停止する必要がある? (とは思えないので)、関係あります。コードフラッシュ書き換え中は、書き換える領域以外の部分であっても、フラッシュメモリからコード/データをフェッチ/リードすることが出来ません。ですので、この場合の言わばセオリー的に気になりますことは、以下の点です。(1) 割り込み処理コードがRAM上で実行されるようになっていますか?(今回はCMT割り込みです)(2) この時、割り込み関数だけでなく、以下の点にも気を配る必要があります(2-1) 割り込み関数から呼ばれているサブルーチンも全てRAMに配置されていますか?(2-2) 加えて、もしコンパイラがランタイムライブラリを呼び出していたら、それもRAMに配置する必要があります(3) データに関しても気を配る必要があります(3-1) 割り込み処理内でconstデータをリードしようとしていませんか?(3-2) 加えて、コンパイラが生成したコードでswitch文のジャンプテーブルがフラッシュメモリに配置されている場合もありますこのあたりはどうでしょうか?
ありがとうございます。
今回はCMT割り込みがRAM上ではありませんでした。
RXフラッシュモジュール・アプリケーションノート
2.16.2 コードフラッシュメモリから・・・を読んだ時にRX71M(タイプ3)なので
自分が動作している領域、CMT割り込みが動作している領域以外であれば書き換え可能と考えてしまいました。
複数の領域というのが、r_flash_rx71m.h にあるBLOCKで表された単位(32kB)と考えてしまったのですが、71Mでのフラッシュの複数の領域、というのはどのような領域となるのでしょうか?
ka.makiharaさん、こんにちは。NoMaYです。これは、私としてはデュアルバンク機能の機能として認識していた、以下のRX72Mのハードウェアマニュアルに記載の話かな、と思いました。(もっとも、私の理解の仕方がまずくて、リニアモードとデュアルバンクモードは別のモードなので、FITモジュールのドキュメントのように、16.12.2と16.12.3のように節が分かれるのが本来かも知れません。)「64.17.2 BGO 機能BGO 機能とは、コードフラッシュメモリ上の書き換えプログラムで、データフラッシュメモリや他の領域のコードフラッシュメモリを書き換えられる機能です。書き換え対象のフラッシュメモリとリード対象のフラッシュメモリが下記の組み合わせである場合には、BGO 機能を利用することができます。表64.25 BGO機能を利用可能な条件」[関連リンク]RXファミリ フラッシュモジュール Firmware Integration TechnologyR01AN2184JJ0480 Rev.4.80 Pags 106 Apr.23.21www.renesas.com/jp/ja/document/apn/rx-family-flash-module-using-firmware-integration-technologyRX72Mグループ ユーザーズマニュアル ハードウェア編Rev.1.11 2021.02www.renesas.com/jp/ja/document/mah/rx72m-group-users-manual-hardware
ka.makiharaさん、こんにちは。NoMaYです。ごめんなさい、こちらはRX71Mでしたね。(別スレッドにてRX72Mの話があって、混同してしまいました。) でも、RX71Mでも、同じ話だと考えています。
RX71Mスターターキットを使用しているので、フラッシュは4M、ということは
前半2M,後半2M になり、書き換えプログラムが前半2Mで動作しているのなら
後半2Mの領域は書き換え可能ということで、BLOCK_69(0xFFE00000)、後半の先頭を
Erase,Writeできる事を確認しました。
ただ、今回FLASH_CFG_CODE_FLASH_RUN_FROM_ROM=1でテストしており、
*GBOはいずれも0にしています。
RX ファミリ・フラッシュモジュール、アプリケーションノートには
「2.4 使用する割り込みベクタ」で、*BGOが1の時割り込みが有効になります。とあるので
サンプルにありました、ベクタテーブルのコピー(C$VECT)を実行しないようにしましたが、
R_FLASH_Open() ->flash_lock_state() で停止してしまいました。
アセンブラで見てみると
のように、プログラムコードが無い状態でした。
消去したベクタテーブルのコピーを実施すると、
flash_lock_state() にはプログラムコードが書かれており、
一体誰がコピー(?)したのかわかりません。
他にも割り込みが動作していて、そちらでコピーが走っているのでしょうか?
申し訳ありません。添付する画像を間違えました。
中身が無いものはこちらでした。