打印

keil MDK 中临时变量有没有入栈?

[复制链接]
6800|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dagexp|  楼主 | 2013-1-21 15:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近调试I2C时,发现,测试函数中设置的一个临时缓冲区数组I2c_Buf[2047],与中断中的全局变量数组AD_BUF[6][32],地址重合,
全局变量     AD_BUF起始地址:0x20004028
临时变量     I2c_Buf起始地址:0x20003E18
看到网上很多资料说临时变量是入栈的,地址是从高地址向低地址方向生长的,如果是这样的话,这两个地址是不会覆盖的,可是实际调试发现是全局变量的 AD_BUF地址里的数据完全和 I2c_Buf里面的数据一样。。。。也就是说keil MDK里面的临时变量没有入栈。。。。。。我用的是keil MDK uvision4.

相关帖子

沙发
i55| | 2013-1-21 15:45 | 只看该作者
局部变量是入栈的,临时变量是个什么玩意?

使用特权

评论回复
板凳
ayb_ice| | 2013-1-21 15:47 | 只看该作者
应该是入栈的

是不是还没有分配就已经产生中断了

使用特权

评论回复
地板
dagexp|  楼主 | 2013-1-21 15:47 | 只看该作者
不好意思说的就是局部变量。。。。。

使用特权

评论回复
评论
渤海三叠浪 2013-1-21 19:15 回复TA
我觉得关键是编译器分配原则 ,感兴趣的话 可以看看帮助文档里面编译器的分配原则,里面讲的很清楚,然后弄个简单的例子自己试验一下。 我认为 
5
dagexp|  楼主 | 2013-1-21 15:51 | 只看该作者
//测试用
void I2C_Test(void)
{
        u16 i;
        u8 p[]="succes";
        u8 a[]="sorry";
        u8 I2c_Buf[2048];       
        for(i=0;i<2047;i++)
        I2c_Buf=i;
        I2C_WriteS(CAT1161_ADD,0,I2c_Buf,2047);
        for(i=0;i<2047;i++)
        I2c_Buf=0;
        //读100个
        I2C_Read(CAT1161_ADD,0,I2c_Buf,2047);
        for(i=0;i<64;i++)
        {       
                if(I2c_Buf!=i)
                {
                        write_string(15, 7, a);          //显示“失败”
                                while(1);
                }
        }
           write_string(16, 1, p);                //显示“成功”
}

就是I2C_TEST函数里面的I2c_Buf

使用特权

评论回复
6
i55| | 2013-1-21 15:53 | 只看该作者
堆栈溢出了,鉴定完毕。

使用特权

评论回复
7
dagexp|  楼主 | 2013-1-21 15:55 | 只看该作者
Program Size: Code=27600 RO-data=1496 RW-data=5356 ZI-data=13020  
我用的芯片是STM32,RAM有64K啊。。。。值用到了1/6的数据区啊。。。。。这么不耐用吗?

使用特权

评论回复
8
i55| | 2013-1-21 15:58 | 只看该作者
sct文件设置成64k了么?

使用特权

评论回复
9
dagexp|  楼主 | 2013-1-21 16:01 | 只看该作者
我就是这么设置的。。图片在附件里

~`_EUDW~%X711(NWLTD}_@6.jpg (61.72 KB )

~`_EUDW~%X711(NWLTD}_@6.jpg

使用特权

评论回复
10
ayb_ice| | 2013-1-21 16:15 | 只看该作者
这有什么难的,看看反汇编就知道了

使用特权

评论回复
11
ayb_ice| | 2013-1-21 16:20 | 只看该作者
自己看吧

未命名2.JPG (30.11 KB )

未命名2.JPG

未命名.JPG (23.2 KB )

未命名.JPG

使用特权

评论回复
12
dagexp|  楼主 | 2013-1-21 16:59 | 只看该作者
是我理解错了,我定义的局部变量数组I2c_Buf[2047],应该算一个整个变量,编译器分配好2047个字节的栈区后,将计算好的地址赋给I2c_Buf,因此I2c_Buf[0]的地址是栈区的低地址,

使用特权

评论回复
13
sky大花猫| | 2013-1-21 18:11 | 只看该作者
存数据都用存储器的 没有像这样2000个数据都用内存的。。

使用特权

评论回复
14
渤海三叠浪| | 2013-1-21 19:04 | 只看该作者
关键看分没分配内存啊  有的临时变量 和别的公用一个  当然没分配了  有的就分配啊

使用特权

评论回复
15
349264710| | 2013-1-21 20:48 | 只看该作者
楼上有人说了,就一句话,局部变量在栈中,而st的启动代码,默认栈为1K,当然分配不了2048字节,栈溢出鸟。

使用特权

评论回复
16
dagexp|  楼主 | 2013-1-22 08:55 | 只看该作者
本帖最后由 dagexp 于 2013-1-22 09:00 编辑

谢谢大家的帮助,确实是栈溢出了,查看了起动文件,栈的默认大小是1K。。。
Stack_Size      EQU     0x00000400

还有一开始我理解错了,我定义的局部变量-----数组I2c_Buf[2047],我想当然的认为每个数组单元I2c_Buf【i】的地址应该是由的,虽然是入栈,但是数组是作为 一个变量整体的,所以虽然入栈的地址是由高地址向低地址增长,但是每个数组单元I2c_Buf【i】的地址应该是由低到高的,

使用特权

评论回复
17
zzz1367| | 2013-1-22 09:53 | 只看该作者
学习了。谢谢

使用特权

评论回复
18
贞观之治| | 2013-1-23 12:41 | 只看该作者
这个很容易产生隐含的错误

使用特权

评论回复
19
zxm19820916| | 2013-7-26 16:54 | 只看该作者
学习了。避免了以后范同样的错误。

使用特权

评论回复
20
z755924843| | 2013-7-26 21:42 | 只看该作者
受教了 。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

85

帖子

1

粉丝