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です。

    GNURX(e2 studio)版もやってみました。今回、zipファイルにe2 studioプロジェクトを2つ入れてみました。また、GNURX版を作っていて気付いた点やGNURX版とCC-RX版でソースを同じにしたかった点を反映させて、CC-RX(CS+/e2 studio)版も作り直しました。以下、プロジェクトのファイル一式です。(GNURX版はe2 studio v7.40+GNURX 2019q2(4.8.4.201902)でビルド)(CC-RX版はCS+ V8.01/e2 stuiod v7.40+CC-RX V2.03でビルド(e2 studio用.project/.cproject等を同梱))(共にzipファイルをe2 studioに直接インポート可能)

    sim_rx65n_freertos_gnurx_c_e2v740_20190530.zip    915KB
    sim_rx65n_freertos_ccrx_c_csplus_20190529.zip    990KB

    以下、GNURX版とCC-RX版のそれぞれのzipファイルにe2 studioプロジェクトを2つ入れてみた画面です。

    インポート時



    インポート後



    以下、FreeRTOS kernelの開発者ガイドのCコード例の実行画面です。

    GNURX+e2 studio+ルネサスRXシミュレータで実行


    CC-RX+e2 studio+ルネサスRXシミュレータで実行


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


    以下、ルネサスRXシミュレータで実行させてみたCコード例です。(ルネサスFreeRTOSプロジェクトはmain()を呼び出しませんので、src/frtos_startup/freertos_start.cのProcessing_Before_Start_Kernel()をmain()の代わりに使っています。) 開発者ガイドの最初のCコード例ということで、タスク内ではRTOSのAPIを何も呼び出していないCコードですが、、、

    src/frtos_startup/freertos_start.c

    void vTask1( void *pvParameters )
    {
    const char *pcTaskName = "Task 1 is running\r\n";
    volatile uint32_t ul; /* volatile to ensure ul is not optimized away.*/

        /* Remove compiler warning about unused parameter. */
        ( void ) pvParameters;

        /* As per most tasks, this task is implemented in an infinite loop. */
        for( ;; )
        {
            /* Print out the name of this task. */
            vPrintString( pcTaskName );
            /* Delay for a period. */
            for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
            {
                 /* This loop is just a very crude delay implementation. There is
                 nothing to do in here. Later examples will replace this crude loop
                 with a proper delay/sleep function. */
            }
         }
    }
    void vTask2( void *pvParameters )
    {
    const char *pcTaskName = "Task 2 is running\r\n";
    volatile uint32_t ul; /* volatile to ensure ul is not optimized away.*/

        /* Remove compiler warning about unused parameter. */
        ( void ) pvParameters;

        /* As per most tasks, this task is implemented in an infinite loop. */
        for( ;; )
        {
            /* Print out the name of this task. */
            vPrintString( pcTaskName );
            /* Delay for a period. */
            for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
            {
                /* This loop is just a very crude delay implementation. There is
                nothing to do in here. Later examples will replace this crude loop
                with a proper delay/sleep function. */
            }
        }
    }
    void Processing_Before_Start_Kernel(void)
    {
        /* Create one of the two tasks. Note that a real application should check
        the return value of the xTaskCreate() call to ensure the task was created
        successfully. */
        xTaskCreate( vTask1, /* Pointer to the function that implements thetask. */
                     "Task 1",/* Text name for the task. This is to facilitate debugging only. */
                     1000, /* Stack depth - small microcontrollers will use much less stack than this. */
                     NULL, /* This example does not use the task parameter. */
                     1, /* This task will run at priority 1. */
                     NULL ); /* This example does not use the task handle. */

        /* Create the other task in exactly the same way and at the same priority. */
        xTaskCreate( vTask2, "Task 2", 1000, NULL, 1, NULL );

        /* Start the scheduler so the tasks start executing. */
        vTaskStartScheduler();

        /* If all is well then main() will never reach here as the scheduler will
        now be running the tasks. If main() does reach here then it is likely that
        there was insufficient heap memory available for the idle task to be created.
        For more information, see Heap Memory Management. */
        for( ;; );
    }

     

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

    GNURX(e2 studio)版もやってみました。今回、zipファイルにe2 studioプロジェクトを2つ入れてみました。また、GNURX版を作っていて気付いた点やGNURX版とCC-RX版でソースを同じにしたかった点を反映させて、CC-RX(CS+/e2 studio)版も作り直しました。以下、プロジェクトのファイル一式です。(GNURX版はe2 studio v7.40+GNURX 2019q2(4.8.4.201902)でビルド)(CC-RX版はCS+ V8.01/e2 stuiod v7.40+CC-RX V2.03でビルド(e2 studio用.project/.cproject等を同梱))(共にzipファイルをe2 studioに直接インポート可能)

    sim_rx65n_freertos_gnurx_c_e2v740_20190530.zip    915KB
    sim_rx65n_freertos_ccrx_c_csplus_20190529.zip    990KB

    以下、GNURX版とCC-RX版のそれぞれのzipファイルにe2 studioプロジェクトを2つ入れてみた画面です。

    インポート時



    インポート後



    以下、FreeRTOS kernelの開発者ガイドのCコード例の実行画面です。

    GNURX+e2 studio+ルネサスRXシミュレータで実行


    CC-RX+e2 studio+ルネサスRXシミュレータで実行


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


    以下、ルネサスRXシミュレータで実行させてみたCコード例です。(ルネサスFreeRTOSプロジェクトはmain()を呼び出しませんので、src/frtos_startup/freertos_start.cのProcessing_Before_Start_Kernel()をmain()の代わりに使っています。) 開発者ガイドの最初のCコード例ということで、タスク内ではRTOSのAPIを何も呼び出していないCコードですが、、、

    src/frtos_startup/freertos_start.c

    void vTask1( void *pvParameters )
    {
    const char *pcTaskName = "Task 1 is running\r\n";
    volatile uint32_t ul; /* volatile to ensure ul is not optimized away.*/

        /* Remove compiler warning about unused parameter. */
        ( void ) pvParameters;

        /* As per most tasks, this task is implemented in an infinite loop. */
        for( ;; )
        {
            /* Print out the name of this task. */
            vPrintString( pcTaskName );
            /* Delay for a period. */
            for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
            {
                 /* This loop is just a very crude delay implementation. There is
                 nothing to do in here. Later examples will replace this crude loop
                 with a proper delay/sleep function. */
            }
         }
    }
    void vTask2( void *pvParameters )
    {
    const char *pcTaskName = "Task 2 is running\r\n";
    volatile uint32_t ul; /* volatile to ensure ul is not optimized away.*/

        /* Remove compiler warning about unused parameter. */
        ( void ) pvParameters;

        /* As per most tasks, this task is implemented in an infinite loop. */
        for( ;; )
        {
            /* Print out the name of this task. */
            vPrintString( pcTaskName );
            /* Delay for a period. */
            for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
            {
                /* This loop is just a very crude delay implementation. There is
                nothing to do in here. Later examples will replace this crude loop
                with a proper delay/sleep function. */
            }
        }
    }
    void Processing_Before_Start_Kernel(void)
    {
        /* Create one of the two tasks. Note that a real application should check
        the return value of the xTaskCreate() call to ensure the task was created
        successfully. */
        xTaskCreate( vTask1, /* Pointer to the function that implements thetask. */
                     "Task 1",/* Text name for the task. This is to facilitate debugging only. */
                     1000, /* Stack depth - small microcontrollers will use much less stack than this. */
                     NULL, /* This example does not use the task parameter. */
                     1, /* This task will run at priority 1. */
                     NULL ); /* This example does not use the task handle. */

        /* Create the other task in exactly the same way and at the same priority. */
        xTaskCreate( vTask2, "Task 2", 1000, NULL, 1, NULL );

        /* Start the scheduler so the tasks start executing. */
        vTaskStartScheduler();

        /* If all is well then main() will never reach here as the scheduler will
        now be running the tasks. If main() does reach here then it is likely that
        there was insufficient heap memory available for the idle task to be created.
        For more information, see Heap Memory Management. */
        for( ;; );
    }

     

Children
No Data