RL78実行エラー

RF5F100PJにてCS+ for CA、CXとE1を使用してプログラムを組んでいます。

2日前より実行時にソフトウエア・ブレークにより動作が停止しましたと出力されるようになりました。

このエラーが出る前の状態に戻し、少しずつプログラムを追加していくとある段階で症状が出るようになります。

サイズの問題なのか、全く別の問題なのか特定出来ずに困っています。

このような症状はどういった場合に出るのか教えて頂けないでしょうか。

-----------------------------

なお、下記は不具合の出るプログラムのmapファイルです。

78K0R Linker V1.80                            Date:31 Aug 2019 Page:   1

Command:   -yC:\Program Files\Renesas Electronics\CS+\CACX\Device\RL78\D
           evicefile -_msgoff -oDefaultBuild\TWS100_V_M1.lmf -gi00000000
           000000000000h -mi0 -pDefaultBuild\TWS100_V_M1.map DefaultBuil
           d\op.rel DefaultBuild\TWS100_V_M1_K.rel
Para-file:
Out-file:  DefaultBuild\TWS100_V_M1.lmf
Map-file:  DefaultBuild\TWS100_V_M1.map
Direc-file:
Directive:


*** Link information ***

    17 output segment(s)
1A255H byte(s) real data
  3626 symbol(s) defined


*** Memory map ***


  SPACE=REGULAR

  MEMORY=ROM
  BASE ADDRESS=00000H   SIZE=40000H
         OUTPUT   INPUT    INPUT      BASE      SIZE
         SEGMENT  SEGMENT  MODULE     ADDRESS
         TVECT1                       00000H    00002H  CSEG AT
                  TVECT1   TWS100_V_M1_K
                                      00000H    00002H
         ??NMIROM                     00002H    00002H  CSEG
         TVECT2                       00004H    0001AH  CSEG AT
                  TVECT2   TWS100_V_M1_K
                                      00004H    0001AH
         TVECT3                       0001EH    00014H  CSEG AT
                  TVECT3   TWS100_V_M1_K
                                      0001EH    00014H
         TVECT4                       00032H    00014H  CSEG AT
                  TVECT4   TWS100_V_M1_K
                                      00032H    00014H
         TVECT5                       00046H    0002AH  CSEG AT
                  TVECT5   TWS100_V_M1_K
                                      00046H    0002AH
* gap *                               00070H    0000EH
         TVECT6                       0007EH    00002H  CSEG AT
                  TVECT6   TWS100_V_M1_K
                                      0007EH    00002H
* gap *                               00080H    00040H
         XOPTB                        000C0H    00004H  CSEG OPT_BYTE
                  XOPTB    op         000C0H    00004H
         ?CSEGSI                      000C4H    0000AH  CSEG
         ?OCDSTAD                     000CEH    0000AH  CSEG
* gap *                               000D8H    00FE8H
         OPT2                         010C0H    00004H  CSEG AT
                  OPT2     op         010C0H    00004H
* gap *                               010C4H    01F3CH
         XCHRDATA                     03000H    01E04H  CSEG MIRRORP
                  XCHRDATA TWS100_V_M1_K
                                      03000H    01E04H
         XMAIN                        04E04H    181C3H  CSEG
                  XMAIN    TWS100_V_M1_K
                                      04E04H    181C3H
* gap *                               1CFC7H    22E39H
         ??OCDROM                     3FE00H    00200H  CSEG

  MEMORY=RAM
  BASE ADDRESS=FAF00H   SIZE=05100H
         OUTPUT   INPUT    INPUT      BASE      SIZE
         SEGMENT  SEGMENT  MODULE     ADDRESS
         DSTK                         FAF00H    00080H  DSEG BASEP
                  DSTK     TWS100_V_M1_K
                                      FAF00H    00080H
         KADATA                       FAF80H    011B6H  DSEG
                  KADATA   TWS100_V_M1_K
                                      FAF80H    011B6H
* gap *                               FC136H    03CEAH
         DMAIN                        FFE20H    000ADH  DSEG SADDR
                  DMAIN    TWS100_V_M1_K
                                      FFE20H    000ADH
