初始化ATtiny2313上的堆栈指针

时间:2013-02-09 10:02:17

标签: c gcc assembly avrdude

我使用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代码初始化堆栈指针的其他方法,我将不胜感激。

提前谢谢。

斯蒂芬

1 个答案:

答案 0 :(得分:1)

这实际上取决于你如何配置你的makefile以确定堆栈指针是否会被初始化。如果您正在使用gcc以及正常的编译和链接选项,则链接器会确保您的可执行文件中还包含一些启动代码crtX.o。链接器会自动为您的处理器选择正确的crtX.o文件并编译选项。

除其他事项外,crtX.o文件中的代码会将bss段清除为C标准所要求的全零,配置堆栈指针并在没有的情况下为正确的位置提供中断向量被覆盖了。

请记住,ATTiny2313只有128字节的SRAM。对于程序和堆栈中的任何初始化数据,此区域必须足够大。在调用函数之前,调用一个简单函数的过程将耗尽相当多的RAM字节来保存堆栈中的寄存器。

所以,我建议做这些事情:

  • 如果编译器提供了标准makefile,则使用标准makefile,它将确保包含标准启动代码,并且在调用main()之前正确设置堆栈/ RAM。
  • 打开链接器映射和符号文件输出,并验证您确实有一些可用于堆栈的空间。
  • Atmel IDE有一个合理的模拟器,所以尝试在模拟器中运行您的代码。您可以在调用函数和位置时查看堆栈使用情况。
  • 您可能恰好有堆栈溢出(这就是您来stackoverflow.com的原因吗?