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+\










  • こんにちは。NoMaYです。

    最初に余談ですが、今回、投稿がContent Under Reviewと表示されてしまう現象に遭遇してしまいましたので、投稿を少しずつ変更して調べてみました。(以前にもそうなってしまったことがあり、その時にも同じようなことをやって、その結果からそうならない範囲内で投稿するよう注意していて、先程の投稿もその範囲内だった筈なのですが、、、ちなみに、その時のやりとりの様子では、(少なくとも日本では)ルネサスの人も仕組みを知らないようでした、、、)

    結果、前回の投稿時は大丈夫だったのですが、最近(?)は「FreeRTOSv10.0.1」の文字列がURL(?)と解釈されるようになったのか、ファイルのリストの中にフォルダ名として含まれていたことで、多量のURLを記載した不正投稿だと判定されて(?)、Content Under Reviewになるっぽいです、、、(ここまで余談)

    以前からFreeRTOS kernelのソースコードツリーにIARコンパイラによるRL78版があることは気付いていたのですが、それをCC-RLコンパイラへ移植してみようと思いました。ひとまず、ビルドは通る(CS+ for CC(V6.00.00(2017/10/05版)とCC-RL V1.02)ようになりましたので、以下のzipファイルに固めてみました。(この後、シミュレータでデバッグして動くようにすることが出来れば、秋月電子さんのR5F100LGAFB変換モジュールで試してみるつもりです。その後、RL78のコード生成機能と一緒に使うにはどうするのが良いのか考えてみようと思います。)

    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180128.zip

    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\iodefine.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\RTOSDemo.mtpj
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\RTOSDemo.rcpe
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\cstart.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\demo_main.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\demo_specific_io.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\ExampleISR.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\FreeRTOSConfig.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\hdwinit.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\RegTest.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc_user.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_macrodriver.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_userdefine.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_main.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_systeminit.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\stkinit.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\Blinky_Demo\main_blinky.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\Full_Demo\main_full.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\DefaultBuild\RTOSDemo.map
    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




    また、一括でのdiffを取り易くする為、IARコンパイラのアセンブラソースの拡張子をCC-RLコンパイラのアセンブラの拡張子にリネームしたり、CS+のプロジェクトを作る時に流用した以前のFreeRTOS kernelのRX231のCS+のプロジェクトのフォルダ構成に合わせてEWRL78のプロジェクトのファイルを移動したり、といったことを行ったものも以下のzipファイルに固めました。(これで一括でのdiffが取り易くなります。)

    FreeRTOS_Demo_RL78_multiple_IAR_for_diff_20180128.zip





    なお、今回のCS+のプロジェクトでは、以前の投稿のFreeRTOS kernelのRX231のCS+のプロジェクトを流用して新規作成した後、手作業で、ファイルの差し替え、プロジェクト構造の調整、プロジェクト設定の修正、などを行いました。




  • >どうも非公式ながらルネサスさんの社内には、r_bsp_rtosとか、r_cmt_rtos_rxとか、更にはFreeRTOSをFITモジュール化したものまで、あるようです。

    まだまだマイコンでのオブジェクト指向やインスタンスなどはハードルがありそうですが、RTOSはもっと使われても良いと感じます。NoMaYさんのトライアルがルネサス内部活動と並行進行のような感じもしますが、とても有効に思います。ルネサスさんの公式の情報提供も近いことを期待します。
  • NoMaYさん
    ほやです。

    遅まきながらの豆知識。
    > CS+では正しく取り扱えないe2 studioの機能を利用している箇所 ~
    > ・ リンクされたフォルダ
    e2 studio(eclipse/CDT)では圧縮形式にエクスポートすると、リンクで参照されているファイルやフォルダ、
    仮想フォルダが実体化した形でエクスポートされます。
    これで(多少なりとも)手間が減らせるかもしれません。

    エクスポート機能を使うと圧縮に含めるファイルを選ぶ分だけ手間が掛かるので、
    単にプロジェクトのバックアップを取る目的ならこの機能を使うメリットはないのですが、
    こういう時には地味に役立ちます。

  • こんにちは。NoMaYです。(kijoさん、ほやさん、リプライ有難う御座います。後日返信致します。)

    RL78版のFreeRTOSですが、FreeRTOS kernelのソースコードツリーのデモプログラムにはmain_blinky()とmain_full()の2つのモードがありますので、まずmain_blinky()の方をシミュレータでソースデバッグしてみようと思い、以下のように設定を変更しました。

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



    ・ demo_main.c(もともとのファイル名はmain.cだった)のmainCREATE_SIMPLE_BLINKY_DEMO_ONLYの定義を0→1へ変更



    ひとまず動くことは確認出来たのですが、意図通りなら200ms間隔となる筈のところが226ms間隔になっていることに気付きました。



    調べてみたところ、Tickを生成しているタイマのレジスタに設定している値が間違っているようでした。修正してみたところ、期待通り200ms間隔になりました。(ただ、まれに、デバイスのUMが間違っていて、ツールも間違っていて、実デバイスでは意図通りに動作しなかったのでそうした、ということがありますので、念の為、オシロで確認すべきかも知れません。でも、そういう場合は何かコメントが書かれているものですが、そういうコメントは書かれていませんので素朴に間違えたのだろう、という気がします。) なお、以下のソースのconfigTICK_RATE_HZの値ですが、FreeRTOSConfig.hで1000と定義されていました。

    #define configTICK_RATE_HZ                ( ( unsigned short ) 1000 )

    修正前のソース


    修正前のソースでの間隔


    修正後のソース


    修正後のソースでの間隔


    RL78/G13デバイスのマニュアルより抜粋


    以下、デバッグ時の様子が分かるような幾つかの画面コピーです。





  •  こんにちは。NoMaYです。

    RL78版のFreeRTOSですが、FreeRTOS kernelのソースコードツリーのデモプログラムの2つのモードのうち、先日はmain_blinky()のモードを試してみましたので、今度はmain_full()のモードを試してみたところ、デモプログラム内で実行時エラーが検出されてしまいました。



    調べてみたところ、以下の2つのマクロ定数の値が期待されていた値と異なっていることが分かりました。

    FreeRTOS\Demo\Common\Minimal\PollQ.c

    #define pollqPRODUCER_DELAY        ( pdMS_TO_TICKS( ( TickType_t ) 200 ) )
    #define pollqCONSUMER_DELAY        ( pollqPRODUCER_DELAY - ( TickType_t ) ( 20 / portTICK_PERIOD_MS ) )

    期待されていた値は、それぞれ以下の通りです。

    pollqPRODUCER_DELAY → 200
    pollqCONSUMER_DELAY → 180

    ですが、実際の値は、それぞれ以下の通りでした。

    pollqPRODUCER_DELAY → 3
    pollqCONSUMER_DELAY → 65519




    更に調べてみたところ、原因は以下のマクロの振る舞いがIARコンパイラとCC-RLコンパイラとで異なっている為らしい、ということが分かりました。

    FreeRTOS\Source\include\include\projdefs.h

    /* Converts a time in milliseconds to a time in ticks.  This macro can be
    overridden by a macro of the same name defined in FreeRTOSConfig.h in case the
    definition here is not suitable for your application. */
    #ifndef pdMS_TO_TICKS
        #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) )
    #endif

    なお、TickType_tは以下の通りに定義されているものです。

    FreeRTOS\Source\portable\Renesas\RL78\portmarco.h(もともとはFreeRTOS\Source\portable\IAR\RL78\portmacro.hだった)

    #define portCHAR        char
    #define portFLOAT       float
    #define portDOUBLE      double
    #define portLONG        long
    #define portSHORT       short
    #define portSTACK_TYPE  uint16_t
    #define portBASE_TYPE   short

    typedef portSTACK_TYPE StackType_t;
    typedef short BaseType_t;
    typedef unsigned short UBaseType_t;


    #if __DATA_MODEL__ == __DATA_MODEL_FAR__
        #define portPOINTER_SIZE_TYPE uint32_t
    #else
        #define portPOINTER_SIZE_TYPE uint16_t
    #endif


    #if ( configUSE_16_BIT_TICKS == 1 )
        typedef unsigned int TickType_t;
        #define portMAX_DELAY ( TickType_t ) 0xffff
    #else
        typedef uint32_t TickType_t;
        #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
    #endif

    先程のFreeRTOS\Source\include\include\projdefs.hのコメントにはFreeRTOSConfig.hで適切なマクロを定義してオーバーライドするように、とありましたので、以下の定義を行ってみました。

    FreeRTOSConfig.h

    #ifdef __CCRL__
    #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( uint32_t ) ( xTimeInMs ) * ( uint32_t ) configTICK_RATE_HZ ) / ( uint32_t ) 1000 ) )
    #endif /* __CCRL__ */

    その結果、先程の2つのマクロ定数の実際の値は、それぞれ期待されていた通りの以下の値になり、実行時エラーは検出されなくなりました(というか発生しなくなりました)。

    pollqPRODUCER_DELAY → 200
    pollqCONSUMER_DELAY → 180




    以下、デバッグ時のその他の様子が分かるような幾つかの画面コピーです。




  • NoMaYさん研究熱心で敬服します、
    FreeRTOSをRX631にでも可能ですかね、
    できればプロジェクト全体をサンプルソフトとして
    アップしていただくと多くの人が励まされると思うのですが。
  • こんにちは。NoMaYです。(IKUZOさん、リプライ有難う御座います。後日返信致します。)

    RL78版のFreeRTOSですが、FreeRTOS kernelのソースコードツリーのデモプログラムのmain_blinky()とmain_full()の2つのモードがシミュレータで動くようになりましたので、今度は実デバイス(秋月電子さんのR5F100LGAFB変換モジュール)でも試してみました。ただ、念の為にと思ってシミュレータでLEDを繋げるポートの出力のHigh/Lowがトグルすることを確認してみたところ、ちょっと勘違いしていた箇所(ポカミス)を見付けてしまいました。そこを修正した後、実デバイスで動くことを確認出来ましたので、以下のzipファイルに固めてみました。

    FreeRTOS_Demo_RL78_multiple_RenesasCCRL_CS+_20180202.zip

    以前のソースでLEDを繋げるポートの出力をシミュレータで確認したところHi-zのままだった


    以下の関数はIARコンパイラのスタートアップルーチンから呼ばれるものでありCC-RLでは呼ばれないものだった
    (よって関数全体を条件コンパイルで除外することにしました)

    #ifndef __CCRL__
    int __low_level_init(void)
    {
        portDISABLE_INTERRUPTS();

    #ifndef __CCRL__
        /* Set fMX */
        CMC = 0x00;
        MSTOP = 1U;

        /* Set fMAIN */
        MCM0 = 0U;

        /* Set fSUB */
        XTSTOP = 1U;
        OSMC = 0x10;

        /* Set fCLK */
        CSS = 0U;

        /* Set fIH */
        HIOSTOP = 0U;
    #endif /* __CCRL__ */

        /* LED port initialization. */
        LED_INIT();

        return pdTRUE;
    }
    #endif /* __CCRL__ */

    ポートの初期設定はコード生成機能で行うようにした
    (LEDを繋げるポートも変更しました) (追記: あっ、未使用のLED_INIT()マクロに変更漏れがありますね、後日修正します)


    R5F100LGAFBではLEDを繋げるポートの端子位置は以下になります


    今回のソースでLEDを繋げるポートの出力をシミュレータで確認したところHigh/Lowがトグルするようになった
    (シミュレータGUIウィンドウでの動作状況目視確認用に一時的に間隔を200ms→ 1msへ変更しています)


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

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

    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\iodefine.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\RTOSDemo.mtpj
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\RTOSDemo.rcpe
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\cstart.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\demo_main.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\demo_specific_io.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\ExampleISR.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\FreeRTOSConfig.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\hdwinit.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\RegTest.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_cgc_user.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_macrodriver.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_cg_userdefine.h
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_main.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\r_systeminit.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\stkinit.asm
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\Blinky_Demo\main_blinky.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\src\Full_Demo\main_full.c
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\DefaultBuild\RTOSDemo.map
    FreeRTOS\Demo\RL78_multiple_RenesasCCRL_CS+\DefaultBuild\RTOSDemo.mot
    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

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


  • NoMaYさん
    ダウンロードできるようにしてくださり、ありがとうございます、できるだけ早く勉強したいと思います。
  • こんにちは。NoMaYです。

    SourceForgeのFreeRTOSのリポジトリにGNURL78で数年前に作業が行き詰って放置されたソースがあることに気付きましたので、デバッグして動くようにしたものを以下のzipファイルに固めてみました。

    FreeRTOS_Demo_RL78_multiple_GCC_e2studio_20180204.zip

    なお、すみませんが、コード生成する度に以下のvPortTickISRとvPortYieldを記述し直して下さい。

    r_cg_vector_table.c

    #define VECT_SECT          __attribute__ ((section (".vects")))
    const void *Vectors[] VECT_SECT  = {
        // Address 0x4
        R_Dummy,
    途中省略
        // Address 0x38
        vPortTickISR,
    途中省略
        // Address 0x7E
        vPortYield,
    };

    デバッグした結果からの推測では、行き詰ってしまった原因は2つ前の投稿に書いたpdMS_TO_TICKS()マクロの件だったようです。数年の間に実装が変わったと思われる箇所を変更するとmain_blinky()は動きましたが、main_full()は以下のようにしてCC-RLと同じ定義に変更するまで動きませんでした。

    FreeRTOSConfig.h

    #if defined(__CCRL__) || defined(__GNUC__)
    #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( uint32_t ) ( xTimeInMs ) * ( uint32_t ) configTICK_RATE_HZ ) / ( uint32_t ) 1000 ) )
    #endif /* defined(__CCRL__) || defined(__GNUC__) */

    この変更を一旦元に戻して実際の値を確認してみると、CC-RLで動作しなかった時と同じく、それぞれ以下の通りでした。

    pollqPRODUCER_DELAY → 3
    pollqCONSUMER_DELAY → 65519




    期待されていた値は、それぞれ以下の通りです。

    pollqPRODUCER_DELAY → 200
    pollqCONSUMER_DELAY → 180

    なお、ソースコードでの定義は、それぞれ以下の通りです。

    FreeRTOS\Demo\Common\Minimal\PollQ.c

    #define pollqPRODUCER_DELAY        ( pdMS_TO_TICKS( ( TickType_t ) 200 ) )
    #define pollqCONSUMER_DELAY        ( pollqPRODUCER_DELAY - ( TickType_t ) ( 20 / portTICK_PERIOD_MS ) )

    そして、この変更を行って実際の値を確認してみると、CC-RLで動作するようになった時と同じく、それぞれ期待されていた通りの以下の値になりました。

    pollqPRODUCER_DELAY → 200
    pollqCONSUMER_DELAY → 180




    以下はmain_full()が動かなかった時のデバッグ時の画面コピーですが、CC-RLで動作しなかった時と同じく、デモプログラム内で実行時エラーが検出されていました。



    なお、main_blinky()は容易に動くようになりました。以下はmain_blinky()を動かした時のデバッグ時の画面コピーです。(CC-RLの時と同じく、シミュレータGUIウィンドウでの動作状況目視確認用に一時的に間隔を200ms→ 1msへ変更しています。)




    ちなみに、e2 studioの編集ウィンドウ上で多くのエラーが表示されたりブレークポイントを設定することが出来なかったり、といったことがありましたので、以下のように設定を変更しました。

    e2 studio v5.4.0



    e2 studio v6.2.0



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

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


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


    今回、以下の4つのファイルは上書きされます。(なお、portmacro.hは変更ありませんが含めました。)

    FreeRTOS\Source\portable\GCC\RL78\isr_support.h
    FreeRTOS\Source\portable\GCC\RL78\port.c
    FreeRTOS\Source\portable\GCC\RL78\portasm.S
    FreeRTOS\Source\portable\GCC\RL78\portmacro.h

    今回、ビルド時に1箇所ワーニングが表示されますが、ひとまず、そのままにしました。(なお、GNURL78は4.9.2.201703を使用しました。)

    port.c: In function 'pxPortInitialiseStack':
    port.c:108:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
      *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
                      ^

     

  • こんにちは。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