局部变量多程序就跑飞

[复制链接]
496|26
手机看帖
扫描二维码
随时随地手机跟帖
yufe|  楼主 | 2020-1-18 09:51 | 显示全部楼层 |阅读模式
局部变量过多程序就跑飞,莫非堆栈溢出??

使用特权

评论回复
llia| | 2020-1-18 09:54 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
yufe|  楼主 | 2020-1-18 09:57 | 显示全部楼层
#include <reg52.h>
#include <string.h>

void uart_init(void)
{
        TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
        TH1=0xf3;//12M,波特率2400
        TL1=0xf3;

        SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
        PCON=0x00;//设置SMOD=0        
        IE=0x90; //CPU允许中断,串行允许中断

        TR1=1;//启动定时器/计数器1
}
void sendbyte(uint8 c)
{
        SBUF=c;
        while(!TI);//等待发送完成
        TI=0;
}

int main(void)
{
        //加上i=0这个局部变量,程序就跑飞
        uint8 length=0,*string="1234";
//        uint8 a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
        uint8 a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;

        length=strlen(string);
        uart_init();
        while(1)
        {
                sendbyte(0x06);
                sendbyte(length);
        }

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:02 | 显示全部楼层

本来理论每次都要输出0x06 0x04,但是只要多定义一个局部变量,程序第一次就跑飞出错,现象为
第一次0x06,然后后面都是正常的,然后后面都是正常的,而且只要多增加一个变量,每次跑飞的位置又是不一样的,截图如下
即将跑飞

使用特权

评论回复
wangpe| | 2020-1-18 10:04 | 显示全部楼层
还有吗

使用特权

评论回复
wangzsa| | 2020-1-18 10:07 | 显示全部楼层
把局部变量改成全局变量试试

使用特权

评论回复
zhuww| | 2020-1-18 10:10 | 显示全部楼层
这代码太不好看了。

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:14 | 显示全部楼层
改为static变量或者全局变量一样,依旧跑飞了,这说明跟栈无关?

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:17 | 显示全部楼层
但是奇怪的是,修改变量的数目之后,跑飞的位置也不一样,又说明跟栈有关??

使用特权

评论回复
lium| | 2020-1-18 10:21 | 显示全部楼层

uint8 a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;   
这个地方不是有变量i了吗?

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:25 | 显示全部楼层
main函数和sendbyte函数里面变量都是局部变量,C语言允许同名,不存在覆盖问题;而且改为其他的问题还是一样的,

使用特权

评论回复
llia| | 2020-1-18 10:28 | 显示全部楼层
程序不大,不应该出这问题。有没有启动代码?

使用特权

评论回复
wangpe| | 2020-1-18 10:31 | 显示全部楼层
栈有多大,什么时候会用多少要有数,然后仿真确认。

使用特权

评论回复
langgq| | 2020-1-18 10:34 | 显示全部楼层
定义的时候不要赋初值。。。所有变量定义完以后,再赋初值试试看

使用特权

评论回复
wangzsa| | 2020-1-18 10:47 | 显示全部楼层

sp_max 0x15 怎么会是堆栈溢出呢?
发送程序,TI会自动置1,为什么要人工勾上,你的调试方法不对吧?

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:50 | 显示全部楼层
呃,这个事纯软件调试,没有仿真器啊,不手动置为发送标志,没法继续勒

使用特权

评论回复
zhuww| | 2020-1-18 10:52 | 显示全部楼层

(1)正如楼上,你为什么要人工勾上TI标志?
(2)你在IE中允许了串口中断,但是没有看到中断处理函数啊。你串口发送用的是查询方式,尝试IE中禁止串口中断试试。

使用特权

评论回复
zhanglli| | 2020-1-18 10:57 | 显示全部楼层
编译后看data用了多少,然后估计最多局部变量多少,中断里局部变量多少,等等

使用特权

评论回复
yufe|  楼主 | 2020-1-18 10:59 | 显示全部楼层

(1)上楼说了,纯软件调试,不手动勾选,怎么调试??
(2)查询方式就是看中断标志位的,也是需要开串口中断的,不然根本不能发生中断

使用特权

评论回复
yufe|  楼主 | 2020-1-18 11:02 | 显示全部楼层

就是不会看这个,所以才来这里面问的,

使用特权

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

本版积分规则

983

主题

10170

帖子

1

粉丝