c - ATtiny2313 上的初始化堆栈指针

标签 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 代码中。 IE。我是否需要包含一个特殊的头文件或以某种方式表明它是汇编而不是 c.我对编程相对较新,如果能提供有关如何正确实现此代码或使我当前的 C 代码初始化堆栈指针的其他方法的任何帮助,我将不胜感激。

提前谢谢您。

斯蒂芬

最佳答案

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

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

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

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

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

关于c - ATtiny2313 上的初始化堆栈指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786942/

相关文章:

linux - 在 RHEL 6 中运行在 RHEL 7 gcc 4.7 中编译的二进制文件

c++ - 为什么 gcc 没有从多目标函数中捕获异常?

c - 在 x86 中将 union 对齐到 16 字节边界。

c - gcc 的原子操作和代码生成

assembly - ARM 汇编中.equation 和.word 之间的区别?

当 x 是 uint8 时,x |= 128 的好奇 gcc 编译器代码

c++ - 我可以在一个程序中混合使用 C 和 C++吗

c++ - 需要分析帮助

c - C 中数组的随机性 数组中的随机性

C 按位与 -O0 和 -O2 给出不同的结果