RX66N + RI600V4 環境で r_fwup によるセルフアップデートは可能?

こんにちは、よしとです。

r_fwup 1.06 がサポートしている環境には RI600V4 が動作しているシステムは含まれていないと思います。

しかし、RX66N + RI600V4 のシステムで何とかセルフアップデートを実現したいと考えており、RI600V4 に対して何らかの処置をすれば動作できるのではないかと考えていろいろと試しています。
やりたいことは、ユーザコマンドを処理するタスクでファームウェアアップデートコマンドを認識したら、SCI経由のファームアップ機能を起動してファームのセルフアップデートをDUAL modeで行うという事です。

これを実現しようとして色々やってみているのですが、r_flash_fcu.c 内の Excep_FCU_FRDYI() から flash_ready_isr_handler() を呼んでいる部分までは走っていることが追跡できるのですが、その後 _RI_sys_dwn() に捕まってしまいます。
_RI_sys_dwn() 内でパラメータを確認したところ、type=-1, inf1=-25, inf2=3, inf3=213440(不定値)となっており、「カーネル管理割り込みハンドラ終了時点で,PSW.IPL >カーネル割り込みマスクレベルである。」というエラーで捕まったものと思われます。
PSW.IPL をレジスターウィンドウで確認したところ、0 でした。

この状況はファームアップを開始する直前に dis_dsp() をコールしてみたり loc_cpu() をコールしてみたりしても同様でした。

アップデートを開始する前にRTOSに対して何か処理をすれば回避できるものでしょうか。

何かお分かりになる方がいらっしゃいましたらご教授頂けましたら幸いです。

