lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:2019回复:15

C语言请教:这个函数怎么写?

楼主#
更多 发布于:2005-02-24 20:37
#define Workstatus  F0//bit型工作状态标志
 volatile uchar Time3s=0;//全局变量

void Delay3s(void)
{
    Time3s=60;
if(Time3s==0)
return;
}



void ISR_T0(void)
 {  
       .;
       .;
       .;
       .;
   if(Time3s!=0)
     {
       Time3s--;
     }
    
 }
也就是说,我要在Delay3s()中给全局变量Time3s赋初值,当Time3s=0时函数退出。
在ISR_T0(void)中每中断一次,Time3s减一。Delay3s()该怎么写?


[编辑 -  2/24/05 by  lzl]
l=z=l 我听说,灌水是使分数快速增长的有效方法
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-24 20:50
c中
void Delay3s(void)
{
Time3s=60;
if(Time3s==0)
return;
}
修改为
void Delay3s(void)
{
    Time3s=60;
    while(Time3s) ;
    return;
}
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-24 20:53
这样在60次调用ISR_T0后函数Delay3s就退出了
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-25 08:24
c中
void Delay3s(void)
{
Time3s=60;
if(Time3s==0)
return;
}
修改为
void Delay3s(void)
{
    Time3s=60;
    while(Time3s) ;
    return;
}
 
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2005-02-25 08:53
[quote]c中
void Delay3s(void)
{
Time3s=60;
if(Time3s==0)
return;
}
修改为
void Delay3s(void)
{
    Time3s=60;
    while(Time3s) ;
    return;
}
 
[/quote]
你测试过????
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-25 16:11
如果开了看门狗,那就要在循环的时候加上喂狗信号~~
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-02-25 16:56
[quote][quote]c中
void Delay3s(void)
{
Time3s=60;
if(Time3s==0)
return;
}
修改为
void Delay3s(void)
{
    Time3s=60;
    while(Time3s) ;
    return;
}
 
[/quote]
你测试过???? [/quote]

编译器可能会优化while(Time3s) ;语句
至少得加个volatile
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-25 20:44
[quote][quote][quote]c中
void Delay3s(void)
{
Time3s=60;
if(Time3s==0)
return;
}
修改为
void Delay3s(void)
{
    Time3s=60;
    while(Time3s) ;
    return;
}
 
[/quote]
你测试过???? [/quote]

编译器可能会优化while(Time3s) ;语句
至少得加个volatile [/quote]


那个地方加volatile?
l=z=l 我听说,灌水是使分数快速增长的有效方法
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-02-25 21:11
声明Time3s的地方

volatile int Time3s = 0;
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-02-25 23:33
我加了
l=z=l 我听说,灌水是使分数快速增长的有效方法
powerstone
驱动牛犊
驱动牛犊
  • 注册日期2004-08-22
  • 最后登录2009-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-27 09:10
我认为不合理,因为用while语句,那么系统将死等在while处。
如果设立一个标志delay_flag,如果还在延时,delay_flag=true;退出延时,delay_flag=false;
c中
void ISR_T0(void)
{
.;
.;
.;
.;
if(Time3s!=0)
{
Time3s--;
}
else
{
delay_flag=false;
}

}
void Delay3s(void)
{
Time3s=60;
delay_flag=true;
return;
}
main()
{
deDelay3s()
if (!delay_flag)
{
   处理目标代码
}
}
powerstone
驱动牛犊
驱动牛犊
  • 注册日期2004-08-22
  • 最后登录2009-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-02-27 09:12
详细处理,还要斟酌。
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-02-27 12:54
有道理,谢谢
l=z=l 我听说,灌水是使分数快速增长的有效方法
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-02-28 15:37
要不要EnterCriticalSession呢?
呵呵:)
A strong man can save himself. A great man can save another.
lbcat
驱动牛犊
驱动牛犊
  • 注册日期2002-03-19
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-03-01 08:55
我认为不合理,因为用while语句,那么系统将死等在while处。
如果设立一个标志delay_flag,如果还在延时,delay_flag=true;退出延时,delay_flag=false;
c中
void ISR_T0(void)
{
.;
.;
.;
.;
if(Time3s!=0)
{
Time3s--;
}
else
{
delay_flag=false;
}

}
void Delay3s(void)
{
Time3s=60;
delay_flag=true;
return;
}
main()
{
deDelay3s()
if (!delay_flag)
{
   处理目标代码
}
}


这样延时并不精确,而且使用起来也不方便啊,目标代码的变化很多~~,当然这样可以使程序在等待同时处理别的事情,有点多线程的意味,不过对于单线程的程序只需做一点等待再做下一步的话好像没必要做成这样~~ :P
lixinli81
驱动牛犊
驱动牛犊
  • 注册日期2004-03-17
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望41点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-03-05 16:38
可以呃
游客

返回顶部