原创 IAR FOR AVR 编译环境中启动代码和堆栈设置的分析

2010-5-26 09:43 9467 12 12 分类: MCU/ 嵌入式

         IAR FOR AVR 编译环境中启动代码和堆栈设置的分析


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


1. 例子1


程序中仅包含一个空的main()函数,代码如下:


#include <ioavr.h>   


 


int main(void)


{


}


 


此时对应的map文件显示:


 


96d89ac6-f149-4980-956e-1c5f8b613e94.JPG


    表中CSTACK的区域由编译环境中DATA STACK的值确定,起始位置是0060H,而RSTACK区域的起始地址就是CSTACK的最大地址+1,即RSTACK紧接着CSTACK,其大小由编译环境则为Return address stack中的值*2


 


 


 


00000025都是中断向量表的区域,从00260049才是程序代码


中断向量表的区域如下图所示:


6cdb33d8-1c55-45e0-acb1-c28fef5a11b0.JPG



从表中可以看出,上电复位后的第一条指令就转移到启动代码?C_STARTUP中。


 


 


 


 


程序代码如下图所示:


2ba8c3b5-0ca9-4d34-a063-c8401a8956b0.JPG



 


在启动代码中,首先设置堆栈指针SP009FH,这个值就是MAP文件中给出的RSTACK区域的最大地址。


然后将(R29,R28)寄存器对设置成0080H,这个值就是MAP文件中给出的RSTACK区域的最小地址。


由于在AVR中,当压栈时,堆栈指针进行减法,出栈时进行加法,所以栈顶就是009FH,实际上堆栈可使用的区域为0080009FH。这部分区域主要用来保存返回地址,因此在编译环境中也被称为返回地址的堆栈,而CSTACK则称为数据堆栈。这个部分区域应该是用于局部变量的操作,因此要小心设置改值,否则会导致空间溢出。


 


2. 例子2


程序包含有一个main()函数,其中定义了一个10个字节的数组,如下图所示:


 


int main(void)


{


    unsigned char i;


    char s[10];


   


    for(i=0;i<10;i++)


    {


        s = 0x55;


    }


}


 


这个程序编译后,生成的MAP图如下:



 


 


76c0cf68-fd2e-495c-a858-073648c6d194.JPG从这里可以发现,没有CSTACKRSRTACK没有发生变化。


启动代码部分如下所示:


 


efbf5933-101e-4410-94a4-2fa58d103fe3.JPG



 

 

可以看出,也没有什么变化。那么再来看看main()函数的汇编代码,如下图所示:

80ab8f4a-b678-4fbc-930e-c0d72a92ea15.JPG


 



通过读代码,可以看出R16用于存储局部变量i,用于for循环的计数。而R28是个很关键的寄存器,它用来实现局部变量s[10]的存储,因为函数入口时,R28指向数据堆栈(即CSTACK)的最高地址+1,因此当函数的第一条指令SUBI R28,0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0A,就为在数据堆栈中开辟了一个数据空间,用于保存局部变量s[10]。循环时,通过将R28传给R30R310,将R28+0R28+9之间的RAM空间设置成55H。当离开函数时,通过SUB R28,0xF6,恢复R28的值,相当于释放了局部空间。


在这里特别需要指出的是,当局部变量的空间太大时,可能会产生错误的结果,即局部变量的使用空间超过了所设置的数据堆栈区域。例如,在程序中,将char  s[10],改成char  s[100],则新生成的代码如下:


 0b542585-9328-47f9-bc54-67348271329f.JPG



从这里可以看出,第一条就先将R28减去100,然后对R28-100的单元进行赋值,很明显,此时写入的地址已经不属于RAM空间了,这是很危险的事情。


 


                          2010517星期一

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条