d IAR FOR AVR 编译环境几个要点.doc_第1页
d IAR FOR AVR 编译环境几个要点.doc_第2页
d IAR FOR AVR 编译环境几个要点.doc_第3页
d IAR FOR AVR 编译环境几个要点.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IAR FOR AVR 编译环境中启动代码和堆栈设置的分析1 例子1程序中仅包含一个空的main()函数,代码如下:#include int main(void)此时对应的map文件显示: 表中CSTACK的区域由编译环境中DATA STACK的值确定,起始位置是0060H,而RSTACK区域的起始地址就是CSTACK的最大地址1,即RSTACK紧接着CSTACK,其大小由编译环境则为Return address stack中的值*2。从00000025都是中断向量表的区域,从00260049才是程序代码中断向量表的区域如下图所示:从表中可以看出,上电复位后的第一条指令就转移到启动代码?C_STARTUP中。程序代码如下图所示:在启动代码中,首先设置堆栈指针SP位009FH,这个值就是MAP文件中给出的RSTACK区域的最大地址。然后将(R29,R28)寄存器对设置成0080H,这个值就是MAP文件中给出的RSTACK区域的最小地址。由于在AVR中,当压栈时,堆栈指针进行减法,出栈时进行加法,所以栈顶就是009FH,实际上堆栈可使用的区域为0080到009FH。这部分区域主要用来保存返回地址,因此在编译环境中也被称为返回地址的堆栈,而CSTACK则称为数据堆栈。这个部分区域应该是用于局部变量的操作,因此要小心设置改值,否则会导致空间溢出。2 例子2程序包含有一个main()函数,其中定义了一个10个字节的数组,如下图所示:int main(void) unsigned char i; char s10; for(i=0;i10;i+) si = 0x55; 这个程序编译后,生成的MAP图如下:从这里可以发现,没有CSTACK和RSRTACK没有发生变化。启动代码部分如下所示:可以看出,也没有什么变化。那么再来看看main()函数的汇编代码,如下图所示:通过读代码,可以看出R16用于存储局部变量i,用于for循环的计数。而R28是个很关键的寄存器,它用来实现局部变量s10的存储,因为函数入口时,R28指向数据堆栈(即CSTACK)的最高地址+1,因此当函数的第一条指令SUBI R28,0x0A,就为在数据堆栈中开辟了一个数据空间,用于保存局部变量s10。循环时,通过将R28传给R30,R31清0,将R28+0到R28+9之间的RAM空间设置成55H。当离开函数时,通过SUB R28,0xF6,恢复R28的值,相当于释放了局部空间。在这里特别需要指出的是,当局部变量的空间太大时,可能会产生错误的结果,即局部变量的使用空间超过了所设置的数据堆栈区域。例如,在程序中,将char s10,改成char s100,则新生成的代码如下:从这里可以看出,第一条就先将R28减去100,然后对R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论