2013-02-09 102 views
0

我使用avrdude和makefile編寫ATtiny2313。我相信堆棧指針沒有正確初始化,因爲當我調用一個函數時,程序似乎凍結。我發現以下彙編代碼:在ATtiny2313上初始化堆棧指針

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

我認爲可能會工作,但我不知道如何將它合併到我創建的c代碼中。即。我需要包含一個特殊的頭文件或以某種方式表示它是彙編而不是c。我對編程相對來說比較新,對於如何正確實現這些代碼或者使我當前的c代碼初始化堆棧指針的其他方法,我將不勝感激。

預先感謝您。

斯蒂芬

回答

1

這真的取決於你是如何得到你的makefile配置爲堆棧指針是否將被初始化。如果您使用的是gcc以及正常的編譯和鏈接選項,則鏈接器將確保某些啓動代碼crtX.o也包含在您的可執行文件中。鏈接器會自動爲您的處理器和編譯選項選擇正確的crtX.o文件。

除其他外,crtX.o文件中的代碼將按照C標準的要求將bss段清零爲全零,配置堆棧指針併爲未覆蓋的地址提供正確位置的中斷向量。

請記住,ATTiny2313只有128字節的SRAM。這個區域必須足夠大,以適應程序和堆棧中的任何初始化數據。調用簡單函數的過程在調用函數之前會佔用相當數量的RAM字節來保存堆棧中的寄存器。

所以,我建議你做這些事:

  • 如果是由你的編譯器提供使用標準Makefile,這樣可保證標準的啓動代碼包含和堆棧/ RAM是在調用main()之前正確設置。
  • 打開鏈接器映射和符號文件輸出,並驗證您實際上是否有可用於堆棧的空間。
  • Atmel IDE有一個合理的模擬器,所以請嘗試在模擬器中運行您的代碼。當您調用函數和定位任何奇怪的行爲時,您將能夠觀察堆棧使用情況。
  • 你可能會碰巧有一個堆棧溢出(這就是爲什麼你來到stackoverflow.com對不對?