精华内容
下载资源
问答
  • 单片机按键消抖————中断服务函数内能延时吗?
    千次阅读
    2019-09-11 17:58:06

    首先明白一个道理,在中断服务函数内搞延时的都是菜鸟,很不幸,网上搜到的基本都是延时10-20ms。

    中断服务函数要求短小精悍,正常情况下仅用于发送一个信号或设置一个标志位,执行时间越短越好。好嘛,你在里面嘟嘟嘟延时一大段时间(10ms对mcu而言,真的好长了,太长了),你想过mcu的感受吗?mcu买袋敢辣条,让你吃一个尝尝,好嘛,您倒是不可以,一口气吃了大半袋,你不过份吗?

    正确做法:在外部中断服务函数内,除了必要的判断和清除,仅开启定时器。使用定时器延时10-20ms,然后在定时器中断服务函数内读取gpio电平。

    更多相关内容
  • 在学单片机时我们第一个例子就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们可以用定时器来...
  • 延时中断出错,是单片机新手在单片机开发应用过程,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机...
  • 由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢?  一般情况下,都认为...
  • 用定时器中断控制流水灯延时时间,用外部中断0控制按键实现切换流水灯延时时间,外部中断1控制实现切换流水灯方向;
  • 实现功能:定时器产生延时1秒程序 使用芯片:STC15F104E 晶振:12MHZ 波特率:9600 编译环境:Keil
  • 所以,中断程序中不要写调用延时程序中断程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断程序中设置一个标志位,在主程序中查这个标志位,当...

    A回答:
    通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。

    所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

    首先,对于CPU频率的理解,1Mhz的频率CPU周期就是1us(1 / 1000000秒)
    B回答:
    1、既然1Mhz对应1us(也就是1us对应一个指令周期,不考虑流水线的单指令周期),这样,一个指令周期就对应一条指令。

    2、假设每条指令都有2个字节大小(16位指令),这样,1ms时间内1Mhz的CPU可以大约运行2KB的代码。因此如果中断处理函数的代码越接近2KB,则越容易对中断。

    3、假设一个10Khz外设,中断处理程序允许的最大安全尺寸是多少?

    易Cortex M3为例,支持16/32位指令操作(大部分为单周期指令),假设主频为72Mhz,100Khz相当于100us 。

    则如果是16位指令(前面算过1ms 2KB代码),72 * 100 * 2到72 * 100 * 4之间(14.4~28.8),去最小14.4KB。

    展开全文
  •  图2 中断服务程序流程  图3 低发音子程序流程  图4 高发音子程序流程  图5 高声1s子程序流程  图6 3声发音子程序流程  图7 延时1s子程序流程  程序的模块化设计是较常用的编程方式,这...
  • msp432延时程序,可修改对应mpu频率(中断方式)
  • 为什么单片机程序中,外部中断0服务函数加入延时函数为什么要软件清0; void int0()interrupt { intflag 0=!intflag0; led9=intflag0; delay(20) IE0=0; 最后为什么要清零IE }
  • 这是一个很小的利用中断延时的小程序,但对于初步接触单片机中断的人来说,这不为是一个很好的例题。
  • 1、中断服务程序设计原则是要快进快出,printf的实现会一直调用到底层逐个字节的打印输出,这种IO操作效率很慢,不适合放到中断里面。如果有锁机制,可能会造成死锁。 2、printf是不可重入函数,对于线程来说是不...

    目录

    一、中断服务器子程序里面不要有printf

    二、不要有浮点数运算

    三、参数几返回值


    一、中断服务器子程序里面不要有printf

    1、中断服务子程序设计原则是要快进快出,printf的实现会一直调用到底层逐个字节的打印输出,这种IO操作效率很慢,不适合放到中断里面。如果有锁机制,可能会造成死锁。

    2、printf是不可重入函数,对于线程来说是不安全的

    二、不要有浮点数运算

    浮点数运算需要有额外的寄存器参入计算,也是不可重入的

    三、参数几返回值

    没有操作系统的单片机上,中断服务程序不能传递参数和有返回值,有操作系统的上面是可以传递参数和返回值的,其实返回值也没有太大作用。

    展开全文
  • 1,中断处理程序不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念; 2,中断处理程序延时可以用忙等待函数来代替,如ndelay,...

    转自:http://blog.csdn.net/samantha_sun/article/details/6790492

    1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念;

    2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。但是在中断处理程序中使用msleep却不行。(见linux设备驱动开发详解第二版p210页)

    3,printk函数在中断处理函数中可以使用,但是会占用较多时间,降低效率。在调IIC驱动的时候,由于IIC读取写入处理时必须进行一定延时,在我没有使用udelay的时候,竟然用printk就使IIC中断正常运行,当时在调试的时候,发现有些printk加上程序就正常,去掉就不正常,当时真是匪夷所思,但现在明白了,因此printk占用时间比较大,正好充当了IIC延时的功能。最后我把printk全部去掉,在需要延时的地方加入udelay,才使程序正常运行。

    4,使用for和while等的空循环在中断处理函数中进行延时操作,在实际测试中发现并不能起到延时的功能,linux内核处理这种循环速度很快,并没有延时的效果。这跟裸板程序使用循环来延时的用法不相同。

     

    以上是我的总结,然后摘抄一些别人的总结,摘自:http://cache.baidu.com/c?m=9d78d513d9d437ab4f9b96697d12c0176d4381132ba6db020ea08439e7732a41501794ac56240704a2873c3c5de91048adb0687d6d4566f58cc9fb57c0ebcc757a9f27437318875612a448f2945b7b966bc306b6f445bcefa72595acd1d3db49&p=93759a40d59910ea0be290221508&user=baidu&fm=sc&query=%D6%D0%B6%CF%C9%CF%CF%C2%CE%C4+printk&qid=f445575e01162846&p1=1

     

    1、中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚上。然后再由中断控制器向处理器发送相应的信号。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当的处理了。

       

       2、不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识。中断值通常被称为中断请求(IRQ)线。有些中断值是指定的,有些是动态分配的。特定的中断总与特定的设备相关联。

     

       3、异常与中断不同,它在产生时必须考虑与处理器时钟同步。异常也常常称为同步中断。许多处理器体系结构处理异常与中断的方式类似,因此内核对它们的处理也很类似。

      

       4、在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序。一个设备的中断处理程序是它设备驱动程序的一部分。

       5、中断处理程序与其他内核函数的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。

     

       6、中断处理一般分为两个部分,中断处理程序是上半部-接收到一个中断就立即执行,但只做有严格时限的工作,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作被推迟到下半部去。通常情况下,下半部会在中断处理程序返回时立即执行。

     

       7、Linux中的中断处理程序是无需重入的。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其他的中断都是打开的,所以这些不同中断线上的其它中断都能被处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝对不会被同时调用以处理嵌套的中断。

       8、共享的中断处理程序与非共享的在注册和运行方式上比较类似,但差异主要有以下三处:

    •    注册中断处理程序函数request_irq()的参数flags必须设置SA_SHIRQ标志。
    •    对每个注册的中断处理程序来说,dev_id参数必须唯一。不能给共享的处理程序传递NULL值。
    •    中断处理程序必须能够区分它的设备是否真的产生了中断。否则它根本无法知道是它对应的设备发出了这个中断还是共享这条中断线的其它设备发出了这个中断。

       9、当执行一个中断处理程序或下半部(soft_irq, 或者tasklet)时,内核处于中断上下文中。中断上下文和进程并没有什么瓜葛。因为没有进程的背景,所以中断上下文不可以睡眠。因此,不能从中断上下文中调用某些函数。如果一个函数睡眠,就不能在中断处理函数中使用它。中断上下文具有较为严格的时间限制,因为它打断了其他代码。中断上下文中的代码应当迅速简洁,尽量不要使用循环去处理繁重的工作。尽量把工作从中断处理程序中分离出来,放在下半部执行。中断处理程序并不具有自己的栈。相反,它共享被中断进程的内核栈。如果没有正在运行的进程,就使用idle进程的栈。中断处理程序共享别人的堆栈,所以它在栈中获取空间时必须非常节省。内核栈本就很有限,所有的内核代码都应该谨慎利用它。

       10、Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力,这些例程都是与体系结构相关的,可以在<asm/system.h>和<asm/irq.h>中找到。

       11、控制中断系统的原因归根结底是需要提供同步。通过禁止中断,可以确保某个中断处理程序不会抢占当前代码,还可以禁止内核抢占。但它们都没有提供任何保护机制来防止来自其他处理器的并发访问。锁提供保护机制来防止来自其他处理器的并发访问。禁止中断提供保护机制来防止来自其他中断处理程序的并发访问。



    展开全文
  • 自己写的,测试通过。MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA,MSP430F149定时器中断延时1s,TimerA
  • 中断还可以进行嵌套,就是CPU在执行一个中断程序的时候又被打断,去执行另一个中断程序,执行完再回来执行第一个中断程序,执行完再回来执行主程序。类似于你在洗衣服的时候去关烧开水的火之后灌开水,正灌着呢发现...
  • 写了一个按键中断服务程序,按下key1pwm输出,按下key2关闭pwm输出,在不加延时的时候key2可以关闭key1打开的pwm,但是加了延时之后key2就不起作用了,是因为在中断服务函数中加了延时导致key2无法响应了吗,即是在...
  • 51单片机中断嵌套,定时器延时

    千次阅读 2021-01-08 11:24:28
    51单片机中断嵌套,定时器延时前言一、如何做到定时器延时?二、如何做到外部中断?三、如何合并1.引入库2.读入数据总结 前言 这里讲的是中断嵌套,具体的话是用定时器延时,外部中断触发,不断切换 提示:以下是...
  • ANDROID GPIO 中断程序

    2013-04-27 10:37:04
    ANDROID GPIO 驱动: GPIO SYSFS 格式驱动; GPIO 中断驱动;
  • 51单片机程序 59秒计时器(利用定时器延时中断法)-C语言版.zip
  • arduino如何在中断函数编写延时函数

    千次阅读 多人点赞 2019-02-27 20:14:17
     可以使用上述的方法实现在中断函数延时,delaymicrosecond()不是使用计时器,而是用avr汇编的loop循环来实现的,所以在中断中,这个函数依然可以起作用。但是注意不要影响下一次的中断的进入,这个函数是微秒...
  • 应用中断,精确的c语言延时程序,可以精确到mS,时间长度可调,程序整体结构严谨易懂,可移植性好,让你不再为延时而苦恼
  • 但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值...
  • 新手在单片机开发应用过程,时而出现延时与...开启中断源之后,有初始化中断、响应中断等都是从中断入口地址处执行中断程序的,建议有中断程序尽可能的简洁,越短越好。而延时仅仅是主程序在执行的过程不断调...
  • 在外部中断处理函数内加入延时函数,外部中断不响应。 解决: 利用stm32cubemx生产代码的时候,没有考虑外部中断的优先级,使用的都是最高优先级,所以延时函数得不到执行,则延时函数后面的执行代码也得不到执行...
  • STM32学习记录之定时器中断代替延时函数实现更精准计时(延时延时在很多函数处理中都是一个必不可少的操作,对于很多初学者来说,都知道在代码里加一句delay()就能延时,如果再了解多一点就知道delay_us(xx)就能...
  • 单片机定时器延时程序

    千次阅读 2021-05-19 16:54:11
    单片机定时器延时程序单片机的延时程序(包括asm和C程序,都是我在学单片机的过程用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR...
  • KeilC51程序设计几种精确延时方法

    千次阅读 2021-05-24 01:45:50
    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。...本程序中假设使用频率为12 MHz的...
  • 怎么编写单片机晶振为6MHz,编写100ms延时程序?设主频12MHz的51单片机,编一个100ms二重循环的延时程序如下,供参考。其它汇编可以类似编程。SSSS:MOV R0,#99;本指令是单周期指令,用时1usKKKK0:DJNZ R0,KKKKK;2...
  • 随着MCU、DSP等芯片技术的高速发展,数字控制系统几乎占据了原来模拟控制系统把持...那是不是只要我们把程序用C代码一写,然后弄几个定时中断跑跑,只要程序执行时间不超过中断周期,就万事大吉了呢?有没有改进的空间?
  • 单片机的延时中断问题及解决方法.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,675
精华内容 21,870
关键字:

中断服务程序中延时的作用