3

ARMマイクロからOLEDディスプレイに表示するために、snprintfを使用して整数を文字列に出力しようとしています。ただし、%dまたは%uを使用すると、マイクロがロックされて実行が停止します。%xまたは%cの使用は正常に機能しますが、出力はあまり使用されません。

この動作の原因は何ですか?残念ながら、デバッグするJTAGデバイスにアクセスできません。私はarm-none-eabi-gccを使用してコンパイルしており、すべてmapleminiで実行されています。

アップデート

10未満の値を渡すと、機能するようです。

4

4 に答える 4

2

これは実際、私が使用していたRTOSのスタックサイズの問題であることが判明しました。snprintf呼び出しの複雑さが増したことで、制限を超えてクラッシュしたと思います。

これに答えてくれたすべての人に感謝します!

于 2011-10-10T13:52:24.283 に答える
1

10未満の値を渡すと、機能するようです。

これは、あなたが行方不明/機能していない分割ルーチンを持っているかのように私には聞こえます。printf / sprintfは通常、10進数を10で連続して除算して出力します。10未満の数値の場合、除算は不要であり、おそらくそれが機能しない理由です。

確認するには、2つの変数を除算する関数を作成します(定数による除算は通常、コンパイラーによる乗算に最適化されます)。例えば:

int t()
{
  volatile int a, b; // use volatile to prevent compiler optimizations
  a = 123;
  b = 10;
  return a/b;
};

また、ビルドログでリンクの警告を確認してください。

于 2011-10-10T12:04:54.447 に答える
0

スコープ内にプロトタイプがありますか?snprintf()はvarargs関数であり、varargsを呼び出すには、関数が引数を期待する場所で引数を取得するためのいくつかのトリックが必要になる場合があります。

また、varargs関数を呼び出すときは、常に適切な型を使用してください。('%'の後の型は、snprintf()がどこかで見つけることを期待する型であり、'どこか'は型に依存することさえあります。何でもかまいません...)あなたの場合: "%X"はunsignedintを期待します。関数呼び出しでパラメーターをキャストするか、「unsignedintsweeplow」を使用して彼女に渡してください。それを定義するとき。負の周波数またはカウントはとにかく意味がありません。

于 2011-10-08T11:56:12.623 に答える
0

%x%u両方が同じタイプを指定しているため、タイプエラーになることはありません。したがって、snprintfそれ自体が問題である必要があります。2つの主な違いは、%u整数を除算して余りを計算する必要があるのに対し%x、シフトとマスクでうまくいくことです。

Cライブラリが使用しているものとは異なる種類のARMプロセッサ用にコンパイルされている可能性があり、商または剰余を計算するために不正な命令を使用している可能性があります。

CortexM3用にライブラリをコンパイルしていることを確認してください。例えば、

gcc -mcpu=cortex-m3 ...
于 2011-10-08T10:21:03.377 に答える