找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1860|回复: 6
收起左侧

求教C语言子函数中静态变量的运用问题

[复制链接]
ID:42969 发表于 2020-8-17 18:33 | 显示全部楼层 |阅读模式
    求教各位大神,我编写了一个简单的独立按键防抖的子函数,程序如下,在定时中断中调用这个函数没有效果。然后我把这段程序直接写到中断函数中,它是起作用的。
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);
        }

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

使用道具 举报

ID:235200 发表于 2020-8-18 00:29 | 显示全部楼层
这是作用域的问题,调用时是重新分配存储单元的,调用函数运行完后就释放了,中断程序是与主程序并行的,不存在调用问题,只是程序运行指针的转移
回复

使用道具 举报

ID:42969 发表于 2020-8-18 13:29 | 显示全部楼层
静态变量是只在第一次运行时赋一个初始值,如果在子函数中定义了一个静态变量,在中断中调用这个函数,那么这个静态变量还是会释放,是不是问题就出在这了?
回复

使用道具 举报

ID:42969 发表于 2020-8-18 13:45 | 显示全部楼层
    谢谢大神,那是不是在我这个样例的子函数中不能使用静态变量? 我这个子函数需要多次调用,运行完就释放,那么在子函数中定义了静态变量还是不起作用,还是会释放掉?
   
回复

使用道具 举报

ID:235200 发表于 2020-8-19 00:08 | 显示全部楼层
理论上静态变量等同于全局变量,你可以定义一个全局变量试试
回复

使用道具 举报

ID:804115 发表于 2020-8-19 13:31 | 显示全部楼层
这个静态局部变量相当于全局变量,只要不掉电,这个变量的分配的RAM则不被释放。
但它又与全局变量不同,因为其在函数体内被定义,所以,它只能用于此函数体,不能被其它函数体所使用。
另外就是其初值0xff只会在最开始分配时赋值一次,之后每次进入此函数后,不会再对其进行0XFF的赋值了,而是保留上一次退出此函数时的值。
如果你把static去掉的话,就变成普通的局部变量了,分配内存时会被分配到栈里,也就是说,此函数执行完毕退出后,相应的RAM就会被释放了,下次再进会再重新分配,且会被重新初始化为0xff。
回复

使用道具 举报

ID:42969 发表于 2020-8-20 16:20 | 显示全部楼层
1692483014 发表于 2020-8-19 13:31
这个静态局部变量相当于全局变量,只要不掉电,这个变量的分配的RAM则不被释放。
但它又与全局变量不同, ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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