搜索
bottom↓
回复: 22

想问一个问题 用定时器1s的中断,然后在while中有个delay()1500ms的程序,这样是不是程序会一直卡在delay()这里?

[复制链接]

出0入4汤圆

发表于 2020-8-11 14:24:29 | 显示全部楼层 |阅读模式
想问一个问题  用定时器1s的更新中断,然后在主函数while中有个delay()1.5的延时程序,这样是不是程序会一直卡在delay()这里?不会运行while中别的函数啦

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入4汤圆

 楼主| 发表于 2020-8-11 14:38:26 | 显示全部楼层
有没有人帮我回答一下呀

出40入42汤圆

发表于 2020-8-11 14:44:40 | 显示全部楼层
delay()函数里面是怎么实现的?

出0入170汤圆

发表于 2020-8-11 14:54:48 | 显示全部楼层
中断服务程序会停止主程序的运行,中断服务程序执行完以后会返回主程序继续运行。

出0入4汤圆

 楼主| 发表于 2020-8-11 15:03:59 | 显示全部楼层
rugaogary700308 发表于 2020-8-11 14:54
中断服务程序会停止主程序的运行,中断服务程序执行完以后会返回主程序继续运行。 ...


void main()
{
    u8 t1=0,t2=0,t3=0;
   
    led1=0;
    delay_ms(1000);                //  进入 0.5s的定时中断,出来后会怎么执行呀?,delay()是for循环,
   t1+=1;

    led0=1;               
   delay_ms(1000);
   t2+=1;                  

   led2=0;
  delay_ms(1000);
  t3+=1;
}

出0入18汤圆

发表于 2020-8-11 15:10:32 | 显示全部楼层
杨朔学单片机 发表于 2020-8-11 15:03
void main()
{
    u8 t1=0,t2=0,t3=0;

如果Led是指示灯的话  在外面看指示灯是没有变化的  Debug的时候 t1 t2 t3 会自加

出0入4汤圆

发表于 2020-8-11 15:26:50 | 显示全部楼层
延时到达后跳出来执行下一条语句。延时不到卡在延时函数里,只执行中断服务程序。

出0入4汤圆

 楼主| 发表于 2020-8-11 15:34:26 | 显示全部楼层
落叶知秋 发表于 2020-8-11 14:44
delay()函数里面是怎么实现的?

for 循环

出0入4汤圆

 楼主| 发表于 2020-8-11 15:36:03 | 显示全部楼层
落叶知秋 发表于 2020-8-11 14:44
delay()函数里面是怎么实现的?

void delay_us(u32 uS){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)       
        SysTick->LOAD=AHB_INPUT*uS;      //重装计数初值(当主频是72MHz,72次为1微秒)
        SysTick->VAL=0x00;        //清空定时器的计数器
        SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
        while(!(SysTick->CTRL&0x00010000)); //等待计数到0
        SysTick->CTRL=0x00000004;//关闭定时器
}
这是delay的  不是for循环

出40入42汤圆

发表于 2020-8-11 16:11:28 | 显示全部楼层
杨朔学单片机 发表于 2020-8-11 15:36
void delay_us(u32 uS){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)       
        SysTick->LOAD ...

delay里面的这个while跟用for循环实现的执行逻辑差不多,都是阻塞执行的,如果中间有中断进来会进入中断服务流程,中断执行完了,会回来继续
等到delay结束了,就继续往下执行main里面的while(1)

出0入213汤圆

发表于 2020-8-11 16:33:27 来自手机 | 显示全部楼层
自己仿真一下啥都懂,加深理解

出0入36汤圆

发表于 2020-8-11 16:34:00 | 显示全部楼层
delay会被定时中断打断的

出0入4汤圆

 楼主| 发表于 2020-8-11 17:00:32 | 显示全部楼层
落叶知秋 发表于 2020-8-11 16:11
delay里面的这个while跟用for循环实现的执行逻辑差不多,都是阻塞执行的,如果中间有中断进来会进入中断 ...

那中断完了以后再进入这个for或while的 里面会重新减还是继续上一次的数值往下减

出40入42汤圆

发表于 2020-8-11 17:05:09 | 显示全部楼层
杨朔学单片机 发表于 2020-8-11 17:00
那中断完了以后再进入这个for或while的 里面会重新减还是继续上一次的数值往下减 ...

进入中断服务流程之前,会有现场保护,中断服务流程结束后,会有现场恢复
所以是继续中断之前的状态继续执行

建议看一下微机原理之类的基础书籍吧,都有详细讲解

出0入4汤圆

 楼主| 发表于 2020-8-11 17:05:35 | 显示全部楼层
norman33 发表于 2020-8-11 16:34
delay会被定时中断打断的

打断以后再回到delay里面,delay里面 i 的值会被清零吗?

出65入0汤圆

发表于 2020-8-11 18:10:24 来自手机 | 显示全部楼层
你delyms不会是调用delyus,然后1S定时中断也是用systick吧?

出0入21汤圆

发表于 2020-8-11 19:07:07 | 显示全部楼层
杨朔学单片机 发表于 2020-8-11 15:03
void main()
{
    u8 t1=0,t2=0,t3=0;

你的程序跑完这个main之后就失控了.跑飞掉了.加一个while(1).让main里的程序一直循环跑才对吧.

另外做这种程序,你可以把定时器做成1ms中断一次,在中断里放个变量++. 也就是说这个变量每1ms自增1.
然后在main里判断这个变量, ==1时亮灯,==101时灭灯并清0变量,这样你的灯就每100ms一亮一灭了.至于要延时1000还是1500都以此方法同理.

出0入8汤圆

发表于 2020-8-11 21:11:34 | 显示全部楼层
不建议用for循环来延时,建议采用非阻塞式

出0入36汤圆

发表于 2020-8-12 09:14:49 | 显示全部楼层
杨朔学单片机 发表于 2020-8-11 17:05
打断以后再回到delay里面,delay里面 i 的值会被清零吗?

撇开你while大循环本身的问题或者定时中断不合理的问题,只要while(1)正常循环,定时中断出来后,while里面状态不变继续执行打断后的步骤,除非你在中断里动了全局变量。

出0入4汤圆

 楼主| 发表于 2020-8-12 14:51:30 | 显示全部楼层
luweixuan 发表于 2020-8-11 18:10
你delyms不会是调用delyus,然后1S定时中断也是用systick吧?

是这样调用的, 不应该这样调用对吧

出0入4汤圆

发表于 2020-8-13 08:52:42 | 显示全部楼层
luweixuan 发表于 2020-8-11 18:10
你delyms不会是调用delyus,然后1S定时中断也是用systick吧?

你想多了,问这么简单问题的人,会知道什么是systick吗?

出65入0汤圆

发表于 2020-8-20 21:06:41 | 显示全部楼层
杨朔学单片机 发表于 2020-8-12 14:51
是这样调用的, 不应该这样调用对吧

systick只是一个定时器,不能同时交两个女朋友。一个女朋友给你约时间,等到时间了你的时间过去。另一个女朋友,也约你时间,你也得过去。而且你还用在一个群里个两个女朋友聊天!牛逼了!解决方法:1s中断用systick,dely用Timer1或其他的定时器。或者systick你用一个long int变量值自加,其他的延时函数(包括秒延迟)不要对systick的计时器值初始化,只读取自加变量的值来判断是否达到要的延迟时间即可。这样还可以做成非阻塞的延迟。

出65入0汤圆

发表于 2020-8-20 21:07:30 | 显示全部楼层
laujc 发表于 2020-8-13 08:52
你想多了,问这么简单问题的人,会知道什么是systick吗?

哎,谁都是从这样过来的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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