收藏 分享(赏)

AVR单片机程序调用堆栈控制使用心得.doc

上传人:gnk289057 文档编号:12338244 上传时间:2021-12-11 格式:DOC 页数:4 大小:103.50KB
下载 相关 举报
AVR单片机程序调用堆栈控制使用心得.doc_第1页
第1页 / 共4页
AVR单片机程序调用堆栈控制使用心得.doc_第2页
第2页 / 共4页
AVR单片机程序调用堆栈控制使用心得.doc_第3页
第3页 / 共4页
AVR单片机程序调用堆栈控制使用心得.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、AVR 单片机程序调用堆栈控制使用心得堆栈指针(SP)是一个指示堆栈顶部地址的 16 位寄存器。在 ICCAVR 中,它被用作指向硬件堆栈的堆栈指针。AVR 单片机上电复位后,SP 指针的初始值为 0x0000,由于AVR 单片机的堆栈是向下生长的(从高地址向低地址生长) ,所以系统程序一开始必须对堆栈指针 SP 进行初始化,即将 SP 的值设为数据存储空间的最高地址。ICCAVR 编译器在链接 C 程序文件的时候,会自动在程序头链入 startup 文件。startup 文件里面的程序将会去做初始化 SP 指针的工作。Startup 文件没有办法通过手动编程来修改,只能通过编译器 ICCAV

2、R 设置来修改,修改堆栈的设置通过下面的两个步骤来实现:默认的 Return Stack Size 大小是 16。在程序设计中出现的问题:void main()displayboat(1); void displayboat(char i) int td;boati.x=(char)(120+boati.log*showk);boati.y=(char)(120+boati.lang*showk);td=(int)(boati.d+boati.turn);showboat(boati.x,boati.y,td,i);boati.x5=2*boati.x1-boati.x; boati.y5=2

3、*boati.y1-boati.y;showboat(boati.x,boati.y,boati.d,i);boati.x4=2*boati.x1-boati.x; boati.y4=2*boati.y1-boati.y;linex(boat1.x1,boat1.y1,boat1.x2,boat1.y2,7);linex(boat1.x1,boat1.y1,boat1.x3,boat1.y3,7);linex(boat1.x2,boat1.y2,boat1.x3,boat1.y3,7);linex(boat1.x,boat1.y,boat1.x4,boat1.y4,7);xuline(boat

4、1.x,boat1.y,boat1.x5,boat1.y5,7);程序调用 displayboat 计算几个作标值,并通过 linex 和 xuline 两个直线函数将这些点连起来,但是该程序在运行的时候出现错误,在 displayboat 里面的 linex 和xuline 两个子函数没有正确运行,画的直线乱跑,通过修改成以下程序后:void main()displayboat(1);linex(boat1.x1,boat1.y1,boat1.x2,boat1.y2,7);linex(boat1.x1,boat1.y1,boat1.x3,boat1.y3,7);linex(boat1.x2,

5、boat1.y2,boat1.x3,boat1.y3,7);linex(boat1.x,boat1.y,boat1.x4,boat1.y4,7);xuline(boat1.x,boat1.y,boat1.x5,boat1.y5,7); void displayboat(char i)int td;boati.x=(char)(120+boati.log*showk);boati.y=(char)(120+boati.lang*showk);td=(int)(boati.d+boati.turn);showboat(boati.x,boati.y,td,i);boati.x5=2*boati.x

6、1-boati.x; boati.y5=2*boati.y1-boati.y;showboat(boati.x,boati.y,boati.d,i);boati.x4=2*boati.x1-boati.x; boati.y4=2*boati.y1-boati.y;即把调用画直线函数调到主函数,减少了函数调用的层数,通过这样的修改程序正常运行,可以得出结果,按照默认的 Return Stack Size,函数调用的堆栈不够用,会出现程序调用错误。尝试修改 Return Stack Size 的值来运行修改前的函数,我试过将 Return Stack Size 改为32,结果程序连基本的函数运行都

7、出错,把 Return Stack Size 改为 18、17 程序的运行结果和 16 类似,但是略有区别,问题还是出现在 linex 和 xuline 两个函数的调用问题上。通过对比 Return Stack Size 值为 16、17、18 的显示结果,感觉 Return Stack Size 值为16 的显示结果比较理想,因此尝试将 Return Stack Size 改为 8,结果程序正常运行,linex和 unline 都正常的画出直线来。结果分析:Return Stack Size 的定义出现岐义,开始的时候将 Return Stack Size 理解为返回堆栈的总大小,即用来存放

8、堆栈的地址范围大小,所以有了将 Return Stack Size 改大的行为,后来经过尝试将 Return Stack Size 改小后程序正常运行,便重新理解了 Return Stack Size 的含义:Return Stack Size 为返回堆栈值的大小,在堆栈总大小固定的前提下,Return Stack Size 越小,可以存放的堆栈指针值越多,可以调用的函数层数也相应增加了,不过这个是针对我自己的程序实践得到的经验,不一定准确。可能存在的 BUG:堆栈寻址能力下载,原来 16 位可以访问的空间远大于现在的 8 位地址,日后的程序设计上可能出现程序编译时候的地址寻址出错,如果出现程序单独运行正常而在被调用的时候出现错,应该尝试修改 Return Stack Size 的值到一个合理的范围。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报