精华内容
下载资源
问答
  • DM9000 接受中断产生的原因

    千次阅读 2011-06-09 18:51:00
    在DM9000接受数据的时候一般采取的是中断的方式,这样子比较高效但是我们上位机发生数据给我们的dm9000网卡芯片的时候,接受中断是怎么产生的呢: 数据包接收功能是 DM9000 芯片实现网络功能的基础,在接收数据时...

    在DM9000接受数据的时候一般采取的是中断的方式,这样子比较高效但是我们上位机发生数据给我们的dm9000网卡芯片的时候,接受中断是怎么产生的呢:

    数据包接收功能是 DM9000 芯片实现网络功能的基础,在接收数据时采用中断方式,即当有数据到来并在 DM9000 内部 CRC 校验通过后会产生一个接收中断,中断发生时可以将 DM9000 所接收到的数据包读出并交由上层协议进行处理。接收到的数据在经过了硬件部分的 CRC 校验之后存放在 RX FIFO 中,在 DM9000中的内部地址 0x0C00-0x3FFF(13K byte)。在每一个接收到的数据包的前面都有一个 4bytes 的头,这四个字节是01h,status,byte_count_low,byte_count_high.

    展开全文
  • 相同代码,EXTI中断总是会进入两次,为了验证,我手动在中断中进行了清除, void EXTI0_IRQHandler(void) { /* USER CODE BEGIN EXTI0_IRQn 0 */ /* USER CODE END EXTI0_IRQn 0 */ HAL_NVIC_ClearPendi...

    调试新的芯片Stm32F407时,发现和以前的不一样。

    相同的代码,EXTI中断总是会进入两次,为了验证,我手动在中断中进行了清除,

    void EXTI0_IRQHandler(void)
    {
        /* USER CODE BEGIN EXTI0_IRQn 0 */
    
        /* USER CODE END EXTI0_IRQn 0 */
        HAL_NVIC_ClearPendingIRQ(EXTI0_IR0n);    // HAL_GPIO_EXTI_IRQHandler 会做同样的工作
        __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0);  // 等价于 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin)
        //HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  // 其中调用了 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); 
        /* USER CODE BEGIN EXTI0_IRQn 1 */
        //if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIO_INPUT_EXTI_PORT, GPIO_INPUT_EXTI_P0))
        Exti_Interrupt(0); //自己写的中断功能函数
        /* USER CODE END EXTI0_IRQn 1 */
    }

    即使使用了ClearPendingIRQ,也同样会在中断产生时进入两次。以前使用的STM32F1xx芯片没有这个现象,不清楚不同批次之间,会不会有类似的问题。

    当然,从程序的角度,对于按键类的操作,一般要求是在Exti_Interrupt中进行debouncing(去抖动)操作,这样是最稳妥的办法。

    不过这里纠结的是,为什么会两次进入中断呢?

    因为没法弄明白芯片设计,只能猜,大约是硬件在设计时的考量取舍有一定难度,所以导致有的STM32芯片会多次进入,有的不会。

    当然,官方STM示例中是不使用HAL_NVIC_ClearPendingIRQ(EXTI0_IRQx)这样的操作的,不敢说这句是否有用。默认不去处理后续的挂起操作,那么不使用这个清除会不会更好,估计得有运气的成份,如果抖动不存在那最好了,貌似我这里不行。

    经过搜索,在这里发现了一个比较合理的解释
    http://www.keil.com/support/docs/3928.htm

    在概意思就是和硬件有关。后面还给出了一个解决办法(和去抖动类似),弄一个延时操作在前面。

    我把全部原文贴在下面,

    ARM: Cortex-M3/M4 Interrupts Happening Twice?


    Information in this knowledgebase article applies to:

    • Cortex-M3 and Cortex-M4 Devices

    SYMPTOM

    Cortex-M3 and Cortex-M4 interrupts appear to be triggering twice.

    CAUSE

    This may happen with devices:

    • That add an external, system-level write buffer in their Cortex-M3 or Cortex-M4 design, AND
    • The ISR code exits immediately after a write to clear the interrupt.

    In this situation, the write to clear the interrupt may not complete before interrupt triggers a second time.

    REASON

    For the Cortex-M3 and Cortex-M4 cores, writes (STR, STMIA or PUSH) to memory are internally buffered. The Harvard architecture allows the MCU to fetch and execute instructions without waiting for data writes to memory to complete. The Cortex-M cores are aware of the internal buffer and prevent subsequent interrupts until the internal buffer empties and the write completes.

    Sometimes vendors incorporate an additional external, system-level write buffer in their Cortex-M3 and Cortex-M4 designs for better performance. But unfortunately, the core is not aware of this external write buffer and cannot access it's status. For these externally-buffered devices, if an ISR exits immediately after clearing the interrupt register, a second interrupt could trigger again before the write to clear the interrupt completes.

    For example, this ISR exits immediately after clearing the timer interrupt. Without the external buffer implementation, this code would work as expected. However, on a device with an external, system-level write buffer, this code could cause this "double IRQ" condition:

    void Timer_IRQHandler (void) {
      Timeout_counter++;                /* Increment timeout counter */
      PortD->PTOR |= 1<<0;              /* Toggle output on port D0  */
      Timer->MSR |= TIMER_MASK;         /* Clear timer interrupt     */
    }
    

    RESOLUTION

    Using the DSB instruction or __dsb(0) intrinsic before exiting will force a wait for the internal write buffer to empty, but that instruction cannot test the status of an optional system-level write buffer if there happens to be one. To make sure the peripheral interrupt register gets set properly, just perform another memory write before exiting the ISR.

    Given the example above, one way to do this is by incrementing the timeout counter AFTER clearing the interrupt:

    void Timer_IRQHandler (void) {
      PortD->PTOR |= 1<<0;              /* Toggle output on port D0         */
      Timer->MSR |= TIMER_MASK;         /* Clear timer interrupt            */
      Timeout_counter++;                /* Count timeout & insure IRQ clear */
    }
    

    But any type of memory write will accomplish this. The Timeout_counter++ works because it performs a read-modify-write to memory. If you can't move an instruction like in the above example, just add harmless code that performs a read-write like this:

    void Timer_IRQHandler (void) {
      Timeout_counter++;                /* Increment timeout counter */
      PortD->PTOR |= 1<<0;              /* Toggle output on port D0  */
      Timer->MSR |= TIMER_MASK;         /* Clear timer interrupt     */
      PortD->PTOR = PortD->PTOR;        /* Insure IRQ clear          */
    }
    

    Last Reviewed: Wednesday, June 14, 2017

     

    展开全文
  • EINTR中断产生错误

    2019-12-26 21:13:32
    1、介绍慢系统调用 该术语适用于那些可能永远阻塞系统调用。永远阻塞系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。...写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞...

    1、介绍慢系统调用

    该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。

    慢系统调用可以被永久阻塞,包括以下几个类别:

    (1)读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。
    (2)当打开某些特殊文件时,需要等待某些条件,才能打开。例如:打开中断设备时,需要等到连接设备的modem响应才能完成。
    (3)pause和wait函数。pause函数使调用进程睡眠,直到捕获到一个信号。wait等待子进程终止。
    (4)某些ioctl操作。
    (5)某些IPC操作。

     

     

    2、EINTR错误产生的原因

    如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“Interrupted system call”)。

    如下表所示的系统调用就会产生EINTR错误,当然不同的函数意义也不同。


    系统调用函数
        
    errno为EINTR表征的意义

     

    1. write  
    2. 由于信号中断,没写成功任何数据。  
    3.   
    4. The call was interrupted by a signal before any data was written.  
    5. open  
    6.       
    7. 由于信号中断,没读到任何数据。  
    8. The call was interrupted by a signal before any data was read.  
    9. recv  
    10.       
    11. 由于信号中断返回,没有任何数据可用。  
    12. The receive was interrupted by delivery of a signal before any data were available.  
    13. sem_wait  
    14.       
    15. 函数调用被信号处理函数中断。  
    16. The call was interrupted by a signal handler.  

     

     

     

    3、解决办法

    既然系统调用会被中断,那么别忘了要处理被中断的系统调用。有三种处理方式:

     

    1 人为重启被中断的系统调用

     

    当碰到EINTR错误的时候,有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,若connect函数返回一个EINTR错误的时候,我们不能再次调用它,否则将立即返回一个错误。针对connect不能重启的处理方法是,必须调用select来等待连接完成。

    理解“重启”?

    一些IO系统调用执行时,如 read 等待输入期间,如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是让系统调用失败?早期UNIX系统的做法是, 中断系统调用,并让系统调用失败, 比如read返回 -1, 同时设置 errno 为EINTR中断了的系统调用是没有完成的调用,它的失败是临时性的,如果再次调用则可能成功,这并不是真正的失败,所以要对这种情况进行处理, 典型的方式为如下,我们采用accept函数为例子,代码如下

     

     

     

    1. ACCEPT:  
    2.     clifd = accept(srvfd,(struct sockaddr*)&cliaddr,&cliaddrlen);  
    3.   
    4.     if (clifd == -1) {  
    5.         if (errno == EINTR) {  
    6.             goto ACCEPT;  
    7.         } else {  
    8.             fprintf(stderr, "accept fail,error:%s\n", strerror(errno));  
    9.             return -1;  
    10.         }  
    11.     }  

     

     

     

    2 安装信号时设置 SA_RESTART属性(该方法对有的系统调用无效)

     

     

    1. struct sigaction action;    
    2.      
    3. action.sa_handler = handler_func;    
    4. sigemptyset(&action.sa_mask);    
    5. action.sa_flags = 0;    
    6. /* 设置SA_RESTART属性 */    
    7. action.sa_flags |= SA_RESTART;    
    8.      
    9. sigaction(SIGALRM, &action, NULL);    


    并不是所有的都有效

     

     

     

    3  忽略信号(让系统不产生信号中断)

     

     

    1. struct sigaction action;    
    2.  
    3. action.sa_handler = SIG_IGN;    
    4. sigemptyset(&action.sa_mask);    
    5.      
    6. sigaction(SIGALRM, &action, NULL);    


    所以建议大家用第一种方法,重启

    展开全文
  • 用于进入停止模式的中断和用于产生唤醒的中断,后者要抢占优先级一定要高,否则无法唤醒。 由实验结果分析原因: 由于进入停止模式后,调节器以低功耗模式提供1.8V电源未断开,寄存器内容还是保持,所...

    之前做实验时,实验时遇到了一个很严重的问题,就是停止模式无法唤醒。

    实验内容主要是:用一个外部中断的响应,使得程序进入停机模式。然后再通过其他一个外部中断或者闹钟中断将单片机唤醒。但是调试了很久

    用于进入停止模式的中断和用于产生唤醒的中断,后者要抢占优先级一定要高,否则无法唤醒。

    由实验结果分析原因:

    由于进入停止模式后,调节器以低功耗模式提供1.8V电源未断开,寄存器的内容还是保持的,所以程序还处在中断里面。但另一个中断来唤醒时,由于抢占的优先级不够高,无法抢占原来的中断,故无法唤醒。所以只有用来唤醒的中断抢占优先级高,才可以唤醒!!


     

    展开全文
  • i2c设置中断的原因

    千次阅读 2013-04-01 21:54:11
    查找中断源是一种保险做法,要是由于其他哪几种原因产生中断,但是此时数据并没有接收完,中断服务子程序去处理数据了,结果就不对了!如果你自己敢保证不会出现哪几种情况就可以完全不用写! 读写操作 ...
  • 1、中断产生的原因 2、如何将中断向量与中断服务程序关联起来 3、外部中断 一、中断 中断产生的原因有两种:一是外部中断,就是由硬件产生的中断;另一种是由指令int n产生的中断。 二、如何将中断向量与...
  • Linux Centos 安装了Redis,大概跑2、3天就出现redis失效,网站监控报警,查了redis的日志,竟然没有log中断的原因提示,对redis的稳定性产生了怀疑,度娘了大家的评论资料,对redis的稳定性还是肯定的,出问题...
  • 中断

    2021-02-26 11:15:25
    中断 中断使得硬件得以发出通知给处理器,是一种变内核主动为硬件主动方式。中断本质上是一种特殊电信号。硬件在生成中断的时候并不需要考虑与处理器时钟同步,即中断可以随时产生,...异常的产生原因: 1.处
  • SPI2和TIMER默认初始化优先级都是4,应用时TIMER定时中断产生,进入中断处理函数进行SPI写操作,而SPI完成一次写操作后,需要等待SPI中断中完成标志位置位,但是,TIEMR和SPI中断优先级相同,无法此时...
  •  原因:第一次捕获完毕,停止中断的时候,只是停止了总中断的开关,而2407是有两级中断构成,底层事件管理器那一级还在继续进行,捕获也仍然在进行。这样容易产生混乱。  解决方法:停止中断的时候,
  • 反复比较,排错,发现自己竟然犯了一个如此低级的错误,代码如下: //Timer3不能来的原因: DWORD Timer3_Thread(PVOID pArg) { DWORD ret; while(1) { RETAILMSG(1,(_T("[PT486]++Timer3_Thread./n...
  • java中的异常什么是异常异常产生的原因Java中异常的分类 什么是异常 Java中的异常(Exception)又称例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行...
  • 硬件原因引起的中断过程中是不可测,随机,软件中断是可以人为控制断点:一个地址,程序在该处中断,转而取执行中断程序地址。中断源:引起中断的信号源。异常优先级概念同时出现两个中断源,就会出现先...
  • 发现此时计数器TBCTR到死区计数器值就清零了,重新计数,永远到不了PRD寄存器值,所以中断条件一直到不了。 寻找原因中 ...spm=1001.2101.3001.4242C2000中ePWM模块间同步延时问题 ...
  • 异常和中断的区别

    2020-06-17 12:53:20
    异常和中断的区别异常异常产生的原因异常产生的目的异常的产生和处理中断中断的原因中断的产生和处理 转载至:https://www.cnblogs.com/pengdonglin137/p/3308972.html 异常 是指CPU内部出现的中断,即在CPU执行特定...
  • 计算机的中断

    2020-05-14 12:41:28
    在执行程序的过程中,由于计算机内部或外部的某种突发原因,有必要尽快终止当前程序,待处理完成后,再回来继续执行被中止了的程序,这种程序在执行过程中由于外界的原因而被中间打断的情况称之为中断。 1.2、中断...
  • stm32外部中断进入不了的原因分析

    千次阅读 2013-07-20 10:22:56
    最近几天折腾stm32,遇见了很郁闷问题,外部中断进入不了,最后找到解决方法时候觉得……唉,下面总结几条原因以便于大家少走弯路。 1.切记打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);...
  • 今天公司内部分电脑连接服务器时出现下面错误,分享出来给大家,... unblock with 'mysqladmin flush-hosts错误原因:同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors最大值)中断的数据库...
  • 究其原因,主要是先爆炮孔产生的飞石将后续起爆网路破坏和使未爆炮孔产生错位所致。爆破后产生瞎炮,不但影响爆破质量而且还留下极大的安全隐患,给后续处理工作带来很大的难度。具体分析南矿爆破产生瞎炮的原因,并提出...
  • Linux内核产生并发的原因

    千次阅读 2013-10-01 23:48:30
    Linux内核产生并发的原因主要是中断和睡眠再调度。 1. 中断,由于中断执行是异步的,而且是在非抢占式内核中打断当前运行内核代码的唯一方法,所以中断是可以和其它内核代码并发执行的。因此如果中断操作和被中断的...
  • 在计算机中,中断是处理器与异步事件... 产生异步事件的原因叫做中断源。凡是中断源在发生异步事件时,都会向处理器发出一个通知信号,由于这个信号具有请处理器中止当前工作的含义,因此该信号叫做中断请求信号。处
  • 电磁兼容设计主要包含浪涌(冲击)抗扰度、振铃波浪涌抗扰度、电快速瞬变脉冲群抗扰度、电压暂降、短时中断和电压变化抗扰度、工频电源谐波抗扰度、静电抗扰度、射频电磁场辐射抗扰度、工频磁场抗扰度、脉冲磁场抗扰...
  • (转)Broken pipe产生的原因

    千次阅读 2017-06-27 10:12:35
    Broken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址...
  • Linux下的中断

    2012-11-29 21:17:16
    1.中断产生  需要中断的原因,是因为外设需要通知操作系统它那里发生了一些事情。设备通过中断线向中断控制器发送高电平,告诉操作系统它产生了一个中断,而操作系统会从中断控制器的状态位知道是哪条中断线上产生...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762
精华内容 304
关键字:

中断产生的原因