我使用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代码初始化堆栈指针的其他方法,我将不胜感激。
提前谢谢。
斯蒂芬
答案 0 :(得分:1)
这实际上取决于你如何配置你的makefile以确定堆栈指针是否会被初始化。如果您正在使用gcc
以及正常的编译和链接选项,则链接器会确保您的可执行文件中还包含一些启动代码crtX.o
。链接器会自动为您的处理器选择正确的crtX.o
文件并编译选项。
除其他事项外,crtX.o
文件中的代码会将bss段清除为C标准所要求的全零,配置堆栈指针并在没有的情况下为正确的位置提供中断向量被覆盖了。
请记住,ATTiny2313只有128字节的SRAM。对于程序和堆栈中的任何初始化数据,此区域必须足够大。在调用函数之前,调用一个简单函数的过程将耗尽相当多的RAM字节来保存堆栈中的寄存器。
所以,我建议做这些事情:
main()
之前正确设置堆栈/ RAM。