FreeRTOSをFITやCG(や追々PDG2でも?)と一緒に使うサンプルプログラムをCSplusでビルド出来るプロジェクトにしてみた

こんにちは。NoMaYです。

別スレッドで、FreeRTOS kernel+FITのサンプルプログラムやFreeRTOS kernel+コード生成機能で生成されたソースを含むサンプルプログラムがあることに気付いたのですが、残念ながら、e2 studio v5のプロジェクトしか含まれておらずCS+のプロジェクトが含まれていませんでした。そこで、プロジェクトを変換してCS+でビルド出来るようにしてみました。また、変換したプロジェクトを以下のzipファイルに固めました。

FreeRTOS_kernel_and_FIT_CG_20171230_1.zip    758KB
FreeRTOS_kernel_and_FIT_CG_20171230_2.zip    562KB
FreeRTOS_kernel_and_FIT_CG_20171230_3.zip    908KB
FreeRTOS_kernel_and_FIT_CG_20171230_3'.zip    568KB

そのサンプルプログラムは以下のものです。ちなみに、(1)を見ていて気付いたのですが、どうも非公式ながらルネサスさんの社内には、r_bsp_rtosとか、r_cmt_rtos_rxとか、更にはFreeRTOSをFITモジュール化したものまで、あるようです。なお、(3)はコード生成機能で生成されたソースはあるもののコード生成機能の設定情報が初期値のまま(設定をセーブし忘れた?)でしたので、ソースから設定情報を推測して復元してみたのですが、コード生成プラグインのバージョンが異なる為か、コードを再生成すると若干異なるソースや追加されるソースが生成されましたので、予めコードを再生成させておいた(3')も作ってみました。

(1) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\
(2) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\

RX231 Group Serial Transfer Demo using RX real-time OS Package
Mar.31.17 Source, Project
( Firmware Integration Technology(FIT) / FreeRTOS )
( e2 studio project / CC-RX )
www.renesas.com/ja-jp/doc/products/mpumcu/apn/rx/002/r01an3783es0100-rx231.pdf
www.renesas.com/ja-jp/software/D6001053.html



(3) FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\
(3') FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\

FreeRTOS for Renesas RX231 (RXv2)
Supporting GCC, IAR and Renesas compilers
www.freertos.org/RX231_RTOS_Renesas_GCC_IAR.html
sourceforge.net/projects/freertos/files/FreeRTOS/V10.0.1/



プロジェクトの変換は、基本的にはrcpcファイルをe2 studio(今回はv5.4.0を使用)でエクスポートしてCS+で読み込むという手順で行いましたが、以下のようなCS+では正しく取り扱えないe2 studio(というかEclipseやCDT)の機能を利用している箇所がありますので、その後に地道に手作業で修正を行いました。

・ リンクされたフォルダ
・ コンフィグレーション設定に応じた複数のサブフォルダに同名で内容の異なるソースファイルを置く

また、うまくe2 studioからCS+へ引き継がれない以下の設定に関しても、手作業で修正を行いました。

・ コード生成先フォルダ(e2 studio側は変更不可ですがCS+側は変更可能なのでCS+側へは引き継げる筈だが)
・ リンク順序(e2 studio v5.4.0ではmapとrcpcで順序が異なる、e2 studio v6.1.0はv5.4.0と順序が異なる)

更に、それらに加え、以下のようなプロジェクトの変更も行いました。

・ 毎回全ビルドになってしまうトラブルへの対処
・ 日ごろ心がけようと思っている設定

以下はCS+で読み込んだ後の作業で私が使っていたメモです。

共通
・ プロジェクト構造の修正(ちょっと(3)と(3')では意地になってしまったが)
・ (3)と(3')のみ:コード生成先フォルダをcg_src→src\cg_srcへ修正
・ (3)と(3')のみ:r_cg_main.cをビルドから除外
・ (3)のみ:再生成時に追加されるr_cg_icu_user.cとr_cg_port_user.cをビルドから除外した状態で追加
・ (3')のみ:r_cg_interrupt_handler.hはGCC向けにコード生成したものの残骸のようなので削除
・ リンク順序を修正(e2 studioとCS+で同じmotファイルになるように)
・ インクルードパスの修正
・ ソースリストファイルを出力する
・ C/C++ソースを出力する
・ インクルードファイルが存在しないソースの扱い:再コンパイル/アセンブルしない

コンパイルオプション
・ クロスリファレンス情報を出力する

リンクオプション
・ リンケージリストファイルを出力する:はい(リスト内容=すべて)
・ スタック使用量情報ファイルを出力する:はい
・ 合計セクションサイズを出力する:はい

zipファイルの内容は以下の通りです。

(1) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\

e2 studioでのmapファイルは詳細出力(All)に変えています。(rcpcファイルをエクスポートした後に変更)
rcpcファイルをエクスポートした時点では、元々のプロジェクトから設定を変更していません。
e2 studio V5.4.0でのmotファイルとCS+ for CC(V6.00.00(2017/10/05版))でのmotファイルは一致しました。
(当方特有の事情でCC-RX V2.03を使用しました。元々のプロジェクトではV2.05が使用されています。)

an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\RX231_realtime_OS_pkg.mtpj
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\RX231_realtime_OS_pkg.rcpe
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\プロジェクト変換情報_RX231_realtime_OS_pkg.txt
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\RX231_realtime_OS_pkg.rcpc
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USBPeripheral_LinkOrder_from_MAP_file_for_CS+.mtls
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USB_Host_LinkOrder_from_MAP_file_for_CS+.mtls
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USBPeripheral_csp_build\RX231_realtime_OS_pkg.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USBPeripheral_e2v540_build\RX231_realtime_OS_pkg.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USB_host_csp_build\RX231_realtime_OS_pkg.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\USB_host_e2v540_build\RX231_realtime_OS_pkg.map

(2) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\

e2 studioでのmapファイルは詳細出力(All)に変えています。(rcpcファイルをエクスポートした後に変更)
なお、アプリケーションノートの手順に従ってe2 studioのプロジェクトを完成させる必要があります。
そして、プロジェクトを完成させた後に、rcpcファイルをエクスポートするようにしました。
e2 studio V5.4.0でのmotファイルとCS+ for CC(V6.00.00(2017/10/05版))でのmotファイルは一致しました。
(当方特有の事情でCC-RX V2.03を使用しました。元々のプロジェクトではV2.05が使用されています。)

an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\serial_transfer.mtpj
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\serial_transfer.rcpe
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\プロジェクト変換情報_serial_transfer.txt
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\serial_transfer.rcpc
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\LinkOrder_from_MAP_file_for_CS+.mtls
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\Debug_csp_build\serial_transfer.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\Debug_e2v540_build\serial_transfer.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\HardwareDebug_csp_build\serial_transfer.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\HardwareDebug_e2v540_build\serial_transfer.map
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\r_config\modified\r_irq_rx_config.h
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\r_config\modified\r_sci_rx_config.h
an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\Settings_of_IncludePaths_and_Macros.xml

(3) FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\

元々のFreeRTOSv10.0.1のcgproject.cgpは今回復元されたファイルで上書きされます。
e2 studioでのmapファイルは詳細出力(All)に変えています。(rcpcファイルをエクスポートした後に変更)
rcpcファイルをエクスポートした時点では、元々のプロジェクトから設定を変更していません。
e2 studio V5.4.0でのmotファイルとCS+ for CC(V6.00.00(2017/10/05版))でのmotファイルは一致しました。
(当方特有の事情でCC-RX V2.03を使用しましたが、元々のプロジェクトでもV2.03が使用されています。)

FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\RTOSDemo.mtpj
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\RTOSDemo.rcpe
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\RTOSDemo.rcpc
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\プロジェクト変換情報_RTOSDemo.txt
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\.settings\CodeGenerator\cgproject.cgp
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\LinkOrder_from_MAP_file_for_CS+.mtls
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\HardwareDebug_csp_build\RTOSDemo.map
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\HardwareDebug_e2v540_build\RTOSDemo.map

(3') FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\

CS+のみです。
CS+ for CC (V6.00.00(2017/10/05版))でコード生成させています。
(当方特有の事情でCC-RX V2.03を使用しました。)

FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\RTOSDemo.mtpj
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\RTOSDemo.rcpe
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\HardwareDebug_csp_build\RTOSDemo.map
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Blinky_Demo\main_blinky.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_cgc.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_cgc.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_cgc_user.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_dbsct.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_hardware_setup.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_icu.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_icu.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_icu_user.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_intprg.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_macrodriver.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_main.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_port.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_port.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_port_user.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_resetprg.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_sbrk.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_sbrk.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_stacksct.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_userdefine.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_vect.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\cg_src\r_cg_vecttbl.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Full_Demo\IntQueueTimer.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Full_Demo\IntQueueTimer.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Full_Demo\main_full.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Renesas_Code\stacksct.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Renesas_Code\typedefine.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\Renesas_Code\vect.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\FreeRTOSConfig.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\iodefine.h
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\main.c
FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\src\rskrx231def.h

以下、雰囲気が分かるような画面コピーです。

(1) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\RX231_realtime_OS_pkg\





(2) an-r01an3783es0100-rx231-connectivity\RX231_FreeRTOS_pkg\Demo\serial_transfer\








(3) FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_e2studio\




(3') FreeRTOSv10.0.1\FreeRTOS\Demo\RX200_RX231-RSK_Renesas_CS+\










Parents
  • こんにちは。NoMaYです。

    RL78版のFreeRTOSですが、IARコンパイラからCC-RLコンパイラへ移植してみて、CC-RLコンパイラの2つのメモリモデルの片方のスモールモデル(コードポインタ=2バイト/データポインタ=2バイト)で動くようになりましたので、もう片方のミディアムモデル(コードポインタ=4バイト/データポインタ=2バイト)でも動くようにしてみました。(といってもソースの変更内容としては化粧直し程度のものですが。また、CS+プロジェクトだけでなくe2 studioプロジェクトもzipファイルに固めてみました。) なお、RL78/G13ではCC-RLコンパイラのメモリモデルのデフォルトはミディアムモデルになります。

    ところが、デモプログラムの処理の1つとして実行時エラーチェックを行っているmain_full()モードにて四半日ほど動かしているうちには実行時エラーチェックでエラーが検出されてしまう、という症状が発生しました。(LEDの点滅間隔が3秒→0.2秒に変化することでエラーが検出されたことが分かるようになっています。) 本来なら全く同じMOTファイルで数十回は試行してから定量的頻度について書くのが良いとは思うのですが、原因を調べなければという意識が勝ってしまった上でのデバッグ作業の一環として微妙に異なるMOTファイルがごちゃまぜで且つ試行回数も10回ほどでの印象では、四半日ほど動かしているうちにはエラーが検出されてしまう時があるものの、半日動かしたからといって検出されるとは限らないようでもあります。ミディアムモデルだけかというと、どうもそうではなさそうで、スモールモデルでも5分ほど動かしたら検出されてしまったことも1度ありました。とはいえ、スモールモデルでは(微妙に異なるMOTファイルではありますが)以前に1日以上動かしていても検出されなかった、ということがあります。

    ちなみ、デバッグの途中経過は以下の通りです。

    ・3秒毎に起動される実行時エラーチェックタスクでvRegTest2Task()タスクの停止が検出されてしまう
    ・vRegTest2Task()はRL78/G13の汎用レジスタの値がプリエンプトで壊れないことを確認する無限ループ
    ・vRegTest2Task()ではループ毎にusRegTest2LoopCounter変数(16bit長)が+1されるようになっている
    ・もしも汎用レジスタの値が壊れたことを検出したら空の無限ループの関数に飛ぶので+1されなくなる
    ・そして3秒前に読み出した値と新たに読み出した値が同じならvRegTest2Task()が停止したとして検出される
    ・しかし空の無限ループの関数に飛ぶことなくusRegTest2LoopCounterの値が変化しないことがある
    ・可能性は以下の4つ?(ただしFreeRTOSをまだ理解していないので有り得ない可能性もあると思います)
     (1) 3秒間に1度もvRegTest2Task()に制御が移らなかったのでusRegTest2LoopCounterの値が同じだった
     (2) 3秒間に1度はvRegTest2Task()に制御が移ったがusRegTest2LoopCounterを+1する前に他タスクへ遷移した
     (3) 3秒間のうちにusRegTest2LoopCounterがぴったり65536の整数倍だけ+1されたので値が同じだった
     (4) その他

    _vRegTest2Task:             ; ここでは空行を抜いて少し詰めました
        MOVW    AX, #0x99aa
        MOVW    BC, #0xbbcc
        MOVW    DE, #0xddee
        MOVW    HL, #0xff12
        MOV     CS, #0x03
    ;;$if __DATA_MODEL__ == __DATA_MODEL_FAR__
        MOV     ES, #0x04
    ;;$endif
    loop2:
        CMPW    AX, #0x99aa
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, BC
        CMPW    AX, #0xbbcc
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, DE
        CMPW    AX, #0xddee
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, HL
        CMPW    AX, #0xff12
        SKZ
        BR      !!_vRegTestError
        MOV     A, CS
        CMP     A, #0x03
        SKZ
        BR      !!_vRegTestError
    ;;$if __DATA_MODEL__ == __DATA_MODEL_FAR__
        MOV     A, ES
        CMP     A, #0x04
        SKZ
        BR      !!_vRegTestError
    ;;$endif
        ; Indicate that this task is still cycling.
        INCW    !_usRegTest2LoopCounter
        MOVW    AX, #0x99aa
        BR      $loop2

    そういう状況でデバッグ中なのですが、先は長そうな予感もしますので、ひとまず以下のzipファイルに固めてみました。更に、この際ですので、e2 studioプロジェクトも作成して以下のzipファイルに固めてみました。(なお、生成されるMOTファイルはCS+でもe2 studioでも同じものになるようにリンク順などを合わせ込んであります。)

    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180218.zip
    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_e2studio_20180218.zip

    CS+プロジェクトでは、今回の目的の為に、以前とは以下のようにプロジェクト設定を変更しています。(他に、今まで忘れていた、プロトタイプ宣言されていない関数をチェックする、設定にしています。)

    ・ コンパイラのメモリモデルの設定を[スモールモデル(-memory_model=small)]→[自動選択(なし)]へ変更


    ・ 他コンパイラからの移行支援機能の使用に関する設定を[はい(IAR)(-convert_cc=iar)]→[いいえ(なし)]へ変更


    その結果、少々人為的ではありますが以下のようなセクション設定を行っても、ビルド/デバッグが出来るようになりました。





    ちなみに、上のソースレベルデバッグ時は以下のようにコンパイラの最適化レベルの設定を変更しています。

    ・ コンパイラの最適化レベルの設定を[既定の最適化を行う(なし)]→[デバッグ優先(-Onothing)]へ変更


    e2 studioプロジェクトでは、プロジェクト設定は基本的にはCS+プロジェクトのプロジェクト設定と同じですが、CC-RLコンパイル時のクロスリファレンス出力を設定出来ない(出力を利用する機能が無い為?)ようでしたので設定しませんでした。(なお、生成されるMOTファイルがCS+と同じものになるようにリンク順なども合わせ込んであります。) また、ソースも基本的にはCS+プロジェクトのソースと同じですが、プロジェクト生成時のコメントが異なっていたり、生成されるフォルダが異なっていたり、などの違いがあります。

    また、プロジェクト生成時の設定ではリンク時に以下のワーニングが表示されてしまいましたので、表示されないように設定を変更しました。(e2 studio v5.4.0では該当しますが、v6.2.0では該当しません。)

    W0561184:Interrupt number "0x2" of ".vect" is defined



    あと、前回の投稿でGCCで試した時と同様、e2 studioの編集ウィンドウ上で多くのエラーが表示されたりブレークポイントを設定することが出来なかったり、といったことがあると思われますので、その投稿の設定と同様、インデクサーとエディタのスケーラビリティモードの設定を変更しておくと良さそうです。

    ちなみに、ソースレベルデバッグ時は以下のようにコンパイラの最適化レベルの設定を変更して下さい。

    ・ コンパイラの最適化レベルの設定を[デフォルト]→[デバッグ優先]へ変更

    e2 studio v5.4.0


    e2 studio v6.2.0


    なお、SourceForgeからFreeRTOS kernelのv10.0.1のソースコードの自己解凍exeファイル(もしくはzipファイル)をダウンロード出来るようになっていますので、今回も今まで同様に、解凍後に両者の上位フォルダの位置を合わせるようにしてフォルダを統合すればビルド出来るようになります。

    以下の4つのファイルは添付した両方のzipファイルに含まれていますが、ファイルは全く同じものです。

    FreeRTOS\Source\portable\Renesas\RL78\ISR_Support.h
    FreeRTOS\Source\portable\Renesas\RL78\port.c
    FreeRTOS\Source\portable\Renesas\RL78\portasm.asm
    FreeRTOS\Source\portable\Renesas\RL78\portmacro.h

    この投稿に添付したFreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180218のソースコードツリー


    この投稿に添付したFreeRTOS_Demo_RL78_multiple_RenesasCCRL_e2studio_20180218のソースコードツリー


    SourceForgeからダウンロードしたFreeRTOS kernelのv10.0.1のソースコードツリー


    CS+プロジェクトとe2 studioプロジェクトのFreeRTOS部分のプロジェクト構造は以下のようにしました。

    CS+


    e2 studio


Reply
  • こんにちは。NoMaYです。

    RL78版のFreeRTOSですが、IARコンパイラからCC-RLコンパイラへ移植してみて、CC-RLコンパイラの2つのメモリモデルの片方のスモールモデル(コードポインタ=2バイト/データポインタ=2バイト)で動くようになりましたので、もう片方のミディアムモデル(コードポインタ=4バイト/データポインタ=2バイト)でも動くようにしてみました。(といってもソースの変更内容としては化粧直し程度のものですが。また、CS+プロジェクトだけでなくe2 studioプロジェクトもzipファイルに固めてみました。) なお、RL78/G13ではCC-RLコンパイラのメモリモデルのデフォルトはミディアムモデルになります。

    ところが、デモプログラムの処理の1つとして実行時エラーチェックを行っているmain_full()モードにて四半日ほど動かしているうちには実行時エラーチェックでエラーが検出されてしまう、という症状が発生しました。(LEDの点滅間隔が3秒→0.2秒に変化することでエラーが検出されたことが分かるようになっています。) 本来なら全く同じMOTファイルで数十回は試行してから定量的頻度について書くのが良いとは思うのですが、原因を調べなければという意識が勝ってしまった上でのデバッグ作業の一環として微妙に異なるMOTファイルがごちゃまぜで且つ試行回数も10回ほどでの印象では、四半日ほど動かしているうちにはエラーが検出されてしまう時があるものの、半日動かしたからといって検出されるとは限らないようでもあります。ミディアムモデルだけかというと、どうもそうではなさそうで、スモールモデルでも5分ほど動かしたら検出されてしまったことも1度ありました。とはいえ、スモールモデルでは(微妙に異なるMOTファイルではありますが)以前に1日以上動かしていても検出されなかった、ということがあります。

    ちなみ、デバッグの途中経過は以下の通りです。

    ・3秒毎に起動される実行時エラーチェックタスクでvRegTest2Task()タスクの停止が検出されてしまう
    ・vRegTest2Task()はRL78/G13の汎用レジスタの値がプリエンプトで壊れないことを確認する無限ループ
    ・vRegTest2Task()ではループ毎にusRegTest2LoopCounter変数(16bit長)が+1されるようになっている
    ・もしも汎用レジスタの値が壊れたことを検出したら空の無限ループの関数に飛ぶので+1されなくなる
    ・そして3秒前に読み出した値と新たに読み出した値が同じならvRegTest2Task()が停止したとして検出される
    ・しかし空の無限ループの関数に飛ぶことなくusRegTest2LoopCounterの値が変化しないことがある
    ・可能性は以下の4つ?(ただしFreeRTOSをまだ理解していないので有り得ない可能性もあると思います)
     (1) 3秒間に1度もvRegTest2Task()に制御が移らなかったのでusRegTest2LoopCounterの値が同じだった
     (2) 3秒間に1度はvRegTest2Task()に制御が移ったがusRegTest2LoopCounterを+1する前に他タスクへ遷移した
     (3) 3秒間のうちにusRegTest2LoopCounterがぴったり65536の整数倍だけ+1されたので値が同じだった
     (4) その他

    _vRegTest2Task:             ; ここでは空行を抜いて少し詰めました
        MOVW    AX, #0x99aa
        MOVW    BC, #0xbbcc
        MOVW    DE, #0xddee
        MOVW    HL, #0xff12
        MOV     CS, #0x03
    ;;$if __DATA_MODEL__ == __DATA_MODEL_FAR__
        MOV     ES, #0x04
    ;;$endif
    loop2:
        CMPW    AX, #0x99aa
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, BC
        CMPW    AX, #0xbbcc
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, DE
        CMPW    AX, #0xddee
        SKZ
        BR      !!_vRegTestError
        MOVW    AX, HL
        CMPW    AX, #0xff12
        SKZ
        BR      !!_vRegTestError
        MOV     A, CS
        CMP     A, #0x03
        SKZ
        BR      !!_vRegTestError
    ;;$if __DATA_MODEL__ == __DATA_MODEL_FAR__
        MOV     A, ES
        CMP     A, #0x04
        SKZ
        BR      !!_vRegTestError
    ;;$endif
        ; Indicate that this task is still cycling.
        INCW    !_usRegTest2LoopCounter
        MOVW    AX, #0x99aa
        BR      $loop2

    そういう状況でデバッグ中なのですが、先は長そうな予感もしますので、ひとまず以下のzipファイルに固めてみました。更に、この際ですので、e2 studioプロジェクトも作成して以下のzipファイルに固めてみました。(なお、生成されるMOTファイルはCS+でもe2 studioでも同じものになるようにリンク順などを合わせ込んであります。)

    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180218.zip
    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_e2studio_20180218.zip

    CS+プロジェクトでは、今回の目的の為に、以前とは以下のようにプロジェクト設定を変更しています。(他に、今まで忘れていた、プロトタイプ宣言されていない関数をチェックする、設定にしています。)

    ・ コンパイラのメモリモデルの設定を[スモールモデル(-memory_model=small)]→[自動選択(なし)]へ変更


    ・ 他コンパイラからの移行支援機能の使用に関する設定を[はい(IAR)(-convert_cc=iar)]→[いいえ(なし)]へ変更


    その結果、少々人為的ではありますが以下のようなセクション設定を行っても、ビルド/デバッグが出来るようになりました。





    ちなみに、上のソースレベルデバッグ時は以下のようにコンパイラの最適化レベルの設定を変更しています。

    ・ コンパイラの最適化レベルの設定を[既定の最適化を行う(なし)]→[デバッグ優先(-Onothing)]へ変更


    e2 studioプロジェクトでは、プロジェクト設定は基本的にはCS+プロジェクトのプロジェクト設定と同じですが、CC-RLコンパイル時のクロスリファレンス出力を設定出来ない(出力を利用する機能が無い為?)ようでしたので設定しませんでした。(なお、生成されるMOTファイルがCS+と同じものになるようにリンク順なども合わせ込んであります。) また、ソースも基本的にはCS+プロジェクトのソースと同じですが、プロジェクト生成時のコメントが異なっていたり、生成されるフォルダが異なっていたり、などの違いがあります。

    また、プロジェクト生成時の設定ではリンク時に以下のワーニングが表示されてしまいましたので、表示されないように設定を変更しました。(e2 studio v5.4.0では該当しますが、v6.2.0では該当しません。)

    W0561184:Interrupt number "0x2" of ".vect" is defined



    あと、前回の投稿でGCCで試した時と同様、e2 studioの編集ウィンドウ上で多くのエラーが表示されたりブレークポイントを設定することが出来なかったり、といったことがあると思われますので、その投稿の設定と同様、インデクサーとエディタのスケーラビリティモードの設定を変更しておくと良さそうです。

    ちなみに、ソースレベルデバッグ時は以下のようにコンパイラの最適化レベルの設定を変更して下さい。

    ・ コンパイラの最適化レベルの設定を[デフォルト]→[デバッグ優先]へ変更

    e2 studio v5.4.0


    e2 studio v6.2.0


    なお、SourceForgeからFreeRTOS kernelのv10.0.1のソースコードの自己解凍exeファイル(もしくはzipファイル)をダウンロード出来るようになっていますので、今回も今まで同様に、解凍後に両者の上位フォルダの位置を合わせるようにしてフォルダを統合すればビルド出来るようになります。

    以下の4つのファイルは添付した両方のzipファイルに含まれていますが、ファイルは全く同じものです。

    FreeRTOS\Source\portable\Renesas\RL78\ISR_Support.h
    FreeRTOS\Source\portable\Renesas\RL78\port.c
    FreeRTOS\Source\portable\Renesas\RL78\portasm.asm
    FreeRTOS\Source\portable\Renesas\RL78\portmacro.h

    この投稿に添付したFreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180218のソースコードツリー


    この投稿に添付したFreeRTOS_Demo_RL78_multiple_RenesasCCRL_e2studio_20180218のソースコードツリー


    SourceForgeからダウンロードしたFreeRTOS kernelのv10.0.1のソースコードツリー


    CS+プロジェクトとe2 studioプロジェクトのFreeRTOS部分のプロジェクト構造は以下のようにしました。

    CS+


    e2 studio


Children
No Data