RL78 Fast Prototyping Board+LLVMRL78+Cplusplus sample program

こんにちは。NoMaYです。

RL78/G23-64p Fast Prototyping Board の LLVM-RL78 & C++ & RL78スマートコンフィグレータ & FreeRTOS という組み合わせのサンプルプログラム(e2 studioプロジェクト)です。(サンプルプログラム置き場とGitHubにも置いています。) 現在、以下のものがあります。なお、C++と言っても、以前に投稿したTB-RX65N/RX130/RX231(とRX72N Envision Kit)でのCS+のサンプルプログラムのCソースコードと内容は殆ど同じだったり、また、FreeRTOSと言っても、メインタスクを1つ作っているだけだったり、というものです。(今回、FreeRTOSのLLVM-RL78ポートレイヤは独自対応版(野良犬ならぬ野良ポートレイヤです)、FreeRTOSのカーネルソースはV10.4.4、となっています。)

サンプルプログラム置き場
japan.renesasrulz.com/cafe_rene/m/sample_program/467

GitHubのリポジトリ
github.com/NoMaY-jp/RL78_SmartConfigurator_examples_RL78FPB_LLVMRL78/tree/cafe_rene

シミュレータデバッガコンソール出力
シリアルコンソール出力
シリアルコンソール入力
シリアルコンソール入力確認

シリアルコンソールのサンプルプログラムはボード上のFT232RQに接続されたUART0になっていますが、同じくボード上のFT232RQを使用するCOMPort通信デバッグ機能とは競合しますので、シリアルコンソールのサンプルプログラムではCOMPort通信デバッグは出来ません。

ボード上のFT232RQに関しては、以下のスレッドに投稿したように設定を変更することで、動作を速くしたり面倒を減らしたり、ということが出来ます。

RL78/G23 Fast Prototyping Boardを買いました
japan.renesasrulz.com/cafe_rene/f/forum18/7087/rl78-g23-fast-prototyping-board/38050#38050
japan.renesasrulz.com/cafe_rene/f/forum18/7087/rl78-g23-fast-prototyping-board/39403#39403

以下、サンプルプログラムの例です。

シミュレータデバッガコンソール出力
シリアルコンソール出力

