[51单片机] 51内核,在没超RAM大小时,全局变量会被后面的变量等覆盖...

[复制链接]
 楼主| 一叶倾城wwq 发表于 2018-12-7 15:21 | 显示全部楼层 |阅读模式
本帖最后由 一叶倾城wwq 于 2018-12-7 15:23 编辑

现在有个问题想请教各位坛友:在代码编写过程中我先定义了一个全局变量(unsigned char aFlag),用于控制逻辑处理,已经实现控制功能,后面增加了写EE几十个字节,写的不频繁只有在上电接收数据时会写入,过程中都是读出判断,然而问题来了,我把有关EE这块功能调通后,发现之前的控制逻辑没有了!?也就是那个(unsigned char aFlag)不管用了,然后我把它改为(unsigned char xdata aFlag)就好了,解决的莫名其妙的
注:我的片内128字节用了122,片外256用了249,8K用了7.92K,会不会存在其他隐患?毕竟都接近满了,导致其他全局变量等也被未知数据覆盖掉呢?求指点
ayb_ice 发表于 2018-12-7 15:58 | 显示全部楼层
如果堆栈小了会把全局变量冲掉的
或者是程序本身有问题,只是现象不一样而已,有些现象不明显而已
 楼主| 一叶倾城wwq 发表于 2018-12-7 16:15 | 显示全部楼层
ayb_ice 发表于 2018-12-7 15:58
如果堆栈小了会把全局变量冲掉的
或者是程序本身有问题,只是现象不一样而已,有些现象不明显而已 ...

现在就是在考虑这个问题,请问基于这样的情况,怎样解决好点,现在虽然没出问题,但可能是有隐患的,程序在运行的某一天某个功能就没了,会不会发生这样的情况呢?
ayb_ice 发表于 2018-12-7 16:18 | 显示全部楼层
“我的片内128字节用了122”

这点就已经很危险了,除非你已经修改了堆栈的定义,默认的定义是一个字节大小,所以你的堆栈其实只有7个字节可用,明显是小了

可以把部分变量定义到xdata,pdata
ayb_ice 发表于 2018-12-7 16:21 | 显示全部楼层
一叶倾城wwq 发表于 2018-12-7 16:15
现在就是在考虑这个问题,请问基于这样的情况,怎样解决好点,现在虽然没出问题,但可能是有隐患的,程序 ...

“我的片内128字节用了122”

这点就已经很危险了,除非你已经修改了堆栈的定义,默认的定义是一个字节大小,所以你的堆栈其实只有7个字节可用,明显是小了

可以把部分变量定义到xdata,pdata
 楼主| 一叶倾城wwq 发表于 2018-12-7 16:26 | 显示全部楼层
ayb_ice 发表于 2018-12-7 16:18
“我的片内128字节用了122”

这点就已经很危险了,除非你已经修改了堆栈的定义,默认的定义是一个字节大小 ...

某个功能没有还有救,要是整个程序跑乱了,就直接失败了,或者在烧录程序的时候因为一些原因造成问题,果然写得快满就是不放心;
好的,知道了,在加EE需求时已经优化过一次了,我试着再优化下,看看还能不能挤出点xdata空间,感谢您的热心提示
gx_huang 发表于 2018-12-7 16:49 | 显示全部楼层
啥芯片,片内才128,竟然还有XDAA。
一般有xdata的,片内是128+128的。
 楼主| 一叶倾城wwq 发表于 2018-12-7 16:53 | 显示全部楼层
gx_huang 发表于 2018-12-7 16:49
啥芯片,片内才128,竟然还有XDAA。
一般有xdata的,片内是128+128的。

国产货,官网资料都不全,博巨兴
all_units 发表于 2018-12-7 17:20 | 显示全部楼层
也遇到过类似的情况,8k的空间用了7.96k,程序跑飞
雪山飞狐D 发表于 2018-12-7 17:23 | 显示全部楼层
    全局变量还是统一用xdata吧,idata是给函数堆栈用的,尽量不要用前面的128B
 楼主| 一叶倾城wwq 发表于 2018-12-7 17:27 | 显示全部楼层
