搜索
bottom↓
回复: 27

为什么 static 和 code 同时存在就程序死

[复制链接]

出0入0汤圆

发表于 2015-6-12 22:49:16 | 显示全部楼层 |阅读模式
本帖最后由 dyjhy 于 2015-6-13 10:49 编辑

下面两段内容中,  红色表示的, code 和static  不能同时存在,如果同时存在程序就死机,只要去掉任何一个程序都能正常运行。  不知道为什么?
                                                当然,static去掉的话,那一行要移到外面作全局变量,按键才会有效。


补充一下:板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

/*7段共阴字形码表*/
const unsigned char code DB[]={   0x3F ,         /*0-----0*/
                                                         0x06 ,  /*1-----1*/
                                                         0x5B ,  /*2-----2*/
                                                         0x4F ,         /*3-----3*/
                                                         0x66 ,         /*4-----4*/
                                                         0x6D ,         /*5-----5*/
                                                         0x7D ,  /*6-----6*/
                                                         0x07 ,  /*7-----7*/
                                                         0x7F ,         /*8-----8*/
                                                         0x6F ,  /*9-----9*/
                                                         0x77 ,  /*A-----10*/
                                                         0x7C ,         /*B-----11*/
                                                         0x39 ,  /*C-----12*/
                                                         0x5E ,         /*D-----13*/
                                                         0x79 ,  /*E-----14*/
                                                         0x71 ,  /*F-----15*/
       
                                                         0xBF ,         /*0.-----16显示小数点就是原数+16*/
                                                         0x86 ,  /*1.-----17*/
                                                         0xDB ,  /*2.-----18*/
                                                         0xCF ,         /*3.-----19*/
                                                         0xE6 ,         /*4.-----20*/
                                                         0xED ,         /*5.-----21*/
                                                         0xFD ,  /*6.-----22*/
                                                         0x87 ,  /*7.-----23*/
                                                         0xFF ,         /*8.-----24*/
                                                         0xEF ,  /*9.-----25*/
                                                         
       
                                                         0x00 ,         /*关闭-----26*/
                                                         0x73 ,  /*P-----27*/
                                                         0x3E ,  /*U-----28*/
                                                         0x6E ,  /*Y-----29*/
                                                         0x76 ,  /*H-----30*/
                                                         0x38 ,   /*L-----31*/
                                                         0x40         /*'-'-----32*/                                          
                                                 }          ;

