Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

GUNRX用プロジェクトとCC-RX用プロジェクトでスマートコンフィグレータの生成コードを比較してみた

こんにちは。NoMaYです。

GUNRX用プロジェクトではBSPモジュール以外のFITモジュールは(少なくとも現時点では)サポートされていないようですので、コード生成機能によるコンポーネントを比較してみました。(今回もRX65Nです。) 比較結果は以下の通りでした。(BSPモジュールについては後で投稿します。)

CC-RX用プロジェクトにしかないソース

・コード生成機能によるコンポーネントでは無し(BSPモジュールでは有り)

GUNRX用プロジェクトにしかないソース

・r_cg_vector_table.c
・r_cg_interrupt_handlers.h

両方に有って差異が有るソース

・r_smc_interrupt.h
・r_smc_interrupt.c (高速割り込み使用時のみ差異が出る)
・Config_XXXX_user.c (例えばConfig_CMTW0_user.cなど)
・Config_DTC.c (DTC使用時のみ差異が出る)
・r_cg_macrodriver.h

両方に有って差異が無いソース

・多数

違いは以下の理由によって生じていました。

・割り込み関数であることを記述する方法がCC-RXとGNURXで異なる
・昔?は割り込みベクタ指定がCC-RXでは出来たがGNURXでは出来なかった? (今はGNURXでも出来るが記述方法は異なる)
・変数を割り付けるアドレスをソース上で指定する記述がCC-RXでは出来るがGNURXでは出来ない (DTCコンポーネントで差異)
・nop()やbrk()やwait()の組み込み関数の有無(や表記)が異なる (GNURXプロジェクトではr_cg_macrodriver.hで違いを吸収)
・machine.hという上記の組み込み関数などが記述されたコンパイラヘッダファイルがCC-RXには有るがGNURXには無い (同上)

ちなみに、CC-RXとGNURXの違いがもっと広い範囲まで述べられている以下のウェブページがありました。

gcc-renesas.com/migration-guides/rx/index.html#Compiler_directives
(参) gcc.gnu.org/onlinedocs/gcc/RX-Function-Attributes.html
(追記) gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes
(追記) gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

gcc-renesas.com/migration-guides/rx/index.html#Intrinsic_Functions
(参) gcc.gnu.org/onlinedocs/gcc/RX-Built-in-Functions.html

以下、比較した時の画面コピーです。

比較結果一覧

途中省略


割り込み関連の差異





高速割り込み使用時に出る差異



DTC使用時に出る差異


machine.hおよびnop()やbrk()やwait()についてはr_cg_macrodriver.hで違いを吸収


高速割り込みを指定した時の設定


DTCを指定した時の設定


コード生成させてみたコンポーネントの一覧

途中省略(CC-RXのみ可能なFITモジュールの選択)


