0

avrdude と makefile を使用して ATtiny2313 をプログラミングしています。関数を呼び出すとプログラムがフリーズしたように見えるため、スタック ポインターが適切に初期化されていないと思います。次のアセンブリ コードを見つけました。

.include "tn2313def.inc"
ldi r16, low(RAMEND)   ; Main program start 
out SPL,r16      ;Set Stack Pointer to top of RAM

うまくいくと思いますが、作成したcコードにどのように組み込むことができるかわかりません。すなわち。c. 特別なヘッダー ファイルをインクルードする必要がありますか、それともアセンブリではなくアセンブリであることを示す必要がありますか。私はプログラミングに比較的慣れていないので、このコードを適切に実装する方法、または現在の C コードをスタック ポインターに初期化する別の方法について、助けていただければ幸いです。

前もって感謝します。

スティーブン

4

1 に答える 1

1

スタック ポインターが初期化されるかどうかは、makefile の構成方法によって異なります。通常のコンパイルおよびリンク オプションを使用している場合gcc、リンカーは、一部のスタートアップ コードcrtX.oも実行可能ファイルに含まれていることを確認します。crtX.oリンカは、プロセッサとコンパイル オプションに適したファイルを自動的に選択します。

とりわけ、crtX.oファイル内のコードは、bss セグメントをクリアして C 標準で要求されているようにすべてゼロにし、スタック ポインターを構成し、オーバーライドされていない割り込みベクターを正しい場所に提供します。

ATTiny2313 には 128 バイトの SRAM しかないことに注意してください。この領域は、プログラムとスタックにある初期化されたデータに対して十分な大きさでなければなりません。単純な関数を呼び出すプロセスだけでも、関数を呼び出す前にレジスタをスタックに保存するために、かなりの数の RAM を使用します。

したがって、次のことを行うことをお勧めします。

  • main()標準の makefile がコンパイラによって提供されている場合は、それを使用してください。これにより、標準のスタートアップ コードが含まれ、が呼び出される前にスタック/RAM が正しく設定されていることが保証されます。
  • リンカー マップとシンボル ファイルの出力をオンにして、スタックに使用できる空き領域が実際にあることを確認します。
  • Atmel IDE には妥当なシミュレーターがあるので、シミュレーターでコードを実行してみてください。関数と場所を呼び出しているときにスタックの使用状況を監視し、奇妙な動作を見つけることができます。
  • たまたまスタック オーバーフローが発生した可能性があります (これが、stackoverflow.comにアクセスした理由ですよね?
于 2013-02-09T10:49:24.020 に答える