找回密码
 注册
关于网站域名变更的通知
查看: 435|回复: 4
打印 上一主题 下一主题

求教大神C语言子函数中静态变量问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-8-19 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求教各位大神,我编写了一个简单的独立按键防抖的子函数,程序如下,在定时中断中调用这个函数没有效果。然后我把这段程序直接写到中断函数中,它是起作用的。0 l" ]9 t- L% K( @, {5 |
bit INDRIVER(bit x)1 r* [9 r4 z& E. s7 c1 f- D  O
{% n  z+ Z+ b) D
        bit back;1 d, u9 Z6 S6 a3 O! f% f; y6 q
        bit y;
3 z7 T! K' C) Z- `! Q4 }  D* k        static uchar keybuf = 0xff;
" E2 G2 K1 _/ {  t        keybuf = (keybuf<<1) | x;                   //扫描一次,左移输入一位' N4 J4 z1 c: g7 h; ?
                if (keybuf == 0x00)                     //8次扫描均为0
3 A/ c- [* U- I( W1 \4 l$ ~4 |                {
8 I' `  B9 z7 K  f& d% g                y = 0;                                       //按键弹起状态
4 G/ D6 v  p  M$ O                }* X( Z2 j& V" M1 ]
                else if (keybuf==0xff); |1 J* p# D% W$ Z" I2 n/ h: I; Q+ m
                {
" O9 x0 ]2 Q6 ~% p6 r1 z4 V                y = 1;                                      //按键按下状态% @2 L- z. f; y! F* D% e
                }
4 I* D0 h# N, d# Y4 M                else
2 M* u0 S0 Q, z6 o9 A                {}
/ s' F/ |" `0 L" H+ p5 Y! ?                back = y;
# l8 e6 D" l, d( s6 c/ Z  t2 K! M                return back;' R6 U0 q; J- B9 M. t7 f
}+ o& C. u" Q4 H7 B4 G/ ~# R; s
) `8 P+ v7 R/ b" G* K# ]
定时中断函数:
1 a. {) i1 U) b+ h  {0 tvoid  T1_ISR(void) interrupt 3& A" |  \, k5 M0 j; a" C  |% `
{
0 W/ K) w( Z& w2 ^4 B+ ]# \7 B# nTH1=0xF8;: F% v; L" S4 u% ^5 n6 x8 d
TL1=0xCD;
* o: X, b' a" M5 f/ v; T1 n        Ms5_Time++;5 r- g! A) ~6 h5 f- b$ i
        if(20>Ms5_Time && Ms5_Time>0)
6 i6 n# S3 n1 a3 I! ~/ g7 h        {
+ Q. i6 k% i2 @; z                IN2=1;                         //关闭第二片245
, x! }- _$ N" X9 q  f8 n* s                OUT_QS1=0;              //关闭第一片573( f0 A% V$ [% V) n
                OUT_QS2=0;             //关闭第二片5738 w% Z2 }: K2 f* |( {
                 IN1=0;                            // 选中第一片245/ b+ w% W) Y; o0 z) [) D! t
//                P1=0XFF;, }6 s6 V5 M2 u: N4 S
                _nop_();                                
' l' {5 G* `! q# o                Input0=INDRIVER(Data0);                  //扫描按键状态1
5 C# s" C; n& W; U2 H- P                Input1=INDRIVER(Data1);
6 S+ y7 t& e" S) l  d                Input2=INDRIVER(Data2);        
4 U+ c$ O2 J5 G                Input3=INDRIVER(Data3);) a4 \' h2 V0 F0 v3 k0 y0 M3 @
                Input4=INDRIVER(Data4);
2 ^0 O# |& s. n" }5 o2 z1 U                Input5=INDRIVER(Data5);! r2 `7 l5 i2 e6 n
        }
4 z7 h: Y$ V2 j7 d7 c& x
% s" L, e# f! n( m2 C是不是因为在子函数中定义了静态变量,所以不能多次调用?  还是我的设计思路就是有问题的?把子函数直接写在中断中,定义多个静态变量,程序重复写多次,是可以运行的。因为硬件上有很多路输入,实在不想重复写防抖程序,求教各位大神,到底哪里出问题了。
, }  w) T6 T# v# `0 m$ {+ b/ H6 r

该用户从未签到

2#
发表于 2020-8-19 13:36 | 只看该作者
这是作用域的问题,调用时是重新分配存储单元的,调用函数运行完后就释放了,中断程序是与主程序并行的,不存在调用问题,只是程序运行指针的转移

点评

会不会还占内存  详情 回复 发表于 2020-8-19 13:38

该用户从未签到

3#
 楼主| 发表于 2020-8-19 13:38 | 只看该作者
行者~ABC 发表于 2020-8-19 13:36
1 ~! M' t7 o2 Z- ]这是作用域的问题,调用时是重新分配存储单元的,调用函数运行完后就释放了,中断程序是与主程序并行的,不 ...

0 W$ X$ @) j& w  @会不会还占内存
6 Q9 F# S9 f. q4 r5 g! x

点评

不会的,函数调用完就会释放内存  详情 回复 发表于 2020-8-19 13:49

该用户从未签到

4#
发表于 2020-8-19 13:49 | 只看该作者
静态变量是只在第一次运行时赋一个初始值,如果在子函数中定义了一个静态变量,在中断中调用这个函数,那么这个静态变量还是会释放,是不是问题就出在这了?

该用户从未签到

5#
发表于 2020-8-19 13:49 | 只看该作者
ggfhkl45 发表于 2020-8-19 13:38' C0 b0 w. A+ `- p
会不会还占内存

4 N! E6 b, g& i# ?' \不会的,函数调用完就会释放内存! ]' ~7 ]! E/ L& K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-22 03:21 , Processed in 0.125000 second(s), 29 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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