all_units 发表于 2018-12-7 17:20
也遇到过类似的情况,8k的空间用了7.96k,程序跑飞

请问您当时跑飞是什么情况,可否细说下情况,解个惑
 楼主| 一叶倾城wwq 发表于 2018-12-7 17:29 | 显示全部楼层
雪山飞狐D 发表于 2018-12-7 17:23
全局变量还是统一用xdata吧,idata是给函数堆栈用的,尽量不要用前面的128B ...

这次吸取教训了,我也是第一次遇到这样的情况,弄得很担心后续工作
触觉的爱 发表于 2018-12-7 18:04 | 显示全部楼层
这可不是公交车,可以挤一挤
18576478035 发表于 2018-12-7 18:20 | 显示全部楼层
雪山飞狐D 发表于 2018-12-7 17:23
全局变量还是统一用xdata吧,idata是给函数堆栈用的,尽量不要用前面的128B ...

堆栈空间一般需要留多大?我留看34byte堆栈空间够函数调用吗?
18576478035 发表于 2018-12-7 18:22 | 显示全部楼层
ayb_ice 发表于 2018-12-7 16:21
“我的片内128字节用了122”

这点就已经很危险了,除非你已经修改了堆栈的定义,默认的定义是一个字节大 ...

堆栈空间一般需要留多大?我留看34byte堆栈空间够函数调用吗?

评论

兄弟,怎么没人回答你呢?直接发一帖吧,我也不太清楚,毕竟我这个全都快满了,而且我觉得占用的堆栈空间编译器应该在编译链接的时候应该已经分配好了,才生成的HEX文件,MCU只管按步骤来运行即可,所以我觉得只要没超出芯片手册给定的大小即可,留给它几个字节也好(个人之见)  发表于 2018-12-8 08:45
 楼主| 一叶倾城wwq 发表于 2018-12-7 22:13 | 显示全部楼层
触觉的爱 发表于 2018-12-7 18:04
这可不是公交车,可以挤一挤

个人愚见,可以挤一挤的,用位域挤,大侠有不同的观点欢迎指教
linqing171 发表于 2018-12-7 22:47 | 显示全部楼层
局部变量比全局变量省空间。a函数和b函数不同时执行(a和b之间没有调用关系),则a内的局部变量可以和b内的局部变量用同一个地址。编译器都给最优化的分配好了。
常量放flash里面,比放RAM里省空间。
指针指定类型的比如 char xdata * xdata pc; 比char * pc ;省一个字节。
 楼主| 一叶倾城wwq 发表于 2018-12-8 08:39 | 显示全部楼层
linqing171 发表于 2018-12-7 22:47
局部变量比全局变量省空间。a函数和b函数不同时执行(a和b之间没有调用关系),则a内的局部变量可以和b内的 ...

受教了,指针声明xdata还能省一个字节,我只记得在用指针作为形参传递时,用sizeof计算占三个字节(keil)
gx_huang 发表于 2018-12-8 11:04 | 显示全部楼层
51编译器,对于堆栈溢出,不会提醒的,需要自己评估的。
中断程序会占用一些(具体多少字节,自己看反汇编代码的PUSH了多少,中断程序是否还调用了函数),函数调用会占用一些。这个多级调用,只有你自己最清楚。
复杂的程序,我留56字节都不够。
 楼主| 一叶倾城wwq 发表于 2018-12-8 11:23 | 显示全部楼层
gx_huang 发表于 2018-12-8 11:04
51编译器,对于堆栈溢出,不会提醒的,需要自己评估的。
中断程序会占用一些(具体多少字节,自己看反汇编 ...

所以这些程序才应该杜绝递归,好的,我再查看下空间使用情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

1379

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部