标题: 求教C语言子函数中静态变量的运用问题 [打印本页]

作者: btxzilong    时间: 2020-8-17 18:33
标题: 求教C语言子函数中静态变量的运用问题
    求教各位大神,我编写了一个简单的独立按键防抖的子函数,程序如下,在定时中断中调用这个函数没有效果。然后我把这段程序直接写到中断函数中,它是起作用的。
bit INDRIVER(bit x)
{
        bit back;
        bit y;
        static uchar keybuf = 0xff;
        keybuf = (keybuf<<1) | x;                   //扫描一次,左移输入一位
                if (keybuf == 0x00)                     //8次扫描均为0
                {
                y = 0;                                       //按键弹起状态
                }
                else if (keybuf==0xff)
                {
                y = 1;                                      //按键按下状态
                }
                else
                {}
                back = y;
                return back;
}

定时中断函数:
void  T1_ISR(void) interrupt 3
{
TH1=0xF8;
TL1=0xCD;
        Ms5_Time++;
        if(20>Ms5_Time && Ms5_Time>0)
        {
                IN2=1;                         //关闭第二片245
                OUT_QS1=0;              //关闭第一片573
                OUT_QS2=0;             //关闭第二片573
                 IN1=0;                            // 选中第一片245
//                P1=0XFF;
                _nop_();                                
                Input0=INDRIVER(Data0);                  //扫描按键状态1
                Input1=INDRIVER(Data1);
                Input2=INDRIVER(Data2);        
                Input3=INDRIVER(Data3);
                Input4=INDRIVER(Data4);
                Input5=INDRIVER(Data5);
        }

是不是因为在子函数中定义了静态变量,所以不能多次调用?  还是我的设计思路就是有问题的?把子函数直接写在中断中,定义多个静态变量,程序重复写多次,是可以运行的。因为硬件上有很多路输入,实在不想重复写防抖程序,求教各位大神,到底哪里出问题了。

作者: csmyldl    时间: 2020-8-18 00:29
这是作用域的问题,调用时是重新分配存储单元的,调用函数运行完后就释放了,中断程序是与主程序并行的,不存在调用问题,只是程序运行指针的转移
作者: btxzilong    时间: 2020-8-18 13:29
静态变量是只在第一次运行时赋一个初始值,如果在子函数中定义了一个静态变量,在中断中调用这个函数,那么这个静态变量还是会释放,是不是问题就出在这了?
作者: btxzilong    时间: 2020-8-18 13:45
    谢谢大神,那是不是在我这个样例的子函数中不能使用静态变量? 我这个子函数需要多次调用,运行完就释放,那么在子函数中定义了静态变量还是不起作用,还是会释放掉?
   
作者: csmyldl    时间: 2020-8-19 00:08
理论上静态变量等同于全局变量,你可以定义一个全局变量试试
作者: 1692483014    时间: 2020-8-19 13:31
这个静态局部变量相当于全局变量,只要不掉电,这个变量的分配的RAM则不被释放。
但它又与全局变量不同,因为其在函数体内被定义,所以,它只能用于此函数体,不能被其它函数体所使用。
另外就是其初值0xff只会在最开始分配时赋值一次,之后每次进入此函数后,不会再对其进行0XFF的赋值了,而是保留上一次退出此函数时的值。
如果你把static去掉的话,就变成普通的局部变量了,分配内存时会被分配到栈里,也就是说,此函数执行完毕退出后,相应的RAM就会被释放了,下次再进会再重新分配,且会被重新初始化为0xff。
作者: btxzilong    时间: 2020-8-20 16:20
1692483014 发表于 2020-8-19 13:31
这个静态局部变量相当于全局变量,只要不掉电,这个变量的分配的RAM则不被释放。
但它又与全局变量不同, ...

想把按键消抖做成一个子函数,后面按键消抖都调用这个函数,还是没成功,最后老老实实的每个按键单独写了一段消抖程序




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1