- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
d IAR FOR AVR 编译环境几个要点
IAR FOR AVR 编译环境中启动代码和堆栈设置的分析
例子1
程序中仅包含一个空的main()函数,代码如下:
#include ioavr.h
int main(void)
{
}
此时对应的map文件显示:
表中CSTACK的区域由编译环境中DATA STACK的值确定,起始位置是0060H,而RSTACK区域的起始地址就是CSTACK的最大地址+1,即RSTACK紧接着CSTACK,其大小由编译环境则为Return address stack中的值*2。
从0000-0025都是中断向量表的区域,从0026-0049才是程序代码
中断向量表的区域如下图所示:
从表中可以看出,上电复位后的第一条指令就转移到启动代码?C_STARTUP中。
程序代码如下图所示:
在启动代码中,首先设置堆栈指针SP位009FH,这个值就是MAP文件中给出的RSTACK区域的最大地址。
然后将(R29,R28)寄存器对设置成0080H,这个值就是MAP文件中给出的RSTACK区域的最小地址。
由于在AVR中,当压栈时,堆栈指针进行减法,出栈时进行加法,所以栈顶就是009FH,实际上堆栈可使用的区域为0080到009FH。这部分区域主要用来保存返回地址,因此在编译环境中也被称为返回地址的堆栈,而CSTACK则称为数据堆栈。这个部分区域应该是用于局部变量的操作,因此要小心设置改值,否则会导致空间溢出。
例子2
程序包含有一个main()函数,其中定义了一个10个字节的数组,如下图所示:
int main(void)
{
unsigned char i;
char s[10];
for(i=0;i10;i++)
{
s[i] = 0x55;
}
}
这个程序编译后,生成的MAP图如下:
从这里可以发现,没有CSTACK和RSRTACK没有发生变化。
启动代码部分如下所示:
可以看出,也没有什么变化。那么再来看看main()函数的汇编代码,如下图所示:
通过读代码,可以看出R16用于存储局部变量i,用于for循环的计数。而R28是个很关键的寄存器,它用来实现局部变量s[10]的存储,因为函数入口时,R28指向数据堆栈(即CSTACK)的最高地址+1,因此当函数的第一条指令SUBI R28,0x0A,就为在数据堆栈中开辟了一个数据空间,用于保存局部变量s[10]。循环时,通过将R28传给R30,R31清0,将R28+0到R28+9之间的RAM空间设置成55H。当离开函数时,通过SUB R28,0xF6,恢复R28的值,相当于释放了局部空间。
在这里特别需要指出的是,当局部变量的空间太大时,可能会产生错误的结果,即局部变量的使用空间超过了所设置的数据堆栈区域。例如,在程序中,将char s[10],改成char s[100],则新生成的代码如下:
从这里可以看出,第一条就先将R28减去100,然后对R28-100的单元进行赋值,很明显,此时写入的地址已经不属于RAM空间了,这是很危险的事情。
2010年5月17日星期一
您可能关注的文档
最近下载
- 2024年公共卫生与预防医学继续教育平台“大学习”活动线上培训栏目考试题库(1392题).docx
- 自动化仪表选型设计规范.pdf VIP
- 1222 QEOSP•B-02记录控制程序.doc
- 天人合一的园林.ppt
- 迪安诊断-市场前景及投资研究报告:“服务+产品”双轮驱动,医学诊断服务整体解决方案提供商.pdf
- 2024中国新型储能行业发展白皮书-储能领跑者联盟.pdf VIP
- 小学科学苏教版三年级上册全册教案(2023秋新课标版).doc
- 【小升初】2023-2024学年外研版(三起)英语秋季开学分班考摸底测试卷(四)含答案.pdf
- MG450/1170-WD型交流电牵引采煤机说明书.doc
- 留守儿童基本情况登记表.docx
文档评论(0)