硬件堆栈和软件堆栈

硬件堆栈和软件堆栈

ID:9395631

大小:44.50 KB

页数:4页

时间:2018-04-30

硬件堆栈和软件堆栈_第1页
硬件堆栈和软件堆栈_第2页
硬件堆栈和软件堆栈_第3页
硬件堆栈和软件堆栈_第4页
资源描述:

《硬件堆栈和软件堆栈》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、硬件堆栈和软件堆栈在AVR中的理解 (2010-02-0118:43:03)首先是从理论上的东西。。网上转载来的,后面是看AVR代码时得出的一些东西。硬件堆栈:或许也可以称作系统堆栈,是位于片内RAM区。有人说,只要能使用PUSH,POP指令的单片机,都可以说含有硬件堆栈。这样的说法我个人觉得不是很全面。通过指令进行压栈和出栈操作只是系统堆栈中的一种操做。系统堆栈还可以被隐含调用。例如,当调用子程序时,系统会主动把返回地址压入堆栈,并不需要用户通过指令操作。通常,栈底设在内存的高端,也就是把内存的最高一段空间划

2、作栈区。这些都是向下生长栈。栈指针可能是专用的寄存器,也可能借用一通用寄存器。也有单片机是在数据区里划一块作栈区,可能是向上生长,也可能是向下生长。硬件堆栈:是通过寄存器SPH,SPL做为索引指针的地址,是调用了CALL,RCALL等函数调用指令后硬件自动填充的堆栈!软件堆栈:是编译器为了处理一些参数传递而做的堆栈,会由编译器自动产生和处理,可以通过相应的编译选项对其进行编辑。简单一点说,硬件堆栈主要做为地址堆栈用,而软件堆栈主要会被分配成数据堆栈!---摘自《AVR单片机C语言开发入门指导》- P169---

3、    ICCAVR 使用两个堆栈:一个用于子程序调用和中断操作的硬件堆栈,一个用于传递参数、临时变量和局部变量的软件堆栈。可以使用堆栈检测函数检测两个堆栈是否溢出。单片机在执行调用子程序的指令时,一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等指令把它们人为地保存到堆栈中。自动入栈和“人为入栈”可能使用的是一个堆栈指针。有的单片机可以分开,比如AVR,可以通过“ST-Y,R0”这样的指令把R0存入软件堆栈区(Y是由R28和R29两个寄存器

4、的值组成的16位指针),有的单片机缺少这样的指令,就会把软件堆栈和硬件堆栈放在一个栈空间,都使用SP,比如51. 看其栈顶指针是否和CPU具有特殊的关联,有关联者(如SP)“硬”,而无关联者“软”。如果没有硬堆栈,你可以选定一个寄存器作堆栈指针,通过软件实现堆栈操作。移植μC/OS-II也不一定要硬堆栈。ARM就很难说它的堆栈是软的还是硬的。32位的ARM指令中没有PUSH、POP指令。ARM习惯上用R13作堆栈指针(SP),但用别的寄存器作堆栈指针也未常不可。ARM习惯上用LDM/STM(多寄存器加载/存储指

5、令)来操作堆栈,压多少,按什么顺序都能选择。应该说ARM是软硬结合的堆栈。C代码(AVR-GCC编译,优化等级-00):#includeintadd(inta,intb){    intc;    c=a+b;       returnc;}intmain(void){    inta=2,b=3,c=0;c=add(a,b);//c=sub(a,b);}汇编代码:(省略一些boot代码)。。。。。。。00000054<__ctors_end>:  54:    1124          

6、 eor    r1,r1  56:    1fbe           out    0x3f,r1    ;63     58:    cfe5           ldi    r28,0x5F    ;95         //此处Y指针和SP都指到了SRAM最高端  5a:    d4e0           ldi    r29,0x04    ;4  5c:    debf           out    0x3e,r29    ;62  5e:    cdbf           out   

7、 0x3d,r28    ;61。。。0000008e:#includeintadd(inta,intb){  8e:    cf93           push    r28  90:    df93           push    r29                   //保存了Y指针,此时SP已经-2,这里再减2  92:    cdb7           in    r28,0x3d    ;61       //重新定位Y指针跟SP一样。  94:    d

8、eb7           in    r29,0x3e    ;62  96:    2697           sbiw    r28,0x06    ;6      //减掉6,即向下开了6字节的区域,存放3变量  98:    0fb6           in    r0,0x3f    ;63  9a:    f894           cli  9c:    debf

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。