为什么我们需要在AVR程序集编程程序的初始化中初始化堆栈指针
答案 0 :(得分:1)
您的程序集程序正在调用子程序。执行此操作时,返回地址使用堆栈指针存储在堆栈中,因此将其初始化为指向RAM中的适当位置非常重要。 ATmega328P datasheet说:
在中断和子程序调用期间,返回地址程序计数器(PC)存储在堆栈中。该 堆栈在通用数据SRAM中有效分配,因此堆栈大小仅受限于 总SRAM大小和SRAM的使用。所有用户程序必须在Reset例程中初始化SP (在执行子程序或中断之前)。堆栈指针(SP)可在I / O空间中进行读/写访问。 通过AVR支持的五种不同寻址模式,可以轻松访问数据SRAM 架构。
答案 1 :(得分:0)
非常简单,答案直接来自数据表 - 寻找堆栈指针。堆栈指针初始值为0x0000,这意味着如果未初始化,它将指向寄存器R0(哪个地址为0x0000)。您不希望这样,因为您使用R0和其他寄存器来执行操作。这就是为什么要将堆栈设置为其他内存区域,特别是内部SRAM(通用RAM区域)的原因。
答案 2 :(得分:0)
这取决于您使用的微控制器。较旧的AVR使堆栈指针由硬件初始化为0x0000。在使用子例程或中断之前,您必须将其更改为合理的(通常为RAMEND
)。较新的AVR将堆栈指针由硬件初始化为RAMEND
,因此您不需要软件初始化。
您必须检查数据表,看看您的特定MCU是否需要软件初始化。如果有疑问,无论如何都要这样做:它不会造成伤害(只需4个CPU周期),它可以使您的代码更加便携。此外,引导加载程序可能已更改堆栈指针。