0

为什么我们需要在AVR汇编编程的程序开始时初始化堆栈指针

必须点击链接

4

3 回答 3

1

您的汇编程序正在调用子程序。当您这样做时,返回地址使用堆栈指针存储在堆栈中,因此初始化它以指向 RAM 中的适当位置很重要。ATmega328P 数据表说:

在中断和子程序调用期间,返回地址程序计数器 (PC) 存储在堆栈中。Stack 在通用数据 SRAM 中有效分配,因此 Stack 大小仅受 SRAM 总大小和 SRAM 使用情况的限制。所有用户程序都必须在复位程序中初始化 SP(在执行子程序或中断之前)。堆栈指针 (SP) 可在 I/O 空间中进行读/写访问。数据 SRAM 可以通过 AVR 架构支持的五种不同寻址模式轻松访问。

于 2017-10-26T15:19:11.620 回答
0

很简单,答案直接来自数据表 - 查找堆栈指针。堆栈指针初始值为 0x0000,表示如果未初始化,它将指向寄存器 R0(地址为 0x0000)。您不希望这样,因为您使用 R0 和其他寄存器来执行操作。这就是为什么要将堆栈设置为其他一些内存区域,特别是内部 SRAM(通用 RAM 区域)。

于 2017-10-26T09:22:28.697 回答
0

这取决于您使用的微控制器。较旧的 AVR 的堆栈指针由硬件初始化为 0x0000。RAMEND在使用子例程或中断之前,您必须将其更改为合理的(通常)。较新的 AVR 的堆栈指针由硬件初始化为RAMEND,因此您不需要软件初始化。

您必须查看数据表以查看您的特定 MCU 是否需要该软件初始化。如有疑问,无论如何都要这样做:它不会造成伤害(它只需要 4 个 CPU 周期)并且它可以使您的代码更可移植。此外,引导加载程序可能已更改堆栈指针。

于 2017-10-29T20:30:56.917 回答