以上、よろしくお願いいたします。

  • よしと さん、こんにちは。NoMaYです。

    以下の部分の話の流れが整合していないように思いました。変じゃないですか?PSW.IPL = 15 だった、なら分かりますが。

    「カーネル管理割り込みハンドラ終了時点で,PSW.IPL >カーネル割り込みマスクレベルである。」というエラーで捕まったものと思われます。
    ↓↑
    PSW.IPL をレジスターウィンドウで確認したところ、0 でした。



    それはそれとして、どうするかですよね。FITモジュールには、ちょこちょこ、RI600V4対応が追加されたりすることがあるのですけれども、 r_fwupモジュールは、まだなのですかね、、、(でも、そういう話でも無さそうなのかな、、、)

    [メモ]

    すみません、置かせて下さい。

    ・ 以前に質問された案件

    RX66N ファームアップでバンクスワップ動作しない
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/10166/rx66n

    ・ デュアルモード書き換えなのだから、例えば、以下のスレッドのRAM実行の件さえ気をつければ、割り込みはOKの筈である

    デュアルバンク機能時の割り込み処理について
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/10101/thread

    ・ E1/E2Liteでも可能なオンチップデバッグトレース機能で _RI_sys_dwn() に捕まるまでの過程を追うことは出来ないだろうか

    ・ RI600V4にソフトウェア的なトレース機能ってなかったのだったっけ

    ・ ひょっとして、RI600V4 のソースライセンスは持っていない、のかも(ソース無しでも、本件を追うことは、出来るのかなぁ)

    ・ ごく単純に以下のようなことをしてみるとどうなるだろうか(r_fwupモジュールは使わない)

     RI600V4がヘビーに動作するような人為的な、負荷を掛けるプログラム、のようなものを作成する
     デュアルバンクの片面の全域を、消して、0x55を書いて、消して、0xAAを書いて、するようなものを作成する
     両者を同時に動かして、不具合が再現したら、まずそこを何とかしてみる

    ・ RI600V4ってRTOSを止めるシステムコールは無いのかな

    ・ ↓開始時点で捕まえることは出来ないのかな。(それとも捕まえる機構はちゃんとあり、でも開始時点では問題無し?)

    「カーネル管理割り込みハンドラ終了時点で,PSW.IPL >カーネル割り込みマスクレベルである。」というエラーで捕まったものと思われます。

    ・ カーネルに登録してはいけない、高優先順位の割り込みをうっかり登録してしまっていたり、とかの可能性はどうだろうか

    ・ 暗号処理とか割り込みって使っているのかな

    ・ _RI_sys_dwn() のドキュメントはどこだろう

    [追記]

    top > RI600V4環境 > コーディング編 > システム・ダウン
    第13章  システム・ダウン
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.09.00/CS+.chm/Coding-RI600V4.chm/Output/SYSDOWN.html
     

  • よしと さん、こんにちは。NoMaYです。

    RI600V4の使用経験はどれくらいでしょうか?ベテラン級でしょうか?それとも、今回が初めてだったりするのでしょうか?

    CS+のシステム・ダウンのオンラインヘルプを見て思ったのですけれど、ひとまず以下はどうなっていますでしょうか?

    (1) カーネル割り込みマスクレベルの値は幾つでしょうか?
    (2) そのレベル以上の優先順位の割り込みをカーネルに登録していたりしませんでしょうか?
    (3) カーネルに登録済みの割り込みの割り込み優先順位を全て書き出すとどうなっていますでしょうか?

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

    そういえば、そもそも、RI600V4とFITの個別モジュールって共存出来るのでしたでしょうか?FITのBSPモジュールは使えるようになっていたと思うのですが(それとCMTモジュールも?)、FreeRTOSやAzure RTOSの場合とは異なり、皆さん、割り込みハンドラをゴリゴリ手書きしているのでは無かったでしょうか?

    [追記]

    ついこのあいだ、以下のスレッドでガヤガヤやっていたばかりなのですけれども、RI600V4とFITの個別モジュールとが共存出来るのであれば、もうちょっと話は素朴だった筈である様な気がしなくも無いのですけれども。

    MISPOさんのNORTiをRX SmartConfiguratorと一緒に使いたい場合の課題と対策を考察してみるスレッド
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/8266/mispo-norti-rx-smartconfigurator

    [追記]

    以下のFAQでは何も触れられていませんでしたが、FITの割り込みを全てカーネル管理割り込みとして使うという使い方なら出来るのかな。(つまり割り込みルーチンからシステムコールを絶対に発行しないように運用するということになるのかな。)

    FAQ 2001203 : FITモジュールとRTOSを組み合わせて使用したい
    ja-support.renesas.com/knowledgeBase/20117077
     

  • NoMaYさん、こんにちは、コメントありがとうございます。

    書くのを忘れたようですが、PSW.IPL の値を確認したのは _RI_sys_dwn() の無限ループに落ちている状態でしたので、トラップされたときから既にエラー処理の途中で変更されていたのではないかと考えていました。

    RI600V4のソースライセンスは持っていません。

    > RI600V4の使用経験はどれくらいでしょうか?ベテラン級でしょうか?それとも、今回が初めてだったりするのでしょうか?

    RX66N も RI600V4 も今回のプロジェクトが初めてで、RTOSを使ったシステムの開発経験はそれなりに有りますが、このシステムに関しては初心者です。

    > (1) カーネル割り込みマスクレベルの値は幾つでしょうか?

    カーネルのマスクレベルは7で使っています。

    > (2) そのレベル以上の優先順位の割り込みをカーネルに登録していたりしませんでしょうか?

    カーネル管理外の割り込み(優先順位 > 7)は使っていますが、全てシステムコールを使わないものです。

    > (3) カーネルに登録済みの割り込みの割り込み優先順位を全て書き出すとどうなっていますでしょうか?

    「カーネルに登録済みの割り込み」は何をお答えすればよろしいでしょうか。

     

    > そういえば、そもそも、RI600V4とFITの個別モジュールって共存出来るのでしたでしょうか?FITのBSPモジュール は使えるようになっていたと思うのですが(それとCMTモジュールも?)、FreeRTOSやAzure RTOSの場合とは異なり、皆さん、割り込みハンドラをゴリゴリ手書きしているのでは無かったでしょうか?

    RI600V4 と 各種FITモジュールが共存したシステムで正常に動作していますが、そういうことを仰っているのではないのでしょうか。

    中途半端なお答えで申し訳ありません。

    以上、よろしくお願いいたします。

  • よしと さん、こんにちは。NoMaYです。

    > > (3) カーネルに登録済みの割り込みの割り込み優先順位を全て書き出すとどうなっていますでしょうか?
    > 「カーネルに登録済みの割り込み」は何をお答えすればよろしいでしょうか。

    CS+のオンラインヘルプで、以下の静的APIで「カーネル管理割り込み」として登録(すみません、定義、とした方が良かったですかね)した割り込みのこと、を指したつもりでした。実は、私は、かふぇルネで今までに何度かμITRON系RTOSの質問に返事をしていますが、業務でゴリゴリ使ったことは無く、それどころか、ほとんど触ったことが無いです。(さらには、このかふぇルネで何度も何度もリプライしていますが、ガチの組み込みシステムを開発した経験も殆ど無いです。ただ、ヘルプなり、ユーザーズマニュアルなりを、その都度調べてみていますが、多くの問題の解決のお手伝いは出来ていたようです。)

    top > RI600V4環境 > コーディング編 > システム・コンフィギュレーション・ファイル > 可変ベクタ情報(interrupt_vector[])
    19.18 可変ベクタ情報(interrupt_vector[])
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.09.00/CS+.chm/Coding-RI600V4.chm/Output/cf_DEF_INH.html

    19.18 可変ベクタ情報(interrupt_vector[])

    ここでは,RX MCUの可変ベクタに設定する割り込みハンドラを定義します。
    未定義の割り込みが発生した場合は,システム・ダウンとなります。


    3 ) カーネル管理割り込みの指定(os_int)

    - 説明
    この割り込みがカーネル管理割り込みかどうかを定義します。
    カーネル割り込みマスクレベル(system_IPL)以下の割り込み優先レベルの割り込みはカーネル管理割り込み,それ以外の割り込みはカーネル管理外割り込みとして定義する必要があります。
    なお,カーネル割り込みマスクレベル(system_IPL)が15の場合は,すべての可変ベクタ割り込みはカーネル管理割り込みとする必要があります。

    - 定義形式
    シンボル

    - 定義範囲
    以下のいずれか。
    YES: カーネル管理割り込み
    NO: カーネル管理外割り込み

    - 省略時の扱い
    省略不可


  • NoMaYさん、こんにちは。 よしとです。

    コメントありがとうございます。

    調べてみましたところ、下記の様に Excep_FCU_FRDYI() がOS管理割り込みとして登録されていました。(Excep_FCU_FIFERR() も同じく)

    interrupt_vector[23]{

        os_int = YES;
        entry_address = Excep_FCU_FRDYI();
        pragma_switch = E,ACC;
    };

    os_int = NO; として走らせてみた所、Excep_FCU_FRDYI() から抜ける時に _RI_sys_dwn__() に捕まらなくなったようです。 これでやりたいことができるのかどうかは判然としませんが、少なくともデバッグを続けられる状態になったような気がしますので、検討してみたいと思います。

    また何かわからないことが有りましたら質問させていただくかもしれませんが、よろしくお願いいたします。

    アドバイスありがとうございました。

  • よしと さん、こんにちは。NoMaYです。

    すみません、逆に私からお聞きしたいことがあります。くだんの静的APIで entry_address = Excep_FCU_FRDYI(); と書ける、ということは、どこに記載があったのですか?それとも、御自身であれこれ調べて辿り付いたことでしょうか?実は、古い知識ですと、Excep_FCU_FRDYI() は static関数 であり、FITのr_flash_rxモジュールの本関数が記述されているソース以外からは参照出来ないものだった筈なのです。

    実は、昨夜、以下でグーグル検索を試みていたのですけれども、まったくパッとしない!、そんな検索結果だったので私は辿り付けなかったのでした。

    Google検索: RI600V4 FIT
    https://www.google.com/search?q=RI600V4+FIT
     

  • NoMaY さん、こんにちは。 よしとです。

    件の記述は同僚が作ったフレームワークプロジェクトから引き継いだもので、今作った本人に確認のメールを投げていますが、多分 Smart Configraor for RX が吐き出したものだと思います。

    なお、Excep_FCU_FRDYI() の定義は R_BSP_ATTRIB_STATIC_INTERRUPT void Excep_FCU_FRDYI(void); ですが、r_rx_compiler.h ファイルに R_BSP_ATTRIB_STATIC_INTERRUPT を RI600V4 または RI600PX 環境の場合はブランクに定義する #define が存在しています。 それ以外の環境では R_BSP_ATTRIB_STATIC_INTERRUPT は static に defineされているので  Excep_FCU_FRDYI() は static 関数となりますが、RI600V4 環境では static 関数ではなくなります。

    以上、よろしくお願いいたします。

  • NoMaY さん

    すみません、Smart Configrator for RX ではなく、多分、RI600V4 の GUI Configrator_e2 が吐いたものですね。

    同プロジェクトの RI600V4 の GUI Configrator_e2 の定義ファイルに記述が有りました。

  • NoMaY さん、こんにちは。

    フレームワークを作った本人から以下の回答が有りました。

    【回答の内容:要約】

    ドキュメントにはベクタ情報しか記載されておらず、コードを調べて関数名を特定して手動で RI600V4 の GUI Configurator_e2 に記述した。

    立ち上げ当初、Smart Configurator で設定し生成されたコードだけでは動作せず、各Driverの割り込みベクタが生成されていないことに気づき、一つ一つDriverの割り込み関数を調査し設定した。 とのことでした。

    Excep_FCU_FRDYI() の関数名はルネサスのサイトで検索しても記載してあるドキュメントは見つかりませんでした。

    努力が必要なようですね。(^^;  改善されると良いのですが・・・

    以上、よろしくお願いいたします。