sprintfの引数に関して

RL78G14でプログラムを作成中、マイコンが動作異常(リセットがかかったようなな感じ?)になるときがあり調査したところ、以下のコードが原因であることがわかりました。

#include "stdio.h"

char title[] = "xxxxxx";     // 何らかの文字列指定

char debug_send[128];

main(){

   sprintf(debug_send,"%s",title);     // このコードが原因でたまにマイコン動作が異常になる

    ....

}

もともとがtitleからdebug_sendへ文字列に変換し格納することが目的だったため、strcpyと入れ替えたところ現象は発生しなくなりました。

E2 Liteでデバッグしているのですが、デバッグ中は発生せず、ROMに書き込んだ後たまに発生することから内部でどのようなことになっているかはっきりしていません。

 

同じような現象、および、明確にこのコードが悪いという情報はありますでしょうか?

ビルドバージョン 1.06.00/1.08.00

最適化レベルはデバッグ優先

  • > 以下のコードが原因であることがわかりました。

    絞り込んだ箇所が原因とも限らないと思いますが、どうしてそこが原因とわかりましたか?

    > char title[] = "xxxxxx";     // 何らかの文字列指定

    実際のプログラムに「何らかの文字列指定」とコメントは書かないと思うので適当に改変されてるのだと思いますが、改変され削られた部分が原因の可能性もありうるので

    > 同じような現象、および、明確にこのコードが悪いという情報はありますでしょうか?

    というのは質問として厳しいと思います。

    > ビルドバージョン 1.06.00/1.08.00

    この数字は何を言われてますか?

  • マイコンは異なりますが、リンクオプションのROMからRAMにマップするセクションの設定が抜けていた際に、sprintfを使用すると異常動作してしまう事がありました。
    標準ライブラリもほぼ使っておらず、自作プログラムの部分でも初期化済み変数をを使っていなかったので、当時は原因がなかなか分かりませんでした。
    明確な情報では無く申し訳ありませんが参考になれば幸いです。
  • 基本的な事ですが、スタックポインタは設定していますか?
  • こんにちは

    >ROMに書き込んだ後
    ということですのでデバッグ用に書き込んだものをそのまま単体で使っていることは無さそうですが参考までにこんなFAQもあります。
    ja-support.renesas.com/.../17796187
  • 菅原です。

    printf系の関数はスタックを多く使います。
    sprintfコールした時に設定したスタックのエリアをオーバーしてしまっているかもしれません。


    CS+であれば スタック見積もりツール (Call Walker) を使ってどのくらいスタックを消費しているか確認します。スタックの設定より大きければ、 スタックの設定を大きくします。十分なスタックを確保できるほど メモリがなければsprintfの利用をやめる ということになります。
  • なぜ、タイトルに「引数」があるのでしょうか?本文から「引数」が導かれる流れが解りません。

    マニュアル等の再確認をせずに記憶だけによる書き込みです。
    SHのsprintf等はヒープを使っているようです。また、SHではワークスペース作成時にスタックとヒープのサイズをアプリケーション作成者が設定してその中で処理が済まされるようにしなければなりません。
    少し前にRL78のスタックが話題になった際にスタックとヒープの取り方を少し調べてみたのですが解らず放置してます。
    私はsprintfなどを作成したことが無いのですが、引数の個数が可変の場合はヒープを使うご利益があるのではと予想してます。
  • こんにちは。まずは「リセット」なのか「それっぽい別の現象」なのかを診断し、リセットであればリセット要因は何か吐き出してみては如何でしょうか。ちなみに私は以前RAMパリティでハマったことがあります。デバッガでは現象が出ない、客先でも普通に起動するのですが、特定の動作でリセットが掛かるというものでした。
  • じまさま
    情報誠にありがとうございます。デバッグ→単体はデバッグ用でそのままテストをやっていたのですが、FlashProgrammerでも書込みして確認をしました。
    RAMパリティエラーの項目は完全に読み落としていました。非常に参考になりました。
  • みかんさま
    RAMパリティ関連含め、リセット要因かどうか切り分け検証を行ってみます。
    ご回答誠にありがとうございます。
  • kijoさま
    ご回答ありがとうございます。
    SHは過去に使用したことがあるので、ヒープの設定も行っていた記憶があります。
    今回は固定長(20文字程度:このあたりの情報がなくて申し訳ありませんでした)ですので特にスタック/ヒープの意識はありませんでした。