Tiva C コントローラーに問題があり、これは非常に奇妙で、何か助けが欲しいのですが、基本的にsprintf
、明確な理由もなくライン上でクラッシュします。私のアプリケーションは、Bluetooth を介してさまざまなモードで制御できるスマート トイです。モードの場合、有限状態マシン コードを使用し、おもちゃの現在の加速度を監視するためだけに読み取り、値を更新するために数秒ごとに定期的な割り込みを生成する定期的なタイマーを使用して、定期的に送信されます。加速度
現在、加速度の読み取りは単純な関数によって行われます。読み取りは、その読み取りを文字列内に格納しようとするまでうまくいき、プログラムがハード フォールトをスローするだけです。この関数 (加速度を読み取る) は、常にクラッシュしてハードフォールトエラーをスローするこの新しいモードを除いて、おもちゃの車の他のすべてのモードで正常に機能します。私の現在の考えでは、関数呼び出しが多すぎてスタックがいっぱいになっている可能性がありますが、スタックがいっぱいかどうかをどのように知ることができますか?
これがクラッシュする行です:
sprintf(acceleration,"x%.2f y%.2f z%.2f", X_Axis1, Y_Axis1, Z_Axis1);
それは簡単ですsprintf
加速軸からの値の読み取りを格納しx
、y
そしてz
その後、加速変数に格納なぜこれが起こっている任意のアイデアを?
これは、タイマー ハンドラー内の keil に関する障害レポートでもあります。これは、ReadAccel()
私が作成した関数を呼び出すために使用したもので、最新のものを除くすべてのモードで動作するため、タイマー ハンドラー内の関数内のコードを移動して少し節約すると思いました。スタックからですが、それでもハード フォールトが発生しました
これがスタック フル エラーかどうかを判断する方法を教えてくれる人がいたら、これが本当のことだと思うので、とても感謝しています。
void TIMER2A_Handler(void)
{
char acceleration[22];
RawX_Axis1=ReadAccelX();
X_Axis1 = RawX_Axis1 * 0.00390625+0.35;
RawY_Axis1=ReadAccelY();
Y_Axis1 = RawY_Axis1 * 0.00390625+0.08;
RawZ_Axis1=ReadAccelZ();
Z_Axis1 = (RawY_Axis1 * 0.00390625)+1.08;
sprintf(acceleration,"x%.2f y%.2f z%.2f",X_Axis1,Y_Axis1,Z_Axis1);
UARTSend(UART3_BASE,acceleration);
UARTCharPut(UART3_BASE,'\n');
TIMER2_RIS_R = 0xFFFFFFFF;
TIMER2_ICR_R = 0xFFFFFFFF;
}
まず、sprintf を呼び出さずに、ハードコードされた文字列をUARTSend
. これでクラッシュが停止した場合は、クラッシュのsprintf
原因を突き止める必要があります。私は 2 つの問題を認識しています。
sprintf に 22 バイトのバッファーを割り当てますが、これは各加速に 6 文字しか許可されないため (マイナス記号と小数点を含む)、小さすぎる可能性があります。各アクセラレータを個別にフォーマットして送信してみてください。また、sprintf での潜在的なスタック オーバーフローを軽減する可能性があります。
また、簡略化されたインライン文字列変換を使用してみてください。たとえば、各数値を 100 倍した後 (2 dp の固定小数点数が得られます) int にキャストし、単純な除算と 10 による mod を使用し、0x30 (ASCII 0
) に加算して文字列を作成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加