* gap *                               FFECDH    00033H
* gap (Not Free Area) *               FFF00H    00100H


 Target chip : R5F100PJ
 Device file : V1.14

Parents
  • KOBAさん、こんにちは。NoMaYと申します。

    CA78K0R(およびCC-RL)であれば、リンカでワーニングやエラーが出ていなければ「サイズの問題」は以下の4点かな、と私は思います。マップファイルを見る限り、今回は、(3)と(4)は非該当、(2)は問題無し、と思いますが、(1)はマップファイルからでは分からないですね。

    (1) スタックオーバーフロー
    (2) プロジェクトでのデバイス選択ミス
    (3) フラッシュライブラリの予約領域の確保ミス
    (4) Boot/Flashの分割ミス

    それで、「実行時にソフトウエア・ブレークにより動作が停止」というのは、コードが無い場所でプログラムが停止した(停止した場所のフラッシュメモリのコードは0xFFですよね)、ということでは無いでしょうか?そうであれば、「E1を外すと動かない」「突然リセットが掛かる」と並んで(RL78のオンチップデバッグでは)難しいトラブルかな、と私は思います。

    とりあえず、以下、その前提でリプライすることにしますが、コンパイラが信用出来るなら、そのような症状が発生する原因は、以下の可能性が高いと私は思います。

    (1) スタック上の戻り番地の値が不正になった
    (1-1) スタックオーバーフローによりスタックがRAMの無い領域に突き抜けてしまった
    (1-2) スタックオーバーフローによりスタックとグローバル/スタティックの変数の領域が重なってしまった
    (1-3) プログラムの不具合によりスタック上の戻り番地の値を壊してしまった

    (2) 関数ポインタの値が不正になった
    (2-1) 上の(1-1)と同様にスタックがRAMの無い領域に突き抜けて(スタック上の)関数ポインタの値が壊れた
    (2-2) 上の(1-2)と同様にスタックとグローバル/スタティックの変数の領域が重なって(何れかの)関数ポインタの値が壊れた
    (2-3) プログラムの不具合により関数ポインタの値を壊してしまった

    (3) 割り込みベクタの指定忘れ

    次に考えることは、以下のことかな、と私は思います。

    (1-1) SPの値を確認すれば分かる
    (1-2) 同上 および追加確認として
    (1-2') SPの指すメモリの下側(ret/reti/retb後だから)のデータがブレークしたアドレスであれば本可能性が高い
    (1-3) 同上((1-2')のこと)

    (2-1) AX,BC,DE,HLの何れかのレジスタの値がブレークしたアドレスであれば本可能性が高い
    (2-2) 同上
    (2-3) 同上

    (3) 割り込み回りのソースを確認する

    (4) 上記の何れでもなければ本切り口でのデバッグは諦めて別の切り口を考える

    その次に考えることは、以下のことかな、と私は思います。

    (1-1) スタックオーバーフローしないようにスタック領域の設定を変更する
    (1-2) 同上
    (1-3) 配列の添え字やポインタの範囲チェックを行うassert()を挿入する

    (2-1) 関数ポインタで関数呼び出ししているソース箇所を捜してassert()を挿入する *1
    (2-2) 同上
    (2-3) 同上
    (2-1) スタックオーバーフローしないようにスタック領域の設定を変更する
    (2-2) 同上 および追加確認として
    (2-2') SPの指すメモリの上側(call rp後だから)のデータが関数ポインタを使った関数呼び出し元アドレスかどうか確認する
    (2-3) 同上((2-2')のこと)

    *1: 例えば、簡易には、フラッシュメモリ範囲内であること、など。

    ちなみに、CA78K0Rの話ではないのですが、CC-RLのProfessional版であればコンパイラに、スタック破壊検出機能というものや、不正な間接関数呼び出し検出機能というものが、あります。

    -stack_protector/-stack_protector_all 【Professional版のみ】 【V1.02以降】
    スタック破壊検出コードを生成します。
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.02.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl02c0501y1208.html

    -control_flow_integrity【Professional版のみ】【V1.06以降】
    不正な間接関数呼び出しを検出するコードを生成します。
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.02.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl02c0501y1209.html
     

Reply
  • KOBAさん、こんにちは。NoMaYと申します。

    CA78K0R(およびCC-RL)であれば、リンカでワーニングやエラーが出ていなければ「サイズの問題」は以下の4点かな、と私は思います。マップファイルを見る限り、今回は、(3)と(4)は非該当、(2)は問題無し、と思いますが、(1)はマップファイルからでは分からないですね。

    (1) スタックオーバーフロー
    (2) プロジェクトでのデバイス選択ミス
    (3) フラッシュライブラリの予約領域の確保ミス
    (4) Boot/Flashの分割ミス

    それで、「実行時にソフトウエア・ブレークにより動作が停止」というのは、コードが無い場所でプログラムが停止した(停止した場所のフラッシュメモリのコードは0xFFですよね)、ということでは無いでしょうか?そうであれば、「E1を外すと動かない」「突然リセットが掛かる」と並んで(RL78のオンチップデバッグでは)難しいトラブルかな、と私は思います。

    とりあえず、以下、その前提でリプライすることにしますが、コンパイラが信用出来るなら、そのような症状が発生する原因は、以下の可能性が高いと私は思います。

    (1) スタック上の戻り番地の値が不正になった
    (1-1) スタックオーバーフローによりスタックがRAMの無い領域に突き抜けてしまった
    (1-2) スタックオーバーフローによりスタックとグローバル/スタティックの変数の領域が重なってしまった
    (1-3) プログラムの不具合によりスタック上の戻り番地の値を壊してしまった

    (2) 関数ポインタの値が不正になった
    (2-1) 上の(1-1)と同様にスタックがRAMの無い領域に突き抜けて(スタック上の)関数ポインタの値が壊れた
    (2-2) 上の(1-2)と同様にスタックとグローバル/スタティックの変数の領域が重なって(何れかの)関数ポインタの値が壊れた
    (2-3) プログラムの不具合により関数ポインタの値を壊してしまった

    (3) 割り込みベクタの指定忘れ

    次に考えることは、以下のことかな、と私は思います。

    (1-1) SPの値を確認すれば分かる
    (1-2) 同上 および追加確認として
    (1-2') SPの指すメモリの下側(ret/reti/retb後だから)のデータがブレークしたアドレスであれば本可能性が高い
    (1-3) 同上((1-2')のこと)

    (2-1) AX,BC,DE,HLの何れかのレジスタの値がブレークしたアドレスであれば本可能性が高い
    (2-2) 同上
    (2-3) 同上

    (3) 割り込み回りのソースを確認する

    (4) 上記の何れでもなければ本切り口でのデバッグは諦めて別の切り口を考える

    その次に考えることは、以下のことかな、と私は思います。

    (1-1) スタックオーバーフローしないようにスタック領域の設定を変更する
    (1-2) 同上
    (1-3) 配列の添え字やポインタの範囲チェックを行うassert()を挿入する

    (2-1) 関数ポインタで関数呼び出ししているソース箇所を捜してassert()を挿入する *1
    (2-2) 同上
    (2-3) 同上
    (2-1) スタックオーバーフローしないようにスタック領域の設定を変更する
    (2-2) 同上 および追加確認として
    (2-2') SPの指すメモリの上側(call rp後だから)のデータが関数ポインタを使った関数呼び出し元アドレスかどうか確認する
    (2-3) 同上((2-2')のこと)

    *1: 例えば、簡易には、フラッシュメモリ範囲内であること、など。

    ちなみに、CA78K0Rの話ではないのですが、CC-RLのProfessional版であればコンパイラに、スタック破壊検出機能というものや、不正な間接関数呼び出し検出機能というものが、あります。

    -stack_protector/-stack_protector_all 【Professional版のみ】 【V1.02以降】
    スタック破壊検出コードを生成します。
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.02.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl02c0501y1208.html

    -control_flow_integrity【Professional版のみ】【V1.06以降】
    不正な間接関数呼び出しを検出するコードを生成します。
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.02.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl02c0501y1209.html
     

Children
No Data