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 代码中。IE。我需要包含一个特殊的头文件还是以某种方式表示它是汇编而不是c。我对编程比较陌生,我将不胜感激有关如何正确实现此代码或使我当前的 c 代码初始化堆栈指针的另一种方法的任何帮助。

先感谢您。

斯蒂芬

4

1 回答 1

1

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

除此之外,crtX.o文件中的代码将按照 C 标准的要求将 bss 段清除为全零,配置您的堆栈指针并在正确的位置为那些未被覆盖的中断向量提供中断向量。

请记住,ATTiny2313 只有 128 字节的 SRAM。该区域必须足够大,以容纳程序和堆栈中的任何初始化数据。只是调用一个简单函数的过程会在调用函数之前使用相当多的 RAM 字节来保存堆栈上的寄存器。

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

  • 如果您的编译器提供了标准makefile,则使用标准makefile,它将确保包含标准启动代码并且在main()调用之前正确设置堆栈/RAM。
  • 打开链接器映射和符号文件输出,并验证您确实有一些可用空间可用于堆栈。
  • Atmel IDE 有一个合理的模拟器,因此请尝试在模拟器中运行您的代码。当您调用函数和定位任何奇怪的行为时,您将能够观察堆栈使用情况。
  • 您可能只是碰巧发生了堆栈溢出(这就是您来到stackoverflow.com的原因,对吧?
于 2013-02-09T10:49:24.020 回答