ちゃんと設定していないのでコード生成時に警告が表示されるが今回はそのまま生成


  • こんにちは。NoMaYです。

    前の投稿から随分と時間が経ってしまったのですが、今度はBSPモジュールについて比較してみました。

    CC-RX用プロジェクトにしかないソース

    ・dbsct.c

    GUNRX用プロジェクトにしかないソース

    ・reset_program.asm

    両方に有って差異が有るソース

    ・lowlvl.c
    ・r_bsp_config_reference.h (ヘッダファイルテンプレートなので気にしなくて良い)
    ・resetprg.c
    ・vecttbl.c
    ・r_bsp_common.c
    ・r_bsp_common.h
    ・r_typedefs.h
    ・cpu.c
    ・locking.c
    ・mcu_interrupts.c
    ・iodefine.h

    両方に有って差異が無いソース

    ・残り半分ほど

    違いは以下の理由によって生じていました。

    ・スタートアップルーチンの記述の流儀がCC-RX(ルネサス純正コンパイラ)とGNURX(GCC)で異なる
    ・割り込み関数であることを記述する方法がCC-RXとGNURXで異なる
    ・変数を割り付けるアドレスをソース上で指定する記述がCC-RXでは出来るがGNURXでは出来ない
    ・変数を割り付けるセクションを記述する方法がCC-RXとGNURXで異なる
    ・インライン関数やインラインアセンブラを記述する方法がCC-RXとGNURXで異なる
    ・nop()やclrpsw()やsetpsw()といった組み込み関数の有無(や表記)が異なる
    ・machine.hという上記の組み込み関数などが記述されたコンパイラヘッダファイルがCC-RXには有るがGNURXには無い
    ・__evenaccessという型修飾子(?)がCC-RXでは使えるがGNURXでは使えない
    ・その他

    以下、比較した時の画面コピーです。

    比較結果一覧


    スタートアップルーチンの記述の流儀がCC-RX(ルネサス純正コンパイラ)とGNURX(GCC)で異なる




    割り込み関数であることを記述する方法がCC-RXとGNURXで異なる



    変数を割り付けるアドレスをソース上で直に記述する方法の有無がCC-RXとGNURXで異なる


    変数を割り付けるセクションを記述する方法がCC-RXとGNURXで異なる


    インライン関数やインラインアセンブラを記述する方法がCC-RXとGNURXで異なる


    nop()やclrpsw()やsetpsw()といった組み込み関数の有無(や表記)が異なる



    machine.hという上記の組み込み関数などが記述されたコンパイラヘッダファイルがCC-RXには有るがGNURXには無い


    __evenaccessという型修飾子(?)がCC-RXでは使えるがGNURXでは使えない



    その他



  • こんにちは。NoMaYです。

    番外編な感も多少ありますが、今度はスマートコンフィグレータが生成したCC-RXプロジェクトのR_BSPモジュールと以下のアプリケーションノートに含まれていたCC-RXプロジェクトのR_BSP_RTOSモジュールを比較してみました。動機は、GNURXプロジェクトのR_BSPモジュールをどのように変更すればR_BSP_RTOSモジュールと同等になりそうなのか把握したかったからです。(そして何か対処方法があるか考えたい。)

    RX65N Group Application Note RX65N Real-time OS Package V1.1.00 ドキュメント(英文)
    www.renesas.com/en-eu/doc/products/mpumcu/apn/rx/002/r01an4033es0110-rx65n.pdf

    RX65N Group Application Note RX65N Real-time OS Package V1.1.00 サンプルプログラム
    www.renesas.com/en-eu/software/D6002273.html

    スマートコンフィグレータが生成したCC-RXプロジェクトのR_BSPモジュールにしかないソース

    ・なし

    上記のアプリケーションノートに含まれていたCC-RXプロジェクトのR_BSP_RTOSモジュールにしかないソース

    ・r_bsp_rtos\board\user\r_bsp.h (ヘッダファイルテンプレートなので気にしなくて良い)
    ・r_bsp_rtos\board\rskrx65n_2mb\rskrx65n_2mb.h (RSK RX65N-2MBボードのスイッチやLEDのポート定義など)

    両方に有ってコメントやインクルードパス以外に差異が無いソース

    ・dbsct.c
    ・lowlvl.c
    ・lowsrc.c
    ・sbrk.c
    ・vecttbl.c
    ・r_bsp_common.c
    ・r_bsp_common.h
    ・locking.c
    ・locking.h
    ・mcu_clocks.c
    ・mcu_init.c
    ・mcu_locks.c
    ・mcu_mapped_interrupts.c
    ・mcu_startup.c

    両方に有ってコメントやインクルードパス以外に差異が有るソース

    ・platform.h
    ・hwsetup.c
    ・r_bsp.h
    ・r_bsp_config_reference.h (ヘッダファイルテンプレートなので気にしなくて良い)
    ・resetprg.c
    ・cpu.c
    ・mcu_interrupts.c

    両方に有って差異が無いソース

    ・残り半分ほど

    違いは以下の理由によって生じていました。

    (1) R_BSP_RTOSモジュールでは諸事情と思われるが"..\"を多用してインクルードパスを記述している#include文がある
    (2) R_BSP_RTOSモジュールではCC-RXの旧バージョン用の記述が残っている

    (3) R_BSP_RTOSモジュールでは対象となっているボードはRSK RX65N-2MBボードである
    (4) R_BSP_RTOSモジュールではgroup_al1_handler_isr()が#if 0~#endifにより無効化されている(別スレッドに関連情報)

    (5) R_BSP_RTOSモジュールではスマートコンフィグレータの初期化関数が呼び出されていない

    (6) R_BSP_RTOSモジュールではFreeRTOS関連のヘッダファイルの#include文が追加されている
    (7) R_BSP_RTOSモジュールではmain()を呼ぶ代わりにスケジューラ起動関数を呼んでいる

    (8) R_BSP_RTOSモジュールではR_BSP_RegisterProtectEnable()とR_BSP_RegisterProtectDisable()が割り込み禁止である

    これらの内、GNURXプロジェクトのR_BSPモジュールをどのように変更すればR_BSP_RTOSモジュールと同等になりそうかという観点では、(1)~(5)は特に問題は無く、(6)と(7)は以下で対処可能だと思われますので、(8)だけが厄介そうな気がします。

    (6) → r_cg_userdefine.hのユーザ記述部でFreeRTOS関連のヘッダファイルの#include文を記述しておく
    (7) → main()の中からスケジューラ起動関数を呼ぶ(SourceForge.netで配布されているFreeRTOSのデモもそうなっていた)

    (8) → これらの関数内でプリエンプトによるコンテキスト切り替えが起きた時に誤動作する可能性を排除する為なのだと思う
      ⇒ 何か(小細工的な発想も含めて)対処方法があるか考えたい

    以下、比較した時の画面コピーです。

    比較結果一覧


    (1) R_BSP_RTOSモジュールでは諸事情と思われるが"..\"を多用してインクルードパスを記述している#include文がある

    他多数

    (2) R_BSP_RTOSモジュールではCC-RXの旧バージョン用の記述が残っている





    (3) R_BSP_RTOSモジュールでは対象となっているボードはRSK RX65N-2MBボードである



    (4) R_BSP_RTOSモジュールではgroup_al1_handler_isr()が#if 0~#endifにより無効化されている


    (5) R_BSP_RTOSモジュールではスマートコンフィグレータの初期化関数が呼び出されていない


    (6) R_BSP_RTOSモジュールではFreeRTOS関連のヘッダファイルの#include文が追加されている



    (7) R_BSP_RTOSモジュールではmain()を呼ぶ代わりにスケジューラ起動関数を呼んでいる




    (8) R_BSP_RTOSモジュールではR_BSP_RegisterProtectEnable()とR_BSP_RegisterProtectDisable()が割り込み禁止である




  • こんにちは。NoMaYです。

    前の投稿の番外編の続きで、今度はスマートコンフィグレータが生成したCC-RXプロジェクトのR_CMT_RXモジュールとアプリケーションノートに含まれていたCC-RXプロジェクトのR_CMT_RTOS_RXモジュールを比較してみました。ただ、GNURXプロジェクトではR_CMT_RXモジュール(及びR_BSPモジュールを除いたFITモジュールはどれも)生成出来ませんので、動機は少し変わって、コード生成機能のタイマモジュールをどう使えば良いのか検討する材料にしたかったから、ということになります。

    ソースの有無の違い

    ・なし

    違いは以下の理由によって生じていました。

    (1) R_BSP_RTOSモジュール同様に"..\"を多用してインクルードパスを記述している#include文がある
    (2) モジュールのバージョンの違い

    (3) FreeRTOSカーネルが使用している1ch分のタイマを操作出来ない(誤操作しない)ようにガードしている
    (4) FreeRTOSカーネルが使用している1ch分のタイマの割り込みハンドラを除外している

    なお、(3)と(4)に関しては、代わりに以下のソースにFreeRTOSカーネル用の処理が記述されていました。

    (3') FreeRTOSカーネルが使用している1ch分のタイマを操作する処理
     an-r01an4033es0110-rx65n-connectivity\SimpleSerialDemo\RTOS_Simple_Demo_RX65N_2M\src\FreeRTOS_user\freertos_usr_func.cなど
    (4') FreeRTOSカーネルが使用している1ch分のタイマの割り込みハンドラ
     an-r01an4033es0110-rx65n-connectivity\RX65N_2M_realtime_OS_pkg\FreeRTOS\Source\portable\Renesas\RX600v2\port.c

    ちなみに、前の投稿に書いたR_BSP_RegisterProtectEnable()とR_BSP_RegisterProtectDisable()ですが、R_CMT_RTOS_RXモジュール(及びR_CMT_RXモジュール)内ではpower_on()というモジュールストップを解除する関数で使用されていました。

    以下、比較した時の画面コピーです。

    比較結果一覧


    (1) R_BSP_RTOSモジュール同様に"..\"を多用してインクルードパスを記述している#include文がある



    (2) モジュールのバージョンの違い


    (3) FreeRTOSカーネルが使用している1ch分のタイマを操作出来ない(誤操作しない)ようにガードしている




    (4) FreeRTOSカーネルが使用している1ch分のタイマの割り込みハンドラを除外している

    途中同様なので省略


    (3') FreeRTOSカーネルが使用している1ch分のタイマを操作する処理

    途中同様なので省略


    (4') FreeRTOSカーネルが使用している1ch分のタイマの割り込みハンドラ


    前の投稿に書いたR_BSP_RegisterProtectEnable()とR_BSP_RegisterProtectDisable()が使用されている例


Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page