FreeRTOSとr_t4_rxを使用した際のビルドエラーについて(RX72N)

お世話になります。

FreeRTOS(kernel Only)でM3S-T4-Tinyを追加した際に発生したエラーの改善方法が分からず、投稿いたしました。

開発環境は下記になります

  • 統合開発環境:e2studio, 2022-04 (22.4.0)
  • スマートコンフィグレータ:2.13.0
  • 使用ボード:RX72N envition Kit
  • コンパイラ:GCC for Renesas RX 8.3.0.202202、GCC for Renesas RX 4.8.4.201803
  • RTOS:FreeRTOS(kernel only),10.4.3-4x-1.0.4
  • r_t4_rx :v2.10
  • r_bsp::v7,1

FreeRTOS(kernel only)でプロジェクトを新規作成後、スマートコンフィグレータにてT4 FITモジュールであるr_t4_rxを追加し、コード生成後にビルドを行ったところ、エラーが発生します。

エラー文章はGCC for Renesas RX 8.3.0.202202を使用した場合、r_t4_rx.cの883行目でundifined reference to 'get_psw'となります。smc_gen->r_basp->mcu->all->r_rx_intrinsic_functions.hの261行目あたりにR_BSP_GET_PSWの宣言があるのですが、get_pswはCCRXで宣言されているので何か設定ミスでしょうか?

また、アプリケーションノート(R20AN0051JJ0210 Rev.2.10)の1.6制限事項よりバージョンを4.8.4.201803に変更しましたが、別のエラーとして ^target CPU dose not support this instructionが複数発生します。

行ったこととしては、コード生成後に

  • r_t4_driver.cの80行目を#include "FreeRTOS_usr_cfg.h"から#include "FreeRTOSConfig.h"に変更。
  • イーサネットモジュールのアプリケーションノート(R01AN2009JJ0123 Rev1.23)の5.1.1を参考にlinker_script.Idを修正してセクションを配置。
  • t4FTIモジュールのアプリケーションノート(R20AN0051JJ0210 Rev.2.10)の5.6.3を参考にT4ライブラリのリンクを設定。

をしています。(RTOSなしでプロジェクトを作成し、同じ設定をするとエラーが発生しません。)

