资源描述:
《AVR单片机程序调用堆栈控制使用心得.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、AVR单片机程序调用堆栈控制使用心得堆栈指针(SP)是一个指示堆栈顶部地址的16位寄存器。在ICCAVR中,它被用作指向硬件堆栈的堆栈指针。AVR单片机上电复位后,SP指针的初始值为0x0000,由于AVR单片机的堆栈是向下生长的(从高地址向低地址生长),所以系统程序一开始必须对堆栈指针SP进行初始化,即将SP的值设为数据存储空间的最高地址。ICCAVR编译器在链接C程序文件的时候,会自动在程序头链入startup文件。startup文件里面的程序将会去做初始化SP指针的工作。Startup文件没有办
2、法通过手动编程来修改,只能通过编译器ICCAVR设置来修改,修改堆栈的设置通过下面的两个步骤来实现:默认的ReturnStackSize大小是16。在程序设计中出现的问题:voidmain(){displayboat(1);}voiddisplayboat(chari){inttd;boat[i].x=(char)(120+boat[i].log*showk);boat[i].y=(char)(120+boat[i].lang*showk);td=(int)(boat[i].d+boat[i].tur
3、n);showboat(boat[i].x,boat[i].y,td,i);boat[i].x5=2*boat[i].x1-boat[i].x;boat[i].y5=2*boat[i].y1-boat[i].y;showboat(boat[i].x,boat[i].y,boat[i].d,i);boat[i].x4=2*boat[i].x1-boat[i].x;boat[i].y4=2*boat[i].y1-boat[i].y;linex(boat[1].x1,boat[1].y1,boat[1].x
4、2,boat[1].y2,7);linex(boat[1].x1,boat[1].y1,boat[1].x3,boat[1].y3,7);linex(boat[1].x2,boat[1].y2,boat[1].x3,boat[1].y3,7);linex(boat[1].x,boat[1].y,boat[1].x4,boat[1].y4,7);xuline(boat[1].x,boat[1].y,boat[1].x5,boat[1].y5,7);}程序调用displayboat计算几个作标值,并通过l
5、inex和xuline两个直线函数将这些点连起来,但是该程序在运行的时候出现错误,在displayboat里面的linex和xuline两个子函数没有正确运行,画的直线乱跑,通过修改成以下程序后:voidmain(){displayboat(1);linex(boat[1].x1,boat[1].y1,boat[1].x2,boat[1].y2,7);linex(boat[1].x1,boat[1].y1,boat[1].x3,boat[1].y3,7);linex(boat[1].x2,boat[1
6、].y2,boat[1].x3,boat[1].y3,7);linex(boat[1].x,boat[1].y,boat[1].x4,boat[1].y4,7);xuline(boat[1].x,boat[1].y,boat[1].x5,boat[1].y5,7);}voiddisplayboat(chari){inttd;boat[i].x=(char)(120+boat[i].log*showk);boat[i].y=(char)(120+boat[i].lang*showk);td=(int)(
7、boat[i].d+boat[i].turn);showboat(boat[i].x,boat[i].y,td,i);boat[i].x5=2*boat[i].x1-boat[i].x;boat[i].y5=2*boat[i].y1-boat[i].y;showboat(boat[i].x,boat[i].y,boat[i].d,i);boat[i].x4=2*boat[i].x1-boat[i].x;boat[i].y4=2*boat[i].y1-boat[i].y;}即把调用画直线函数调到主函数,
8、减少了函数调用的层数,通过这样的修改程序正常运行,可以得出结果,按照默认的ReturnStackSize,函数调用的堆栈不够用,会出现程序调用错误。尝试修改ReturnStackSize的值来运行修改前的函数,我试过将ReturnStackSize改为32,结果程序连基本的函数运行都出错,把ReturnStackSize改为18、17程序的运行结果和16类似,但是略有区别,问题还是出现在linex和xuline两个函数的调用问题上。通过对比ReturnS