00_SimDebuggerConsole_printf/
10_SerialConsole_printf/

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

    LED0 = LED_ON;

    for (;;)
    {
        printf( "Hello World\r\n" );

        vTaskDelay( pdMS_TO_TICKS( 1000 ) );
        LED0 = ~LED0;

        vTaskDelay( pdMS_TO_TICKS( 1000 ) );
        LED0 = ~LED0;
    }

    /* vTaskDelete(NULL); */
}

 
実行例:



 

  • こんにちは。NoMaYです。

    シリアルコンソールのあと2つのサンプルプログラムのソースと実行例です。(サンプルプログラム置き場に置いたzipファイルには、UARTサンプルプログラムを3つ追加しました。)

    シリアルコンソール入力

    20_SerialConsole_getchar/

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

        char c;

        getchar(); /* To keep the terminal waiting for the start. */

        for (;;)
        {
            printf( "Please enter a character:\r\n" );

            c = getchar();

            printf( "\r\nNow %c is entered.\r\n\r\n", c );
        }

        /* vTaskDelete(NULL); */
    }

     
    シリアルコンソール入力確認

    21_SerialConsole_getchar_ready/

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

        char c;
        int i;

        for (;;)
        {
            printf( "Please enter a character:\r\n" );

            for (i = 0; i < 3; i++)
            {
                vTaskDelay( pdMS_TO_TICKS( 1000 ) );

                if (is_getchar_ready())
                {
                    c = getchar();
                    printf( "\r\nYeah, %c is entered.\r\n\r\n", c );

                    vTaskDelay( pdMS_TO_TICKS( 1000 ) );

                    break;
                }
            }
        }

        /* vTaskDelete(NULL); */
    }

     
    実行例:

     

     

  • こんにちは。NoMaYです。

    UARTサンプルプログラムを3つ追加しました。

    UART出力
    UART入力
    UART入力確認

    以下、ソースと実行例です。

    UART出力

    30_UART_Printf/

    U_CONFIG_UART_PRINTF_IMPL(  UART1, 128 /* transmit buffer size */ );

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

        LED0 = LED_ON;

        for (;;)
        {
            Printf( UART1, "Hello World\r\n" );

            vTaskDelay( pdMS_TO_TICKS( 1000 ) );
            LED0 = ~LED0;

            vTaskDelay( pdMS_TO_TICKS( 1000 ) );
            LED0 = ~LED0;
        }

        /* vTaskDelete(NULL); */
    }

     
    UART入力

    40_UART_Getchar/

    U_CONFIG_UART_PRINTF_IMPL(  UART1, 128 /* transmit buffer size */ );
    U_CONFIG_UART_GETCHAR_IMPL( UART1, 128 /* receive ring buffer size */ );

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

        char c;

        for (;;)
        {
            Printf( UART1, "Please enter a character:\r\n" );

            c = Getchar( UART1 );

            Printf( UART1, "\r\nNow %c is entered.\r\n\r\n", c );
        }

        /* vTaskDelete(NULL); */
    }

     
    UART入力確認

    41_UART_Getchar_Ready/

    U_CONFIG_UART_PRINTF_IMPL(  UART1, 128 /* transmit buffer size */ );
    U_CONFIG_UART_GETCHAR_IMPL( UART1, 128 /* receive ring buffer size */ );

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

        char c;
        int i;

        for (;;)
        {
            Printf( UART1, "Please enter a character:\r\n" );

            for (i = 0; i < 3; i++)
            {
                vTaskDelay( pdMS_TO_TICKS( 1000 ) );

                if (Is_Getchar_Ready( UART1 ))
                {
                    c = Getchar( UART1 );
                    Printf( UART1, "\r\nYeah, %c is entered.\r\n\r\n", c );

                    vTaskDelay( pdMS_TO_TICKS( 1000 ) );

                    break;
                }
            }
        }

        /* vTaskDelete(NULL); */
    }

     
    実行例: (9600bpsです。)









     

  • こんにちは。NoMaYです。

    以下のスレッドにも投稿したのですけれども、LLVM for Renesas RL78 10.0.0.202212のアセンブラが何か変ですね。試しに1つ前のバージョン(LLVM for Renesas RL78 10.0.0.202209)にするとアセンブル出来ますが、このバージョンでは以下の画面コピーのとおりアセンブルエラーが発生してしまいアセンブル出来ませんね。

    RL78 SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rl78/f/forum18/7253/rl78-smartconfigurator/48058#48058

    こちらのスレッドでのエラーメッセージ:

    src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.S:155:1: error: unmatched .ifs or .elses

     
    以下、e2 studioの画面コピーです。

    LLVM for Renesas RL78 10.0.0.202212 → NG


    LLVM for Renesas RL78 10.0.0.202209 → OK

     

  • こんにちは。NoMaYです。

    前の投稿のアセンブルエラーの件が修正されているとのことなので、アップデートしたところ(10.0.0.202212→10.0.0.202301)、くだんのアセンブルエラーは発生しなくなりましたけれども、今度は画面コピーのとおりリンクエラーが発生してしまいビルド出来ません。明日、もう少し追ってみます。

    リンクエラーメッセージ:

    ld.lld: error: ../src/FreeRTOS/Source/portable/Renesas/LLVMRL78\portasm.S:96:(.text+0x23): relocation R_RL78_DIR8U out of range: 17419 is not in [0, 255]
    ld.lld: error: ../src/FreeRTOS/Source/portable/Renesas/LLVMRL78\portasm.S:96:(.text+0x24): relocation R_RL78_DIR8U out of range: 1034738 is not in [0, 255]

     
    以下、e2 studioの画面コピーです。

    LLVM for Renesas RL78 10.0.0.202301 → NG

     

  • こんにちは。NoMaYです。

    リンクエラーに対処出来ました。実は、アセンブラソースに、LLVM-RL78のリンカ不具合回避処置が記述されていたのですけれども、LLVM-RL78 10.0.0.202212~10.0.0.202301で、(従来からの作業のCC-RLのコンパイラの拡張文法の完全コピーを目標とする作業に加えて)CC-RLのアセンブラの文法についてもそれなりに(?)コピーする作業が行われていて、そのことによってリンカ不具合回避処置のアセンブラの記述が(分かり難いことに)リンクエラーを引き起こしていました。(ということで、後日、ソースをアップデートします。(元のFreeRTOS kernelのforkの方もやっとかないと、、、2年近く(?)放置してましたけれども、、、))

    修正前:

    ; A workaround to prevent the symbols getting wrongly linked due to an
    ; LLVM-RL78 clang ld.lld's incorrect relocation address problem.
        .section   .text
        .byte      _vTaskSwitchContext
        .byte      _uxSavedTaskStackPointer

     
    リンクエラーメッセージ:

    ld.lld: error: ../src/FreeRTOS/Source/portable/Renesas/LLVMRL78\portasm.S:96:(.text+0x23): relocation R_RL78_DIR8U out of range: 17419 is not in [0, 255]
    ld.lld: error: ../src/FreeRTOS/Source/portable/Renesas/LLVMRL78\portasm.S:96:(.text+0x24): relocation R_RL78_DIR8U out of range: 1034738 is not in [0, 255]

     
    修正後:

    ; A workaround to prevent the symbols getting wrongly linked due to an
    ; LLVM-RL78 clang ld.lld's incorrect relocation address problem.
        .section   .text
        .byte      LOW(_vTaskSwitchContext)
        .byte      LOW(_uxSavedTaskStackPointer)

     
    リンクエラーメッセージ:

    無し

     
    以下、LLVM for Renesas RL78 10.0.0.202301のリリースノートの抜粋です。

    Release Notes: LLVM FOR RENESAS RL78 10.0.0.202301
    llvm-gcc-renesas.com/release-notes/rl78/latest/10.0.0.202301/release_notes.pdf

    2. [Improvement] Partial CC-RL ASM expression/directive support (ver. 202212)
    Support for most CC-RL assembly expressions, operators and directives was added.
    Relocatable symbol difference expressions are now supported.
    Ex:
    mov a, #LOW(FOO - BAR)
    As a part of this change, %lo16() and %hi16() were replaced by LOWW() and HIGHW().
    For details please refer to LLVM for Renesas RL78 User Manual Section. 4.1.


    以下、LLVM-RL78のリンカ不具合報告です。今気付いたのですけれども。自分が最後に見た時の後でリプライが来てましたね。後で、試してみてうまくいけば、こちらのやり方にします。

    LLVM-RL78 clang ld.lld's incorrect relocation address proble
    llvm-gcc-renesas.com/question/llvm-rl78-clang-ld-llds-incorrect-relocation-address-problem/

    以下、e2 studioの画面コピーです。

    LLVM for Renesas RL78 10.0.0.202301 → アセンブラソース修正後にOK

     

  • こんにちは。NoMaYです。

    あぁっ、GNURL78は以下の上の記述でも大丈夫だったけれども、LLVM-RL78は横着をせずにちゃんと以下の下の記述にしないとマズイということだったのですね。(@progbitは省略出来るようですけれども。)

    修正前:

        .section   .lowtext

     
    修正後:

        .section   .lowtext, "ax", @progbits

     
    以下、e2 studioの画面コピーです。

    LLVM for Renesas RL78 10.0.0.202301 → アセンブラソース修正後にOK

     

  • こんにちは。NoMaYです。

    > リンクエラーに対処出来ました。実は、アセンブラソースに、LLVM-RL78のリンカ不具合回避処置が記述されていたのですけれども、LLVM-RL78 10.0.0.202212~10.0.0.202301で、(従来からの作業のCC-RLのコンパイラの拡張文法の完全コピーを目標とする作業に加えて)CC-RLのアセンブラの文法についてもそれなりに(?)コピーする作業が行われていて、そのことによってリンカ不具合回避処置のアセンブラの記述が(分かり難いことに)リンクエラーを引き起こしていました。(ということで、後日、ソースをアップデートします。(元のFreeRTOS kernelのforkの方もやっとかないと、、、2年近く(?)放置してましたけれども、、、))

    すっかり忘れていましたが放置したままでしたね、、、すみません、、、

    [追記]

    > CC-RLのアセンブラの文法についてもそれなりに(?)コピーする作業が行われていて、

    これは、それなりに、というレベルでは無く、もっと突っ込んだレベルで、既に終盤のようです。すみません。