精华内容
下载资源
问答
  • 没有设置断点为什么会中断,好奇怪
  • 先来卖个关子, 什么中断呢 在我们的日常生活中,经常遇到这样的情况:我们正在看书,突然客厅的电话响了,这时往往停止看书,转而去接电话,接完电话后又接着看书。这种停止当前工作,转而去做其他工作,做完...
    61b7b630f6effc57fb7c44470e6fa3ca.png

    先来卖个关子, 什么是中断呢

    在我们的日常生活中,经常会遇到这样的情况:我们正在看书,突然客厅的电话响了,这时往往会停止看书,转而去接电话,接完电话后又接着看书。这种停止当前工作,转而去做其他工作,做完后又返回来做先前工作的现象称为中断。所以

    单片机虽然是个机器,它也有类似的中断现象,当单片机正在执行某程序时,如果突然出现意外情况,它就需要停止当前正在执行的程序,转而去处理意外情况,处理完后又接着执行原来的程序。

    我们先看看中断的有关概念

    4c079bd10247b409784843bc85c46237.png

    1.中断源

    要让 CPU 中断当前的程序去做其他事情,需要向它发出请求信号,CPU 接收到中断请求信号后才能产生中断。让CPU产生中断的信号称为中断源(又称中断请求源)。

    MCS-51系列单片机的中断源包括:两个外部中断源、两个定时器/计数器中断源和一个串行通信口中断源,如果它们向 CPU 发出中断请求信号,CPU 就会产生中断,停止执行当前的程序,转而去执行指定的程序(又称中断服务程序或中断子程序),执行完后又返回来执行原来的程序。

    0963fec8ade3855344ff00cfe0767bd1.png

    2.中断的优先级别

    单片机内的CPU在工作时,如果一个中断源向它发出中断请求信号,它就会产生中断;如果同时有两个或两个以上的中断源发出中断请求信号,CPU会怎么办呢?CPU会先接受优先级别高的中断源请求,然后再接受优先级别低的中断源请求。

    MCS-51系列单片机5个中断源的优先级别顺序见表

    133a3b05d737a11b4c1fe0acb6479d2d.png

    明天我们继续分享中断后怎样处理,有兴趣的朋友烦请点点关注,点点转发,点点赞!

    展开全文
  • 如图中断在这 <p style="text-align:center"><img alt="" height="566" src="https://img-ask.csdnimg.cn/upload/1614828889436.png" width="1492" /></p>  </p>
  • 我用stm32外接了一个imu模组,imu每产生一个数据就通过int管脚给32一个外部中断信号(200hz),但测试发现stm32不断地进入中断函数,一秒钟进入上万次的那种,后来才发现原来是电平不匹配导致的,stm32电压3.3V...

    我用stm32外接了一个imu模组,imu每产生一个数据就会通过int管脚给32一个外部中断信号(200hz),但测试发现stm32会不断地进入中断函数,一秒钟进入上万次的那种,后来才发现原来是电平不匹配导致的,stm32电压3.3V,imu模组1.8V,中断输出电压1.8V。

    我设置的stm32接收中断的io是推挽输出,没有上拉,imu中断信号为推挽输出,低电平有效,从而导致中断电平只能到1.8V,刚好处在临界点,使stm32一直触发中断。

    解决办法:我把stm32接收io改为开漏模式,并设置为上拉模式,imu的中断输出io改为开漏模式,并且为低电平触发有效,此时stm32的中断便正常了,上拉决定了高电平电压为3.3V。

    展开全文
  • 为什么需要中断?

    千次阅读 2019-04-11 21:59:09
    为什么需要中断? 如果让内核定期对设备进行轮询,以便处理设备,那做很多无用功,因为外设的处理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能让设备在需要内核时主动通知内核,是一个聪明的方式,这便...

    为什么需要中断?

    如果让内核定期对设备进行轮询,以便处理设备,那会做很多无用功,因为外设的处理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能让设备在需要内核时主动通知内核,会是一个聪明的方式,这便是中断。

    1. 中断处理程序

    在响应一个特定中断时,内核会执行一个函数——中断处理程序。中断处理程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。

    中断处理程序就是普通的C代码。特别之处在于中断处理程序是在中断上下文中运行的,它的行为受到某些限制:
    1)不能向用户空间发送或接受数据
    2)不能使用可能引起阻塞的函数
    3)不能使用可能引起调度的函数

     

    2. 注册与释放中断

    设备驱动程序利用request_irq()注册中断处理程序,并激活给定的中断线。返回0表示成功,或者返回一个错误码。

    卸载设备驱动程序时,需要注销相应的中断处理程序,并释放中断线,这时需要调用free_irq——如果在给定的中断线上没有中断处理程序,则注销响应的处理程序,并禁用其中断线。

     

    3. 上下半部机制

    我们期望让中断处理程序运行得快,并想让它完成的工作量多,这两个目标相互制约,如何解决——上下半部机制。

    我们把中断处理切为两半。中断处理程序是上半部——接受中断,他就立即开始执行,但只有做严格时限的工作。能够被允许稍后完成的工作会推迟到下半部去,此后,在合适的时机,下半部会被开终端执行。上半部简单快速,执行时禁止一些或者全部中断。下半部稍后执行,而且执行期间可以响应所有的中断。这种设计可以使系统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力。上半部只有中断处理程序机制,而下半部的实现有软中断实现,tasklet实现和工作队列实现。

    我们用网卡来解释一下这两半。当网卡接受到数据包时,通知内核,触发中断,所谓的上半部就是,及时读取数据包到内存,防止因为延迟导致丢失,这是很急迫的工作。读到内存后,对这些数据的处理不再紧迫,此时内核可以去执行中断前运行的程序,而对网络数据包的处理则交给下半部处理。

    上下半部划分原则

    1) 如果一个任务对时间非常敏感,将其放在中断处理程序中执行;

    2) 如果一个任务和硬件有关,将其放在中断处理程序中执行;

    3) 如果一个任务要保证不被其他中断打断,将其放在中断处理程序中执行;

    4) 其他所有任务,考虑放置在下半部执行。

     

    3.1 下半部实现机制之软中断

    软中断作为下半部机制的代表,是随着SMP(share memoryprocessor)的出现应运而生的,它也是tasklet实现的基础(tasklet实际上只是在软中断的基础上添加了一定的机制)。软中断一般是“可延迟函数”的总称,有时候也包括了tasklet(请读者在遇到的时候根据上下文推断是否包含tasklet)。它的出现就是因为要满足上面所提出的上半部和下半部的区别,使得对时间不敏感的任务延后执行,软中断执行中断处理程序留给它去完成的剩余任务,而且可以在多个CPU上并行执行,使得总的系统效率可以更高。它的特性包括:

    a)产生后并不是马上可以执行,必须要等待内核的调度才能执行。软中断不能被自己打断,只能被硬件中断打断(上半部)。

    b)可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保护其数据结构。

     

    3.2 下半部实现机制之tasklet

    tasklet是通过软中断实现的,所以它本身也是软中断。

    软中断用轮询的方式处理。假如正好是最后一种中断,则必须循环完所有的中断类型,才能最终执行对应的处理函数。显然当年开发人员为了保证轮询的效率,于是限制中断个数为32个。

    为了提高中断处理数量,顺道改进处理效率,于是产生了tasklet机制。

    Tasklet采用无差别的队列机制,有中断时才执行,免去了循环查表之苦。Tasklet作为一种新机制,显然可以承担更多的优点。正好这时候SMP越来越火了,因此又在tasklet中加入了SMP机制,保证同种中断只能在一个cpu上执行。在软中断时代,显然没有这种考虑。因此同一种软中断可以在两个cpu上同时执行,很可能造成冲突。

    总结下tasklet的优点:

    (1)无类型数量限制;

    (2)效率高,无需循环查表;

    (3)支持SMP机制;

    它的特性如下:

    1)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行。

    2)多个不同类型的tasklet可以并行在多个CPU上。

    3)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。

    4. 下半部实现机制之工作队列(work queue)

    上面我们介绍的可延迟函数运行在中断上下文中(软中断的一个检查点就是do_IRQ退出的时候),于是导致了一些问题:软中断不能睡眠、不能阻塞。由于中断上下文出于内核态,没有进程切换,所以如果软中断一旦睡眠或者阻塞,将无法退出这种状态,导致内核会整个僵死。但可阻塞函数不能用在中断上下文中实现,必须要运行在进程上下文中,例如访问磁盘数据块的函数。因此,可阻塞函数不能用软中断来实现。但是它们往往又具有可延迟的特性。

    上面我们介绍的可延迟函数运行在中断上下文中,于是导致了一些问题,说明它们不可挂起,也就是说软中断不能睡眠、不能阻塞,原因是由于中断上下文出于内核态,没有进程切换,所以如果软中断一旦睡眠或者阻塞,将无法退出这种状态,导致内核会整个僵死。因此,可阻塞函数不能用软中断来实现。但是它们往往又具有可延迟的特性。而且由于是串行执行,因此只要有一个处理时间较长,则会导致其他中断响应的延迟。为了完成这些不可能完成的任务,于是出现了工作队列,它能够在不同的进程间切换,以完成不同的工作。

    如果推后执行的任务需要睡眠,那么就选择工作队列,如果不需要睡眠,那么就选择软中断或tasklet。工作队列能运行在进程上下文,它将工作托付给一个内核线程。工作队列说白了就是一组内核线程,作为中断守护线程来使用。多个中断可以放在一个线程中,也可以每个中断分配一个线程。我们用结构体workqueue_struct表示工作者线程,工作者线程是用内核线程实现的。而工作者线程是如何执行被推后的工作——有这样一个链表,它由结构体work_struct组成,而这个work_struct则描述了一个工作,一旦这个工作被执行完,相应的work_struct对象就从链表上移去,当链表上不再有对象时,工作者线程就会继续休眠。因为工作队列是线程,所以我们可以使用所有可以在线程中使用的方法。

     

    5. Linux软中断和工作队列的作用是什么

    Linux中的软中断和工作队列是中断上下部机制中的下半部实现机制。

    1.软中断一般是“可延迟函数”的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进城切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个CPU上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构。

    2.工作队列中的函数处在进程上下文中,它可以睡眠,也能被阻塞,能够在不同的进程间切换,以完成不同的工作。

    可延迟函数和工作队列都不能访问用户的进程空间,可延时函数在执行时不可能有任何正在运行的进程,工作队列的函数有内核进程执行,他不能访问用户空间地址。

    展开全文
  • 1.sja1000的int引脚你先不连接 sja1000通电后(纯粹通电不运行程序)你测试一下int是否高?...中断寄存器0x01时中断引脚才输出低电平呢。你现在要做的事是想法让中断寄存器0x013.还有你是自接收...

    1.sja1000的int引脚你先不连接   sja1000通电后 (纯粹通电不运行程序) 你测试一下int 是否为高? 如果是高正常。

    2.sja1000的int引脚你先不连接   运行程序    你测试一下int 是否为低? 如果是低正常,说明你的单片机设置有问题。是否允许外部中断0了呢?

    中断寄存器为0x01时中断引脚才会输出低电平呢。你现在要做的事是想法让中断寄存器为0x01

    3.还有你是自接收模式 ?还是什么  ?你先设置自接收模式(退出复位模式时的指令为0X0C),看看单个节点是否工作正常     -----------------建议先看看第三条。一般自接收模式通过了就没问题了,你要先看自接收模式能够正常工作。先面是我的程序,不建议仔细看,看看复位和发送做哪些操作就行。(自接收测试模式)

    void SJA1000_Init(void)

    {

    GPIO_Set(Control_PORT,RST,0);     //   IO口复位

    //Delay_ms(10);                    //       .

    GPIO_Set(Control_PORT,RST,1);     //       .

    //Delay_ms(10);                    //       .

    CAN_write(0x00,0x09);   sja1000进入复位模式  单滤波器设置

    CAN_write(0x1f,0xc8);               ///PeliCAN 模式,时钟频率2分频...

    CAN_write(0x10,0x01);               //验收代码寄存器

    CAN_write(0x11,0x02);               //验收代码寄存器

    CAN_write(0x12,0x03);               //验收代码寄存器

    CAN_write(0x13,0x08);               //验收代码寄存器3

    CAN_write(0x14,0x00);               ///验收屏蔽寄存器0

    CAN_write(0x15,0x00);               ///验收屏蔽寄存器

    CAN_write(0x16,0x00);               ///验收屏蔽寄存器

    CAN_write(0x17,0x00);               ///验收屏蔽寄存器

    CAN_write(0x08,0x1a);               //设置输出管脚

    CAN_write(0x06,0x49);               //总线定时器0波特率预设值

    CAN_write(0x00,0x0C);               //退出复位模式

    }

    展开全文
  • 为什么使用了postfix,majordomo的"approve"命令会中断(转) postfix的本地投递代理在信件头部添加一个Delivered-To信息,为了防止邮件由于转发造成循环。但是在majordomo邮件列表中,...
  • #include "cv.h" #include #include "highgui.h" IplImage *Thres(IplImage* src); int main(int argc, char** argv) { IplImage* i; IplImage* ii; i=cvLoadImage("D:\\ceshi.jpg");...}
  • 为什么中断分为两部分来处理

    千次阅读 2015-01-10 17:19:22
    但是,中断是一个随机事件,它随时到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,...
  • 1、对memory引擎的操作不会记录到binlog里,并传到slave进行回放? 首先创建一个memory引擎表: 然后在表中插入一条记录 ...下图在从库执行的select语句,可见这条insert语句在从库进行回放。 2、
  • 我们偶尔在用户的流媒体现场发现,视频录像出现规律性的中断问题,比如像下图中EasyNVR流媒体平台的录像中断,可以明显看到从20:00开始,录像就已经是有中断的情况了(图中刻度尺上的绿色表示有录像视频文件)。...
  • I am reading Linux Kernel Development recently, and I have a few questions related to disabling preemption.In the "Interrupt Control" section of chapter 7, it says:Moreover, disabling interrupts also ...
  • //-----头文件引用----- #include #include #include sbit led7 = P1^7; sbit led8 = P1^6; //sbit key17 = P3^2; //sbit key18 = P3^3; bit intflag0; bit intflag1; ...}
  • FreeRTOS在关键区即taskENTER_CRITICAL()和taskEXIT_CRITICAL()包裹的区间中,执行进程切换。即在关闭中断的时候,进行进程切换。 我们已经知道,即便关闭中断,PowerPC的sc中断,还是可以得到响应。但是时钟中断...
  • 对于设有块表的系统,发生缺页中断,调入新的页面到主存后,系统是更新页表还是块表?为什么
  • 标题:闫刚 linux应用程序为什么不要关闭中断 RTOS处理临界区 RTOS中,中断和线程的打断,需要做原子操作,那么就是普通的关闭中断处理,因为在RTOS中,我们经常和中断打交道。 linux处理临界区 linux中用户态的...
  • vc里面调用中断为什么会出错??就好像下面的程序: class WINDOW { public: int active; virtual void TEXTOUT(int); }; void WINDOW::TEXTOUT(int x) { _asm{ mov esi,this mov edx,[esi]this....
  • ![图片说明](https://img-ask.csdn.net/upload/201906/06/1559789407_344068.png... ``` ...public class Racer implements Runnable{ ... if(Thread.currentThread().getName().equals("rabbit")&&steps%10==0) { ...```
  • android系统的设置方式大多数都是相同的,但可以对于平板电脑与手机的设置有所区别,请友友参考一下以下路径是否进入设置 无线和网络--WLAN设置--menu--高级,然后对WLAN休眠策略进行修改,看看是否可以解决这个...
  • then,看下实际工程中的代码(无关代码已经删除,保留关键代码),串口配置接收中断,输出不用中断方式 串口发送: en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data) { Uart_ClrStatus(u8Idx,...
  • 不执行strcpy函数:ok [img=... 执行strcpy函数后:error ... 这个new了一个对象,本应该如此delete掉,不然内存泄漏,可是strcpy函数执行了什么我为什么不能delete对象?? 待解决,谢谢
  • 为什么中断过程中不能进行睡眠

    千次阅读 2013-10-08 11:02:31
    运行在中断中的代码不能进行睡眠,或者阻塞!因为代码是运行在中断上下文中,并非进程上下文中,如果将中断进行睡眠的话,调度...但这样增加你系统设计的复杂程度!因为在设计过程中,你需要考虑好多,复杂的情况!所
  • List.h: #include "iostream" #include "string" #include "malloc.h" #include "stdlib.h" using namespace std; #define MaxListSize 20 ...运行的时候总是中断,不知道什么原因,求大神帮查出来!谢谢
  • 当plsql developer长时间执行脚本时发现一个问题:就是遇到ora-03113通信中断的问题,很是烦躁! 有人说是服务器端设置了连接超时时间,看下: SQL> show parameters resource_limit  NAME TYPE VALUE -------...
  • 如果你非要在中断中睡眠,则有可能造成各种各样的问题,也可能什么事也没有。这个问题讨论了很多次,你可以在论坛中搜索“睡眠”关键字。  我这里再多说一些自己的理解:  2.4内核是非抢占式的,除非自己原意,一...
  • 为什么中断上下文中不能休眠?

    千次阅读 2014-04-19 09:03:18
    中断发生后,内核先保存当前被中断的进程上下文(在调用中断处理程序后恢复); 但在中断处理程序里,CPU寄存器的值肯定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule()...
  • 提交线程的方法,看过ThreadPoolExecutor源码的应该知道,里面每个线程都是包装了一个Worker类,新增线程的时候就新建一个worker,为什么要这么做呢? 我第一次看的时候也不理解,想着如果直接把传进来的线程...
  • 1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断...而在中断context中,没有进程的概念,没有一个task_struct(这点对于softirq和tasklet一样),因此真的休眠了,比如调用了导...
  • 我想问的就是 如图:既然主线程在第5行就被中断了,为什么后面的 B,C,D还运行呢? 还有就是,为什么到最后的D那段显示线程又运行了? 麻烦各位了 收起 我觉得这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,914
精华内容 765
关键字:

为什么会中断