Amazon AWSのFreeRTOS Kernel Developer GuideのサンプルコードをRenesas RX SimulatorのDebug Consoleで試せるようにしてみた

こんにちは。NoMaYです。

別スレッドで、AWSドキュメントサイト内にFreeRTOS kernelの開発者ガイドの日本語版が載っていることに気付いたのですが、その中に含まれているCコード例をルネサスRXシミュレータで試せたら面白そうだと思い、やってみました。まずはCC-RX(CS+/e2 studio)版です。後日GNURX(e2 studio)版もやろうと思います。以下、プロジェクトのファイル一式です。(CS+ V8.01+CC-RX V2.03でビルド)(e2 studio用.project/.cproject等を同梱(zipファイルをe2 studioに直接インポート可能))

sim_rx65n_freertos_ccrx_c_csplus_20190526.zip

やったこと(主なもの)

(1) FreeRTOS kernelがルネサスRXシミュレータの未対応機能を使っていたので無理矢理に対応機能のみ使うように小細工
(2) Full DemoからルネサスRXシミュレータの未対応機能を使っている項目を除外
(3) ルネサスRXシミュレータではBSPモジュール内で無限ループしてしまう点を回避
(4) 開発者ガイドのCコード例で使われているvPrintString()をDebug Consoleへ出力するように作成
(5) Full Demo/Simple Blinky Demo/Cコード例でvAssertCalled()呼び出し時にDebug Consoleへメッセージを出力
(6) Full Demo/Simple Blinky DemoでLEDのOn/OffのタイミングでDebug ConsoleへOn/Offのメッセージを出力
(7) 開発者ガイドのCコード例が動くようにルネサスRXシミュレータの起動設定を変更(私の個人的な好みを含む)
(8) 開発者ガイドのCコード例をビルドする時には不要なデモソースをビルドから除外したプロジェクトを作成(CS+のみ)
(9) 開発者ガイドのCコード例をビルドするプロジェクトではコンパイル時の最適化レベルを0に変更(CS+のみ)

以下、FreeRTOS kernelの開発者ガイドのCコード例をルネサスRXシミュレータで動かした時の画面コピーです。(上記の(8)のプロジェクトです。)

FreeRTOS kernelの開発者ガイドではFreeRTOS Windowsシミュレータで実行
docs.aws.amazon.com/ja_jp/freertos-kernel/latest/dg/task-management.html


ルネサスRXシミュレータで実行


ビルドした時のビルド設定とビルド結果


zipファイルには、開発者ガイドのCコード例をビルドするプロジェクト(CS+のみ)の他に、別スレッドに投稿した、RX65N TBボードで動く(といってもデバッグ中ではありますが)Full Demo/Simple Blinky Demoをビルドするプロジェクトも含まれています。(上記の(2)で除外している項目はありますが。) 以下、それらの画面コピーです。

CS+


e2 studio

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

    Renesas RL78 Simulatorですが、各タスクでポート出力をトグルさせ、それをSimulator GUIのタイミングチャートウィンドウに表示してやれば、タスクの切り替わりが見えるようになりそうな気がしましたので、やってみました。以下、プロジェクトのファイル一式です。(今回はプロジェクトは1つだけです。)

    sim_rl78_freertos_ccrl_c_csplus_20190615.zip    623KB
    sim_rl78_freertos_gnurl78_c_e2v740_20190615.zip    580KB

    以下、CS+での画面コピーです。(e2 studioでも同様です。) タスクが切り替わっていく様子が見えます。

    プリエンプションが起きていない場合


    プリエンプションが起きた場合


    以下、各タスクでポート出力をトグルさせるプログラムです。(なお、CC-RLとGNURL78が生成したコードを見てみたところ、トグルさせる部分をクリティカルセクションとして扱わなくても大丈夫なコード(ビット操作命令で代入操作が行われるコード)には成っていました。このソースのリストファイルもzipファイルに同梱しました。)

    src/user_main.c

    void main_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no6 = !P1_bit.no6;
            taskEXIT_CRITICAL();
        }
    }

    void second_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no5 = !P1_bit.no5;
            taskEXIT_CRITICAL();
        }
    }

    void third_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no4 = !P1_bit.no4;
            taskEXIT_CRITICAL();
        }
    }

    void intp3_task(void *pvParameters)
    {
        (void) pvParameters;

        R_INTC3_Start();

        LED_INIT();
        while (1)
        {
            xSemaphoreTake( xSemaphoreINTP3, portMAX_DELAY );
            taskENTER_CRITICAL();
            LED_BIT = !LED_BIT;
            taskEXIT_CRITICAL();
        }
    }

     

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

    Renesas RL78 Simulatorですが、各タスクでポート出力をトグルさせ、それをSimulator GUIのタイミングチャートウィンドウに表示してやれば、タスクの切り替わりが見えるようになりそうな気がしましたので、やってみました。以下、プロジェクトのファイル一式です。(今回はプロジェクトは1つだけです。)

    sim_rl78_freertos_ccrl_c_csplus_20190615.zip    623KB
    sim_rl78_freertos_gnurl78_c_e2v740_20190615.zip    580KB

    以下、CS+での画面コピーです。(e2 studioでも同様です。) タスクが切り替わっていく様子が見えます。

    プリエンプションが起きていない場合


    プリエンプションが起きた場合


    以下、各タスクでポート出力をトグルさせるプログラムです。(なお、CC-RLとGNURL78が生成したコードを見てみたところ、トグルさせる部分をクリティカルセクションとして扱わなくても大丈夫なコード(ビット操作命令で代入操作が行われるコード)には成っていました。このソースのリストファイルもzipファイルに同梱しました。)

    src/user_main.c

    void main_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no6 = !P1_bit.no6;
            taskEXIT_CRITICAL();
        }
    }

    void second_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no5 = !P1_bit.no5;
            taskEXIT_CRITICAL();
        }
    }

    void third_task(void *pvParameters)
    {
        (void) pvParameters;

        while (1)
        {
            taskENTER_CRITICAL();
            P1_bit.no4 = !P1_bit.no4;
            taskEXIT_CRITICAL();
        }
    }

    void intp3_task(void *pvParameters)
    {
        (void) pvParameters;

        R_INTC3_Start();

        LED_INIT();
        while (1)
        {
            xSemaphoreTake( xSemaphoreINTP3, portMAX_DELAY );
            taskENTER_CRITICAL();
            LED_BIT = !LED_BIT;
            taskEXIT_CRITICAL();
        }
    }

     

Children
No Data