打印

局部变量过多程序就跑飞

[复制链接]
1821|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2015-8-22 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
局部变量过多程序就跑飞,莫非堆栈溢出??
沙发
liuzaiy| | 2015-8-22 20:38 | 只看该作者
程序看看

使用特权

评论回复
板凳
houcs|  楼主 | 2015-8-22 20:39 | 只看该作者
#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);
        }

使用特权

评论回复
地板
houcs|  楼主 | 2015-8-22 20:39 | 只看该作者
本来理论每次都要输出0x06 0x04,但是只要多定义一个局部变量,程序第一次就跑飞出错,现象为
第一次0x06,然后后面都是正常的,然后后面都是正常的,而且只要多增加一个变量,每次跑飞的位置又是不一样的,截图如下
即将跑飞

使用特权

评论回复
5
houcs|  楼主 | 2015-8-22 20:39 | 只看该作者

使用特权

评论回复
6
yinxiangh| | 2015-8-22 20:40 | 只看该作者
还有吗

使用特权

评论回复
7
houcs|  楼主 | 2015-8-22 20:40 | 只看该作者

使用特权

评论回复
8
pangb| | 2015-8-22 20:40 | 只看该作者
把局部变量改成全局变量试试

使用特权

评论回复
9
chenjunt| | 2015-8-22 20:40 | 只看该作者
这代码太不好看了。

使用特权

评论回复
10
houcs|  楼主 | 2015-8-22 20:41 | 只看该作者
改为static变量或者全局变量一样,依旧跑飞了,这说明跟栈无关?

使用特权

评论回复
11
houcs|  楼主 | 2015-8-22 20:41 | 只看该作者
但是奇怪的是,修改变量的数目之后,跑飞的位置也不一样,又说明跟栈有关??

使用特权

评论回复
12
ousj| | 2015-8-22 20:41 | 只看该作者
uint8 a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;   
这个地方不是有变量i了吗?

使用特权

评论回复
13
houcs|  楼主 | 2015-8-22 20:41 | 只看该作者
main函数和sendbyte函数里面变量都是局部变量,C语言允许同名,不存在覆盖问题;而且改为其他的问题还是一样的,

使用特权

评论回复
14
morrisk| | 2015-8-22 20:42 | 只看该作者
程序不大,不应该出这问题。有没有启动代码?

使用特权

评论回复
15
zyf部长| | 2015-8-22 20:42 | 只看该作者
栈有多大,什么时候会用多少要有数,然后仿真确认。

使用特权

评论回复
16
小小猫咪| | 2015-8-22 20:43 | 只看该作者
定义的时候不要赋初值。。。所有变量定义完以后,再赋初值试试看

使用特权

评论回复
17
kangzj| | 2015-8-22 20:43 | 只看该作者
sp_max 0x15 怎么会是堆栈溢出呢?
发送程序,TI会自动置1,为什么要人工勾上,你的调试方法不对吧?

使用特权

评论回复
18
houcs|  楼主 | 2015-8-22 20:43 | 只看该作者
呃,这个事纯软件调试,没有仿真器啊,不手动置为发送标志,没法继续勒

使用特权

评论回复
19
zwll| | 2015-8-22 20:43 | 只看该作者
(1)正如楼上,你为什么要人工勾上TI标志?
(2)你在IE中允许了串口中断,但是没有看到中断处理函数啊。你串口发送用的是查询方式,尝试IE中禁止串口中断试试。

使用特权

评论回复
20
chuxh| | 2015-8-22 20:43 | 只看该作者
编译后看data用了多少,然后估计最多局部变量多少,中断里局部变量多少,等等

使用特权

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

本版积分规则

743

主题

8382

帖子

5

粉丝