サイズの都合で実際のプログラムがあげられず申し訳ないのですが、解決方法がありましたらお願いいたします。

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

    私は、今回の最新版は、GCCとIAR EWBでテストせずにリリースされた、のだと思うのです。(少なくとも以下のコードが追加された以降は、です。自分の経験では、土壇場で問題が見付かってFixして安心していたら、実は別の大問題を引き起こしていた、みたいなのがありますが、その可能性が気になります、、、)

    以下のコードですよね。そのような経緯だったのかも、と推測されれば、後は、既に気付いておられるであろう関数の置き換え(というかマクロへの置き換え)を行えば良いと思うのです。

    src/smc_gen/r_t4_driver_rx/src/t4_driver.c

    #if   (BSP_CFG_RTOS_USED >= 1)


    /*
     * wake-up task by id/handle
     */
    static ER rtos_wup_tsk(uint32_t tid)
    {
    #if   BSP_CFG_RTOS_USED == 1    // FreeRTOS
        if(0 == tid)
        {
            return E_ID;
        }
        if(0 == (get_psw() & 0x20000))
        {
            xTaskResumeFromISR((TaskHandle_t) tid);
        }
        else
        {
            vTaskResume((TaskHandle_t) tid);
        }
        return E_OK;

    #elif BSP_CFG_RTOS_USED == 4    // Renesas RI600V4 & RI600PX
        ER ret;

        if(0 == tid)
        {
            return E_ID;
        }
        if(TRUE == sns_ctx())
        {
            return iwup_tsk((ID) tid);
        }
        else
        {
            ret = wup_tsk((ID) tid);
            if(ret == E_OK)
            {
                return rot_rdq(TPRI_SELF);  /* dispatch task to user tcp/udp */
            }
            else
            {
                return ret;
            }
        }
    #else
        return E_OK;  /* nothing to do */
    #endif
    }

    #endif /* #if   (BSP_CFG_RTOS_USED >= 1) */

     
    [追記]

    あと、以下がコンパイルエラーになるのにドキュメントに記載が無いのも、ただならぬ事態があったのではないかなぁ、という気がします、、、

    src/smc_gen/r_t4_driver_rx/src/t4_driver.c

    #if   BSP_CFG_RTOS_USED == 0    // Non-OS
    #elif BSP_CFG_RTOS_USED == 1    // FreeRTOS
    #include "FreeRTOS_usr_cfg.h"
    #elif BSP_CFG_RTOS_USED == 2    // SEGGER embOS
    #elif BSP_CFG_RTOS_USED == 3    // Micrium MicroC/OS
    #elif BSP_CFG_RTOS_USED == 4    // Renesas RI600V4 & RI600PX
    #include "kernel.h"
    #include "kernel_id.h"
    #else
    #error "no valid rtos definition"
    #endif

     
    [追記]

    変更履歴を見ると、今回の最新版では、といっても、それなりに時間が経っていますね、、、

    src/smc_gen/r_t4_driver_rx/src/t4_driver.c

    /******************************************************************************
    * History       : DD.MM.YYYY Version Description
    *               : 15.01.2011 ---   First Release.

    *               : 20.06.2019 ----   Added support GCC RX compiler and IAR RX compiler .
    *               : 29.01.2021 ----   Updated operation of random number generator.
    *                                   Added hash value generation function.
    ******************************************************************************/

     

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

    リプライと解決案、ありがとうございます。

    原因が分からなかったのですが、そういった可能性もあることを念頭に置いておきます。また今回T4ではGCC自体サポートされていないバージョンというのもあるので、CC-RXの購入も検討してみようかと思います。

    ビルドエラー(undifined reference to 'get_psw')については、NoMoYさんのおっしゃるように関数の置き換えで解決しました。ただの置き換えでも同様にundifined referenceのエラーが出るため、

    src/smc_gen/r_bsp/mcu/all/r_rx_intrinsic_functions.hのPSWのdefine宣言終了(endif)後に

    #define R_BSP_GET_PSW() (unsigned long)__builtin_rx_mvfc(0x0)

    を追加したところ、ビルドが通りました。ありがとうございます。

    src/smc_gen/r_t4_driver_rx/src/t4_driver.cの”FreeRTOS_usr_cfg.h”について、記載がなかったので少し戸惑った部分ではあります…。(検索したら過去の投稿にあったので助かりました。)

    ありがとうございます。

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

    > ただの置き換えでも同様にundifined referenceのエラーが出るため、
    > src/smc_gen/r_bsp/mcu/all/r_rx_intrinsic_functions.hのPSWのdefine宣言終了(endif)後に
    > #define R_BSP_GET_PSW() (unsigned long)__builtin_rx_mvfc(0x0)
    > を追加したところ、ビルドが通りました。ありがとうございます。

    これは以下のソースの赤文字の行を追加しないとundifined referenceのエラーになってしまったということですよね。それは想定外でした。こちらで試しに作ってみたプロジェクトでは、ただの置き換えでも、エラーは出ませんでした。

    > また、アプリケーションノート(R20AN0051JJ0210 Rev.2.10)の1.6制限事項よりバージョンを4.8.4.201803に変更しましたが、
    > 別のエラーとして ^target CPU dose not support this instructionが複数発生します。

    最後に頂いたものでは上の件に言及されていないところから察すると、GCC for Renesas RX 8.3.0.202202 でしょうか。(もし GCC for Renesas RX 4.8.4.201803 のことだったとしても同じく想定外であることには変わり無いですけれども。)

    すみません、勝手な推測ですけれども、R_BSP_GET_PSWの2重定義ワーニングとか出ていないでしょうか?(そういえば、e2 studio?(そもそもはGCCに由来する?)の初期設定ではワーニングレベルが最弱(ワーニング無し?)になっていますので、コンパイラのワーニング設定を強くしてみて下さい。) 最初に質問/相談を投稿された時より以前に何か試されていたコードが残っていて影響していないだろうか?とか気になります。

    もしくは、たまに遭遇する、「今日試してみたら、そうしなくてもビルド出来てしまった」という案件だったりするかも知れません。

    src/smc_gen/r_bsp/mcu/all/r_rx_intrinsic_functions.h

    /* ---------- Processor status word (PSW) ---------- */
    #if defined(__CCRX__)

    /* void set_psw(unsigned long data) */
    #define R_BSP_SET_PSW(x)    set_psw((unsigned long)(x))
    /* unsigned long get_psw(void) */
    #define R_BSP_GET_PSW()     get_psw()

    #elif defined(__GNUC__)

    /* void __builtin_rx_mvtc (int reg, int val) */
    #define R_BSP_SET_PSW(x)    __builtin_rx_mvtc(0x0, (int)(x))
    /* int __builtin_rx_mvfc (int) */
    #define R_BSP_GET_PSW()     (unsigned long)__builtin_rx_mvfc(0x0)

    #elif defined(__ICCRX__)

    /* void __set_PSW_register(unsigned long) */
    #define R_BSP_SET_PSW(x)    __set_PSW_register((unsigned long)(x))
    /* unsigned long __get_PSW_register(void) */
    #define R_BSP_GET_PSW()     __get_PSW_register()

    #endif

    #define R_BSP_GET_PSW() (unsigned long)__builtin_rx_mvfc(0x0)

     

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

    NoMaYさんの記述の通り、src/smc_gen/r_bsp/mcu/all/r_rx_intrinsic_functions.hにて赤字の部分を追加しました。このときのコンパイラはGCC for RenesasRX 8.3.0.202202 になります。

    先ほど赤字部分をコメントアウトし、"プロジェクトをクリーン→プロジェクトのビルド"を行ったところビルドが通りました…。(ワーニングレベルや使用コンパイラの変更はありません。)__builtin_rx_mvfcをt4_driver.cに変更した際、引数指定のエラーがでていたのでそちらをundefinedと見間違えた可能性があるかもしれません…エラー文で引数指定のミスに気付いたのであまり考えられませんが…。

    ワーニングに関しては、エラー発生時に確認をしていなかったのでわかりませんが、ビルドが通った際に2重定義に関するワーニングはありませんでした。

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

    そちらの案件に該当していましたか、、、ところで脱線しますけれども、T4のドキュメントの以下の制限事項ですが、エラーは発生するのでしょうか?こちらで試しに作ってみたプロジェクトでe2 studioで検索してみても干渉しそうに無いのですが、そちらで作られているような実際的なプロジェクトではエラーになるのでしょうか?

    RXファミリ 組み込み用TCP/IP M3S-T4-Tiny 導入ガイド Firmware Integration Technology
    R20AN0051JJ0210 Rev.2.10 Pages 46 Apr.01.21

    制限事項

    GCC for Renesas RX に関して、T4 は GCC for Renesas RX 4.8.4.201803 以前のバージョンのみサポートします。これより後の GCC バージョンは”in_addr_t”型が追加されており、T4 との間で型の二重定義によるビルドエラーが発生するため、使用できません。


    以下、e2 studioとT4のドキュメントの画面コピーです。




     

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

    そちらの案件に該当していましたか、、、ところで脱線しますけれども、T4のドキュメントの以下の制限事項ですが、エラーは発生するのでしょうか?こちらで試しに作ってみたプロジェクトでe2 studioで検索してみても干渉しそうに無いのですが、そちらで作られているような実際的なプロジェクトではエラーになるのでしょうか?

    RXファミリ 組み込み用TCP/IP M3S-T4-Tiny 導入ガイド Firmware Integration Technology
    R20AN0051JJ0210 Rev.2.10 Pages 46 Apr.01.21

    制限事項

    GCC for Renesas RX に関して、T4 は GCC for Renesas RX 4.8.4.201803 以前のバージョンのみサポートします。これより後の GCC バージョンは”in_addr_t”型が追加されており、T4 との間で型の二重定義によるビルドエラーが発生するため、使用できません。


    以下、e2 studioとT4のドキュメントの画面コピーです。




     

Children
  • NoMaYさん。Togashiです。

    返信が大幅に遅れ、大変申し訳ございません。

    T4のドキュメントに関する制限事項(int_addr_t型)についてのエラーですが、これまで発生したことはありません。まだこちらも導入程度の段階ですので、あまり参考にならずに申し訳ないですが…

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

    リプライありがとうございました。