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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位大神,我编写了一个简单的独立按键防抖的子函数,程序如下,在定时中断中调用这个函数没有效果。然后我把这段程序直接写到中断函数中,它是起作用的。
8 \: S7 P9 n7 @' k% G) m1 j& ]bit INDRIVER(bit x): b/ }( i( ^7 r6 ^2 {
{- a1 y' d9 [/ C- x) L9 h
        bit back;
% W' C6 N3 U% A$ ?; F! ]2 v        bit y;+ M2 C% x* n; g0 r& Y
        static uchar keybuf = 0xff;
" W/ q3 j0 i# f# p8 R        keybuf = (keybuf<<1) | x;                   //扫描一次,左移输入一位
" L- I5 j- v4 W; g2 N2 ]                if (keybuf == 0x00)                     //8次扫描均为0
: \* P' C; s) b  d2 w$ j                {
% Z- Y; b* g- K' d0 v$ p                y = 0;                                       //按键弹起状态$ v# j3 c! U5 ?) \7 k0 V! s
                }
4 H$ j. {0 q( T6 _- T( H; o1 j  z                else if (keybuf==0xff)
( ?( X. J7 \: H5 d! r$ X8 k( Y                {
$ S% Q! |( J8 ?                y = 1;                                      //按键按下状态
4 r# y) f. f/ p8 L' V! S. f/ }4 M                }
4 n. _- I3 h3 J3 V" C8 h                else
  P, s6 L; R5 {4 A                {}! v: P# u! I3 u; o& l8 `. ?
                back = y;( a6 N/ t7 N* d4 y1 N9 k6 o
                return back;
" {- c# m( t+ H4 p, t}
' n- z: u) {% ?1 z3 w
7 B8 F/ ]7 ?& U# |4 Z定时中断函数:. c& U' E( ]0 G, Y1 N
void  T1_ISR(void) interrupt 3
% Z1 v, N8 p% V6 a/ v{, k0 ^2 [6 c9 D
TH1=0xF8;4 P1 l2 l1 f6 `
TL1=0xCD;
1 F: j2 u# c" d# `8 |        Ms5_Time++;
4 n. y* q- A6 c3 Y1 X9 s/ R0 ^( S1 b        if(20>Ms5_Time && Ms5_Time>0)
+ m, D- Q  i' e% W% e3 J# q        {
* Q# r- Z1 `6 g- V  c8 e+ T) d2 c                IN2=1;                         //关闭第二片245
& l) @$ G. ^3 ?; A2 G1 F4 Z2 g                OUT_QS1=0;              //关闭第一片573! Z# c0 }% m! c" O
                OUT_QS2=0;             //关闭第二片573! [; r) Q9 d. w7 b
                 IN1=0;                            // 选中第一片245" y) e0 h. c% e  ?. W+ w
//                P1=0XFF;
0 ]0 W" E" j$ F7 o                _nop_();                                " [5 M* w$ l" t6 E; [0 _
                Input0=INDRIVER(Data0);                  //扫描按键状态1
/ |8 y" l' K1 C- ~9 e                Input1=INDRIVER(Data1);/ M5 E1 @" G% H. i, I2 U: a
                Input2=INDRIVER(Data2);        
8 H/ s! e1 _% u& O                Input3=INDRIVER(Data3);* Y, |. p9 @' g& B
                Input4=INDRIVER(Data4);
# D# D) E' @4 a3 y' t, _                Input5=INDRIVER(Data5);
( u4 z# W$ w' c        }
6 t8 c- ?1 X4 A6 {: J4 x7 c: d! `
/ [7 d7 S( g% J是不是因为在子函数中定义了静态变量,所以不能多次调用?  还是我的设计思路就是有问题的?把子函数直接写在中断中,定义多个静态变量,程序重复写多次,是可以运行的。因为硬件上有很多路输入,实在不想重复写防抖程序,求教各位大神,到底哪里出问题了。0 z2 @: s' c- N/ w: j

该用户从未签到

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

点评

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

该用户从未签到

3#
 楼主| 发表于 2020-8-19 13:38 | 只看该作者
行者~ABC 发表于 2020-8-19 13:366 V. O$ K3 C" @" y2 p3 v
这是作用域的问题,调用时是重新分配存储单元的,调用函数运行完后就释放了,中断程序是与主程序并行的,不 ...

2 R4 C9 x% p, K  E2 S( n; V& c会不会还占内存- Q& |8 x* F, b1 T$ V, q# x

点评

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

该用户从未签到

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

该用户从未签到

5#
发表于 2020-8-19 13:49 | 只看该作者
ggfhkl45 发表于 2020-8-19 13:38# F! e" |5 Q3 j& B
会不会还占内存
: b' f% `# j0 ]) U1 b) G5 J
不会的,函数调用完就会释放内存
) z" c5 w9 O- `# v7 q# i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-21 10:19 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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