×
单片机 > 单片机程序设计 > 详情

关于ARM堆栈的一些问题

发布时间:2020-08-27 发布时间:
|
学习ARM寻址方式的时候,里面有种寻址为堆栈寻址。

ARM7中的寄存器R13就是作为堆栈指针SP的。堆栈内容的增减,就会影响堆栈指针的移动。这个移动方向与堆栈的生长方向有关。

ARM7的有两种堆栈生长方向。

1.向上生长  在像堆栈写入数据后,堆栈指针的值变大,也就是向高地址方向生长,这种是递增堆栈。

2.向下生长 在像堆栈写入数据后,堆栈指针的值变小,也就是向低地址方向生长,这种是递减堆栈。

 

要注意的问题不仅仅是堆栈增长方向。还要考虑到堆栈指针指向的存储单元是否已经保存有堆栈数据,或者说入栈时是否可以直接向堆栈指针指向的存储单元写入数据。这就是“满堆栈”与“空堆栈”。

1.满堆栈  堆栈指针指向最后压入栈的有效数据项,称为满堆栈。此时堆栈入栈操作要先调整指针再写入数据;

2.空堆栈  堆栈指针指向下一个待压入数据的空位置,称为空堆栈。此时堆栈的入栈操作的入栈操作要先先写入数据再调整指针。

 

综合以上叙述,就可以得到四种堆栈类型,分别为满递增,空递增,满递减,空递减。

 

  然后我想到了uc/OS-II中就有与堆栈类型密切相关的东西,移植ucOS-II到相应平台上,就要考虑到堆栈类型。我看书上说到ADS1.2堆栈类型只支持满递减。此时我的问题就出来了,堆栈类型具体应该是跟MCU有关,而不同的编译器又支持不同的类型,是不是这样呢,最后我在ADS1.2文件的一个讲ATPCS的PDF中找到了答案,原来就是这样,ADS1.2只能满递减。一下就是PDF中的截图。

关键字:ARM  堆栈  连续空间 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机语音识别电路模块设计