最近,在写程序的时候,碰到一个在自己看来非常不可思议的问题。当然,或者高手就觉得大惊少怪了,呵呵。 以下是问题相关: 平台:MEGA64; 编译环境:codeVisonAVR; 问题:一个全局变量在定义的时候直接赋值为0,但在程序运行过程中,没有改变该变量的操作,可是奇怪的是,程序在运行一段时间之后,这个全局变量居然自动改变了。 发现问题之后,我很难理解,一直无法找到原因。 一开始,我就怀疑是不是哪里的存储空间溢出重叠了,但由于对各种变量的存储位置,不是十分的了解,也就没有再对此做更深层的探究;其次,我怀疑是不是哪里的指针跳错了,跳到全局变量那里,造成全局变量的改变,不过对于这一点,我又自认很仔细的检查了程序,的确没有发现指针跳错的地方。 现在看来,其实,我的两个怀疑,都和指针有关的。 后来,和志刚讨论一下,他一开始就提出:是不是堆设置不够。他说的堆是指hardware stack,我一开始不知道什么是hardware stack的。我猜他的意思是说,用于程序返回堆栈的空间太小了,以至于,硬件堆栈溢出,覆盖了全局变量,自然造成全局变量的改变。 一开始我没有弄懂他的意思。明白之后,我觉得很有可能,不过,仔细看编译结果,又大概可以排除这个可能了,以下是编译结果: Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)
Data Stack area: 100h to 4FFh
Data Stack size: 1024 byte(s)
Estimated Data Stack usage: 98 byte(s)
Global variables area: 500h to 5DCh
Global variables size: 221 byte(s)
Hardware Stack area: 5DDh to 10FFh
Hardware Stack size: 2851 byte(s)
|