精华内容
下载资源
问答
  • 这是一个很小的利用中断延时的小程序,但对于初步接触单片机中断的人来说,这不为是一个很好的例题。
  • 所以,中断程序中不要写调用延时程序中断程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断程序中设置一个标志位,在主程序中查这个标志位,当...

    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,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。但是在中断处理...

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

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

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

    转自:http://blog.csdn.net/samantha_sun/article/details/6790492
    展开全文
  • AVR单片机精确延时中断程序生成工具,是AVR开发人员不可多得的工具,使用方便,省时。。。
  • 嵌入式实时操作系统中断延时

    千次阅读 2014-06-14 08:54:13
    由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢?   一般情况下,都...

    由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢? 

          一般情况下,都认为处理器是随时可以响应中断申请的。其实并非如此,首先在处理器关闭中断时不能响应中断申请;另外处理器在正在执行一条指令时也不能响应中断申请。因此,当某个事件向处理器发出中断请求时,处理器可能正在执行另外一个中断服务程序。如果为了保证操作的原子性,正在被执行的中断服务程序关闭了中断,那么处理器在这期间就不会响应具有更高优先级别的中断请求。通常,具有高优先级别的中断请求往往对应着更紧急的实时任务,那么上面的情况就意味着紧急事情要等不太紧急的事情做完才能做,这对于紧急事情来说就是一个延时,低级中断服务程序关闭中断时间越长,这段延时也就越长,对紧急任务的及时处理就越不利。所以在为实时系统设计软件尤其是设计操作系统的中断服务程序时,必须对关中断的时间进行精心的控制,尽量减少中断嵌套时对高优先级别中断的延时。例如,在Linux系统中,为了减少因中断服务程序关中断而引起的高优先级别中断的延时,把中断服务程序分成了前后两部分,把必须在关中断状态进行的任务放在前半部分并使其尽可能短,而把大多数工作放在了中断开放的后半部分。

      有时,调度器引起的调度延时也会反映到中断延时中,因为中断的服务有时是用一个进程来完成的。也就是说,在中断服务程序中通过发送消息的方法激活一个进程,并在这个被激活的进程中完成中断所应提供的服务。既然是要激活一个进程,调度器就要进行调度,于是调度器在调度时的延时也就自然反映到这次中断延时中了。

      这种调度的延时比较复杂,它由两部分组成:一部分是调度器在调度工作时所必须耗费的时间;一部分是调度器等待调度所需要的时间。在概念上,第一部分引起的延时比较清楚,麻烦的是第二部分的延时。因为在操作系统中,在中断过程中是不允许进程调度的,也就是说,从中断处理器执行的优先级别的角度来看,中断的优先权是大于所有进程的,所以调度器只能等待所有中断服务都结束之后才能进行进程调度。如果中断嵌套的层次很多,那么这个延时的长度就很可观了。

      显然,由上述调度延时引起的中断服务延时的大小取决于系统的负荷,而且这种延时的可预测性极差。其实,如果对这种工作方式不谨慎规划,还会出现另外一些更复杂情况而大大增加中断延时,这也正是设计实时系统的难点之一。

      除了上述造成中断延时的因素之外,还有一个可能的因素就是DMA。有些计算机系统为了增加内存数据块的传送速度,使用了直接数据传送控制器DMA。其实,DMA请求也是一种中断,只不过它向处理器请求的是总线的控制权,而不是处理器罢了。所以,在DMA控制期间,由于处理器要把总线控制权让给DMA而失去总线控制权,尽管处理器还可以做一些不使用总线的工作,但肯定不会马上响应来自总线的外部中断请求,因此也会造成较大的中断延时。

      正因为DMA有提高系统工作速度的一面,也有造成中断延时过长而降低中断响应速度一面,所以在实时系统中是否以及如何使用DMA技术,在设计系统时要慎重考虑。一般在实时性要求较高的硬实时系统中不要使用DMA。

      另外,实时计算机系统最好采用RISC指令系统有两个原因:一是RISC指令系统的指令执行时间要比CISC系统指令短得多,所以指令执行时间所引起的中断延时也会小得多;二是 在CISC指令系统中,指令的执行时间极为不均匀,短的指令只需要几个时钟脉冲,长的指令 却需要几十个脉冲才能执行完成,这就给一段程序模块执行时间的预测带来了困难,使之难于 满足实时系统执行时间可预测的要求。

    展开全文
  • 由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢?  一般情况下,都认为...
  • 中断处理程序中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感) http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,...

    中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)  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内核处理这种循环速度很快,并没有延时的效果。这跟裸板程序使用循环来延时的用法不相同。

     

    下面引用QNX驱动开发——中断处理  http://www.cnblogs.com/splovecyk/p/4383162.html的描述
    有些人在中断服务程序中使用延时函数和printf函数和malloc函数,其实是很不可取的。
    a. 延时函数不仅大大降低了中断执行的效率,也可能会屏蔽下次中断的产生,从而丢失对中断的响应。
    b. 对于printf函数为什么不行呢?可以从输出原理上进行解释。通过调用Printf函数,将字符串输出到console的时候要调用到串口,这里涉及到身躯信号量以及阻塞操作,会加大中断服务程序的执行时间. 假设用115200bps的波特率,打印一个字符需要的时间大概是约大于(8)*1/115200 = 70us,一次打印几十上百个字符的时候,对于内核来说时间延迟就相当可观了.
    c. malloc是不可重入函数,如果在其还没返回就再对其调用将出现灾难性后果。
    为了尽量减少中断服务程序执行的时间,减小调度等待时间,那么在操作系统中ISR最好的实现方式就是,发生中断时,设置标志,构造一个尽量简短的ISR,其他工作单独创建相应的线程去执行。

     

    其他:

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

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

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

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

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

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

       7、Linux中的中断处理程序是无需重入的[我有疑议: 如果中断和应用程序都在调用一个不可重入函数不就出问题了? 中断调用该函数的时候可能会破坏应用程序对该函数的执行过程. oucaijun]。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收 另一个新的中断。通常情况下,所有其他的中断都是打开的,所以这些不同中断线上的其它中断都能被处理,但当前中断线总是被禁止的。由此可以看出,同一个中 断处理程序绝对不会被同时调用以处理嵌套的中断。

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

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

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

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

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

    转载于:https://www.cnblogs.com/mylinux/p/5534325.html

    展开全文
  • 应用中断,精确的c语言延时程序,可以精确到mS,时间长度可调,程序整体结构严谨易懂,可移植性好,让你不再为延时而苦恼
  • 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有...2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根
  • /*延时x秒*/ void main() { IT0=1; EA=1; EX0=1; for(;;) P1=0x00; } void f()interrupt 0 { P1=0xff; delay(1); } void delay(unsigned char x) { unsigned char i,j; for(j=1;j<=x;j) ...
  • 由于外部事件的发生常常是以一个中断申请信号的形式来通知处理器,然后才运行中断服务程序中来处理该事件,所以中断延时是影响系统实时性的一个重要因素。那么都有哪些问题影响中断延时呢? 一般情况下,都认为...
  • 延时程序

    2015-03-19 18:35:30
    展讯平台操作系统是ThreadX,他们做...下面是驱动中常用的延时函数: PUBLIC void XXX_Delayms (uint32 ms) { if (SCI_InThreadContext()) //线程上下文 { SCI_Sleep (ms); } else //中断上下文 { OS_TickDe
  • 单片机里面有很多中断资源,例如外部中断、定时器中断、串口中断等,这些中断资源应当用于处理相应的紧急事件,而不是顺序执行的常规事件,所以在编写中断程序的时候应当十分注意。具体的事务处理语句不应放在中断...
  • 采用中断延长时间的C程序和仿真,供大家学习和交流用。
  • 晶振频率为12MHZ,延时0.2s子程序: DELAY:MOV R5,#200 //机器周期:1 DELAY1:MOV R6,#250 //1 DELAY2:NOP //1 NOP //1 DJNZ R6,DELAY2 //250*(1+1+2)=1000 DJNZ R5,DELAY1 //200*(1+1+1+...
  • 据前人说,做嵌入式系统最忌讳的就是程序延时和浪费timer,所以平时写程序很努力的在避免毫秒级的延时,而且一般的rtos是需要个时基的,所以尽量做到只用systick来完成系统时基,毫秒,微妙的延时。但做18B20等的...
  • 中断程序

    千次阅读 2016-08-24 16:31:56
    我在程序里开了三个中断,一个计数器用于精确延时用,另外两个为外部事件处理中断,下面一一详细介绍,方便初学者入门。 在进行STM32中断配置之前首先需要了解下它的中断部分: 一、Cortex-M3中断机制  
  • 51单片机控制42步进电机——程序实现(中断PWM/延时函数) 最近抽出时间做了一下51单片机控制步进电机的程序,包括硬件连接,亲测可以实现。现在将过程记录了下来,包括代码。 硬件部分 项目 硬件列表 51...
  • 但对于绝大多数人,我们在最最初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子: while(1) { LED=OFF; Delay_ms(500); LED=ON; Delay_ms(500); } 然后,在我们接触到定时器,我们会发现...
  • 我目前碰到一个问题,我设计了一程序,用延时信号做数据脉冲载波,使用的是高频信号,另外做了一红外接收程序用了中断,但是在使用过程中发现,这个中断对我在的载波程序产生了一定影响,无规律的多延时了几百ns,对...
  • 你想知道的PC\SP在这里 ... 另外怎样避免中断程序不破坏延时参数? 可以在中断中启用不同的工作寄存器组;也可以将原工作器组的数据进行保护,中断服务完了再返回去。 ...
  • unsigned char rMinuteCount; //分计时数 sbit IsOneSecondReach; sbit Pulse_Sec=P1^0;...//do something,如果一秒延时标志为1,则清除此标志,等待下次1秒,在此处 //执行需要执行的程序 } } }
  • 但对于绝大多数人,我们在初让灯闪烁起来时大约都会用到阻塞延时实现,会像如下代码的样子:然后,在我们接触到,我们会发现,原来用定时中断来处理会更好。比如我们可以500ms中断,让灯亮或灭,其余的时间系统还...
  • 初始化程序用于对全局变量的初始化和中断寄存器的初始化 ****************************************************/ void init() //初始化函数 {  enblescan=0;//允许检测是否有键按下  sign=0;  flag=0;  i=0; ...
  • 延时函数程序

    2014-05-14 16:10:25
    /修正了中断中调用出现死循环的错误 //防止延时不准确,采用do while结构! ////////////////////////////////////////////////////////////////////////////////// static u8 fac_us=0;//us延时倍乘数 static u16 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 832
精华内容 332
热门标签
关键字:

中断延时程序