void key_scan (void)  //
{
static  unsigned int key_count;//SW1按键判断计数。
        if(SW1==0&&key_count==0)
        {
                sw1_time=0;
                key_count=1;                                  
               
        }
        if(SW1&&key_count) //按键放开
        {
                key_count=0;
                if(sw1_time>10000) key=3;
                else if(sw1_time>5000) key=2;
                else if(sw1_time>20) key=1;
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入10汤圆

发表于 2015-6-12 23:17:11 | 显示全部楼层
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到


你外部其他函数有给key_count赋值吧,那不就应该外全局吗

出0入21汤圆

发表于 2015-6-12 23:51:32 | 显示全部楼层
你的程序变量被code了,还能修改变量的值?

出0入0汤圆

发表于 2015-6-13 00:04:23 | 显示全部楼层
bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到

当外部变量用

出0入0汤圆

发表于 2015-6-13 00:06:52 | 显示全部楼层
楼主,const同时又code是什么节奏?

出0入0汤圆

发表于 2015-6-13 00:26:07 | 显示全部楼层
qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?

const是不是有些多余?

出0入0汤圆

发表于 2015-6-13 00:48:32 | 显示全部楼层
wind_zlc 发表于 2015-6-13 00:26
const是不是有些多余?

如果是51,用code就行了,如果是其他单片机,用const

出0入0汤圆

发表于 2015-6-13 00:50:31 | 显示全部楼层
qq开始学单片机 发表于 2015-6-13 00:48
如果是51,用code就行了,如果是其他单片机,用const

ok,受教了

出0入0汤圆

 楼主| 发表于 2015-6-13 06:46:58 来自手机 | 显示全部楼层
bias 发表于 2015-6-12 23:17
请问楼主要在子函数里面申明静态变量的目的是什么?
子函数里面的变量不能被函数外用到


只是用于消抖,就是只在此函数中用的

出0入0汤圆

 楼主| 发表于 2015-6-13 06:51:02 来自手机 | 显示全部楼层
qq开始学单片机 发表于 2015-6-13 00:06
楼主,const同时又code是什么节奏?

用不用const一样,?调试时加上忘改回了,上面所有的回复都没回到问题的实质

出0入0汤圆

发表于 2015-6-13 08:12:41 | 显示全部楼层
static  unsigned int key_count  其它 函数不能访问吧!!

出0入0汤圆

发表于 2015-6-13 08:25:13 | 显示全部楼层
看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是不错。另外,key_count非0即1,用int实在是浪费啊。

出0入0汤圆

发表于 2015-6-13 08:29:40 | 显示全部楼层
个人习惯,我不习惯用
static
而习惯上会吧key放到返回值中。

出0入0汤圆

发表于 2015-6-13 08:36:22 | 显示全部楼层
没看到问题。不过静态变量需要先初始化。

出0入0汤圆

发表于 2015-6-13 08:57:46 | 显示全部楼层
key_count用bit就可以了吧。

出0入0汤圆

 楼主| 发表于 2015-6-13 10:50:27 | 显示全部楼层
xiaobendan 发表于 2015-6-13 08:25
看起来都没问题,只是片段,可能和另外的程序有关,比如调用了DB[]的程序。不过这种显示小数点的方法,倒是 ...

板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

出0入0汤圆

发表于 2015-6-13 10:55:07 | 显示全部楼层
static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧

出0入0汤圆

 楼主| 发表于 2015-6-13 10:56:28 | 显示全部楼层
biansf2001 发表于 2015-6-13 08:36
没看到问题。不过静态变量需要先初始化。

static  unsigned int key_count=0;也试过了。

板了上电,所有都正常,只要按下按键就会死机,我把key_scan里的所有东西注释掉,只留static那一条语句也会死机,这条也删掉的话就会正常。

把  unsigned int key_count=0;提到程序外部变为全局变量就正常,同样在前面加下static就会死机。

出0入0汤圆

 楼主| 发表于 2015-6-13 11:00:23 | 显示全部楼层
spacekey 发表于 2015-6-13 10:55
static 占用了太多空间,同全局变量一样, RAM 用光了导至的死机吧

编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。   单片机RAM是128 xdata 是256   ROM是8K。

出0入0汤圆

发表于 2015-6-13 11:18:09 | 显示全部楼层
dyjhy 发表于 2015-6-13 11:00
编译通过,RAM大根100左右,xdata大概200左右,程序大概4K左右。   单片机RAM是128 xdata 是256   ROM是8 ...

用软调试看看程序跑哪儿了

出0入0汤圆

发表于 2015-6-13 11:19:00 | 显示全部楼层
dyjhy 发表于 2015-6-13 10:56
static  unsigned int key_count=0;也试过了。

板了上电,所有都正常,只要按下按键就会死机,我把key_s ...

为什么非要用int类型?

出0入0汤圆

发表于 2015-6-13 11:22:20 | 显示全部楼层
只是分配一个变量就死机,可能还是和RAM分配有关,我在用15W408S,我试试

出0入0汤圆

发表于 2015-6-13 11:34:52 | 显示全部楼层
刚才在函数中加了你那句,为了消灭警告信息,又在下面的按键处理中加了if(key_count<9)key_count++;
编译后data = 122.7,xdata = 0,code = 3502
没问题啊
另外,你这段程序不管按键不按键都是要执行的吧,尤其是变量分配的问题,只保留变量分配,没有其他程序时,编译后的程序是啥样?

出0入0汤圆

发表于 2015-6-13 11:39:45 | 显示全部楼层
还是软件仿真一下吧。

出0入0汤圆

发表于 2015-6-13 11:43:18 | 显示全部楼层
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果

出0入0汤圆

 楼主| 发表于 2015-6-13 11:54:39 | 显示全部楼层
xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...

晚上回家试试,谢谢!

出0入0汤圆

 楼主| 发表于 2015-6-13 21:07:50 | 显示全部楼层
xiaobendan 发表于 2015-6-13 11:43
变量分配,你的MEM是不是在large模式,试试在staitc后面加上data关键字看看什么效果 ...

问题找到了,静态变是初始一下就好了, static unsigned char key_count=0;  

但是为什么会这样呢,原因还是想不通。  不初始化默认不是0吗,code 不加时程序运行很正常的。

出0入0汤圆

发表于 2015-6-15 07:39:29 | 显示全部楼层
14楼早说过了,以为你试过了。
这次用char了。
启动函数里面是有吧data清零的,不知道是否可以。
我昨天实验时也没有初始化,也没发现问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 20:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表