打印

在用keil开发程序时不释放局部变量!请,仙人指路

[复制链接]
3887|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
f_haizao|  楼主 | 2010-9-9 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用keil开发c51程序时,出现了不释放局部变量的问题。具体情况是这样的:
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/H9]`CQ17ADC$O17GV5XZU{N.jpg







[img]file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/$WZW@PJ{SBO5(L34[08XD]5.jpg[/img]


图片1:为没有定义的数组data = 229.3,当定义过数组rcv_buf[10]后再次编译即为图片2中的内容,data = 239.3


我在子函数中定义的数组,在编译过后没有释放,该数组依然占据内部RAM很头疼,不知道坛子里哪位高人曾经遇到过此类问题!!!如何解决



声明:
         1.这个子函数不存在嵌套问题
         2.没有用static修饰

相关帖子

沙发
ayb_ice| | 2010-9-9 13:28 | 只看该作者
keil本身就是静态分配局部变量的,这点和标准C是有区别的,也是最大区别
只要没有警告,错误就是正常的

使用特权

评论回复
板凳
李冬发| | 2010-9-10 12:11 | 只看该作者
LS,不是KEIL是这么做的,是实现51的编译器非要这么做不可。

使用特权

评论回复
地板
airwill| | 2010-9-10 13:14 | 只看该作者
是的, Keil C51 为了提高代码的效率, 根据 51 处理器的特性. 编译器对函数局部变量的安排进行了处理.
局部变量如果不能分配到 寄存器里, 就放在 RAM 中了.
编译器通过覆盖分析, 可以共享局部变量的地址空间.
楼主非要让局部变量放到堆栈去吗? 可以设定函数为重入类型试试, 不过这样的执行效率会差很多哦.
另外 data = 229.3, 好像这个数值太大了点, 这样, 堆栈空间就很小了, 当心堆栈溢出哇!

使用特权

评论回复
5
ayb_ice| | 2010-9-10 13:15 | 只看该作者
LS
谁说的
IAR的EW8051就和KEIL不一样
不要说的太绝对了,KEIL也可以产生重入函数(reentrant关键关键字),和标准C类似
....

使用特权

评论回复
6
xlsbz| | 2010-9-10 23:16 | 只看该作者
这个我懂啊

前提 keil C51 没有static

首先你问这个问题 得说一下 你用的是keil的C编译器的啥版本  用的啥优化级别

然后你的代码用的局部变量的多少
乱举个例子 如果你的优化级别是5 ,比如说你的代码总共采用了10个局部变量而已,那么很有可能
这10变量都占用固定的内存。
如果你的程序弄了大量的局部变量 那么可能就会一部分局部变量占用固定的

另外 中断服务程序中 即便不加static 也 会当作static一样看待

再如 如果你写了个函数没有被调用 那么KEIL C编译器就会认为你的这个函数是个中断函数 所以里面的变量
也是占固定内存的。

有些乱七八糟的东西 手册上似乎写得比较清楚的 可以猜出来点

你的图片我没有看到

不知道我回答的是否 在点子上

可能答非所问  哈哈哈哈哈哈哈哈

使用特权

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

本版积分规则

0

主题

10

帖子

1

粉丝