中断服务程序

linux Kernel中断处理流程

瘦欲@ 提交于 2020-04-07 13:16:46
本文转帖于: http://blog.csdn.net/swt914/article/details/6574458 Kernel 中断处理图 1. Linux 定义了名字为irq_desc 的中断例程描述符表:(include/linux/irq.h) struct irqdesc irq_desc[NR_IRQS]; NR_IRQS 表示中断源的数目。 2. irq_desc []是一个指向irq_desc_t 结构的数组, irq_desc_t 结构是各个设备中断服务例程的描述符。Irq_desc_t 结构体中的成员action 指向该中断号对应的irqaction 结构体链表。Irqaction 结构体定义如下: /* include/linux/interrupt.h */ struct irqaction { irq_handler_t handler; /* 指向中断服务程序 */ unsigned long flags; /* 中断标志 */ unsigned long mask; /* 中断掩码 */ const char * name; /* I/O设备名 void *dev_id; /* 设备标识 */ struct irqaction * next; /* 指向下一个描述符 */ int irq; /* IRQ线 */ struct proc_dir

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

跟風遠走 提交于 2020-04-07 07:27:02
在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构 struct timeval { time_t tv_sec; /***second***/ susecond_t tv_usec;/***microsecond***/ } 到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000 000皮秒(12个零)。 秒用s表现,毫秒用ms,微秒用us表示,纳秒用ns表示,皮秒用ps表示,他们的分级单位是千,即每次3个零。 混淆的原因找到了,由于毫秒用ms表示,所以我老是以为microsecond是毫秒,所以就把tv_usec理解错了。 microsecond查词霸也是微秒的意思(microsecond!=ms,microsecond==us),看来单位的表示迷惑了我,也迷惑了大多数人,请朋友们牢记这里,非常重要。 xtime是从cmos电路中取得的时间,一般是从某一历史时刻开始到现在的时间,也就是为了取得我们操作系统上显示的日期。这个就是所谓的“实时时钟”,它的精确度是微秒。 jiffies是记录着从电脑开机到现在总共的时钟中断次数

中断触发流程

自古美人都是妖i 提交于 2020-04-06 19:31:16
在响应一个特定的中断的时候,内核会执行一个函数,该函数叫做中断处理程序(interrupt handler)或中断服务例程(interrupt service routine ,ISP).产生中断的每个设备都有一个相应的中断处理程序,中断处理程序通常不和特定的设备关联,而是和特定的中断关联的,也就是说,如果一个设备可以 产生多种不同的中断,那么该就可以对应多个中断处理程序,相应的,该设备的驱动程序也就要准备多个这样的函数。在Linux内核中处理中断是分为上半部 (top half),和下半部(bottom half)之分的。上半部只做有严格时限的工作,例如对接收到的中断进行应答或复位硬件,这些工作是在所有的中断被禁止的情况下完成的,能够被允许稍后完 成的工作会推迟到下半部去。 其实中断的整个过程分为2个部分: 1 注册 2 执行或者叫触发 如上图:首先中断触发,cpu响应,去执行IRQ中断总的服务子程序(就是所有的IRQ中断都经过这一步),去读两个寄存器,确定中断号,再根据中断号,在子程序链表中找到对应的中断服务子程序,结束了。为了达到这样的目的,把中断号与中断子程序联系起来。request_irq()做的就只是这个工作。而GPIO与中断号的联系是定死的,或者这两个中断号还不一样。后面讲吧。 先说说request_irq(),就是把中断例程添加到中断子程序链表中去。 request

单片机常用名词解释与常用逻辑电路

↘锁芯ラ 提交于 2020-04-06 16:52:45
MCS-51系列单片机 MCS-51系列单片机分为两大系列,即51子系列与52子系列。 51子系列:基本型,根据片内ROM的配置,对应的芯片为8031、8051、8751、8951 52子系列:增强型,根据片内ROM的配置,对应的芯片为8032、8052、8752、8952 这两大系列单片机的主要硬件特性如下表: 从上表中可以看到,8031、8031、8032、80C32片内是没有ROM的,对应着上表看,我们可以发现,51系列的单片机的RAM大小为128B,52系列的RAM大小为256B,51系列的计数器为两个16位的,52系列的计数器为三个16位计数器。51系列的中断源为5个,52系列的中断源为6个。 8051与80C51的区别: 80C51单片机是在8051的基础上发展起来的,也就是说在单片机的发展过程中是先有8051,然后才有80C51的。 8051单片机与80C51单片机从外形看是完全一样的,其指令系统、引脚信号、总线等完全一致(完全兼容),也就是说在8051下开发的软件完全可以在80C51上应用,反过来,在89C51下开发的软件也可以在8051上应用。这两种单片机是完全可移植的。 既然这两种单片机外形及内部结构都一样,那它们之间的主要差别在哪里呢? 8051与80C51单片机的主要差别就在于芯片的制造工艺上。80C51的制造工艺是在8051基础上进行了改进。

STM32串口之空闲中断

泪湿孤枕 提交于 2020-04-06 13:44:38
NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。 STM32 串口 IDLE 中断 IDLE其实是空闲的意思。IDLE中断叫空闲中断,不叫帧中断。那么什么叫空闲,怎么定义空闲呢?在实际发送数据的时候,比如一串字符串,我们会采用如下方式发送 void uart1_putc(char dat) { SBUF = dat; while (!TI); TI = 0; } void uart1_puts_n(char *str){ while (*str) uart1_putc(*str++); } void uart1_puts_n("i am handsome"); 其实发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据,空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。 而总线在什么情况时,会有一个字节时间内没有接收到数据呢?一般就只有一个数据帧发送完成的情况,所以串口的空闲中断也叫帧中断。 要怎么开启帧中断呢? 其实其他串口配置不用改变,只需要在开启串口接收中断的时候加上一句话就Ok。 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接收中断

操作系统中断

梦想与她 提交于 2020-03-29 04:02:36
中断的类型    从中断事件的性质出发,中断可以分为两大类: 强迫性中断事件:包括硬件故障中断,程序性中断,外部中断和输入输出中断等。 自愿性中断事件:是由正在运行的进程执行一条访管指令用以请求系统调用而引起的中断,这种中断也称为"访管中断"。   一般情况下,优先级的高低顺序依次为:硬件故障中断、自愿中断、程序性中断,外部中断和输入输出中断。自愿中断的断点是确定的,而强迫性中断的断点可能发生在任何位置。 中断的响应    中断响应 (硬件即中断装置操作) ,处理器每执行一条指令后,硬件的中断位置立即检查有无中断事件发生,若有中断事件发生,则暂停现行进程的执行,而让操作系统的中断处理程序占用处理器,这一过程称为"中断响应"。中断响应过程中,中断装置要做以下三项工作: 是否有中断事件发生 若有中断发生,保护断点信息 启动操作系统的中断处理程序工作   中断装置通过"交换PSW"过程完成此项任务。 中断处理 (软件即操作系统操作)   操作系统的中断处理程序对中断事件进行处理时,大致要做三方面的工作: 保护被中断进程的现场信息 分析中断原因,根据旧PSW的中断码可知发生该中断的具体原因。 处理发生的中断事件,请求系统创建相应的处理进程进入就绪队列。 中断屏蔽    中断屏蔽技术是在一个中断处理没有结束之前不响应其他中断事件,或者只响应比当前级别高的中断事件。

FreeRtos——移植

流过昼夜 提交于 2020-03-20 15:59:53
现在准备的简单程序LED灯的工程目录中增加freertos文件夹: 在 source目录下的portable目录下只留下下面的文件夹: 为什么呢? 把对应文件移植在工程中之后,添加头文件路径如下图: 编译之后,报错如下: 提示少了配置文件,那么我们可以在官方demo文件目录下复制一个到我们工程中来。 这个时候需要观察一下这个config.h文件, 这里更改一点代码: 那个条件编译最后就是为了定义CLOCK_HZ的,cpu的频率根据硬件平台的不同,要做适当处理,所以我们直接把这个宏定义出来,180M系统时钟。 这个时候再编译,还是报错: 再编译: 没有报错了,但是我们有必要贴出这个config.h文件来说明我们采取不更改启动文件用宏实现port.c的中断服务函数和启动文件相连接: /* FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. All rights reserved VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute

串口中断方式的发送过程是怎么回事?

谁都会走 提交于 2020-03-19 23:03:21
串口中断方式的发送过程是怎么回事? 有人问过 这个问题 : “用串口中断接收比较好理解,只要接收缓存接收到数据,标志位就会置位,然后进入中断服务程序读取接收缓存中的数据,但是在发送时,应该是在数据发送出去之后发送标志位才会置位(我是msp430单片机),那么此时等数据发送出去之后进入中断又有什么意义呢?到底如何通过串口中断来发送数据呢?” 通过阅读 STM32 官方库的代码,我找到了答案。 中断发送方式的基本过程是: 每发送一个字节,该字节发送完毕引发中断,中断处理程序再发送下一个字节……直到发送完成。 这里有两个细节问题需要注意: 第一个字节是怎样发送的?因为发第一个字节之前,并没有发送字节完成所触发的中断,那第一个字节怎么被发送出去?这关系到中断在硬件层面的触发方式:如果是电平触发的中断,在中断式发送函数中会使能相应的中断,因为发送缓冲区为空,其所处的电平状态就在中断功能被使能后会直接触发中断,导致第一个字节在中断处理函数中被发送出去;如果是电平跳变触发的中断,为了引发中断,只好把第一个字节在中断式发送函数中“手动”发送出去,由此引发一个中断的“多米诺”效应,把后面的字节依次发送出去。参考: https://www.lpcware.com/content/forum/uart-tx-interrupt-should-i-put-least-one-byte-tx-fifo

中断实现的基本原理

不羁的心 提交于 2020-03-18 17:16:27
前言: 中断是计算机发展中一个重要的技术,它的出现很大程度上解放了CPU,提高了CPU的执行效率。 在中断出现之前,CPU对IO采用的是轮询的方式进行服务,这使的CPU纠结在某一个IO上,一直在等待它的响应,如果它不响应,CPU就在原地一直的等下去。这样就导致了其他IO口也在等待CPU的服务,如果某个IO出现了important or emergency affairs,CPU也抽不出身去响应这个IO。 为了解决这个纠结的问题就------>出现了中断 中断控制的主要优点是只有在IO接口需要服务时才去响应它,使得CPU很淡定的做它自己的事情,只有IO口有需求的时候才去响应它。同时中断中也设计了中断优先级,来处理一些很紧急的事件。 一.中断的基本知识 1.中断的概念: 所谓中断,是指CPU在正常运行程序时,由于程序的预先安排或内外部事件,引起CPU中断正在运行的程序,而转到发生中断事件程序中。这些引起程序中断的事件称为中断源。 其实从 物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如 8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后, 处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。不同的设备对应的中断不同

关于单片机中断控制

左心房为你撑大大i 提交于 2020-03-17 22:07:54
1 .对于 STM32 讲,外部中断通道位置 28 ( 35 号优先级)是给外部设备 TIME2 的,但 TIME2 本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢 / 下溢)、输入捕获、输出 匹配、 DMA 申请等。所有 TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提 出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢? (题外话: STM32 中的一个通用定时计数器,就比 8 位控制器(如 AVR , MCS-51 就更不必说了)中 TIME 要复杂多了。学过 AVR 的,可能对输入捕获、输出匹配等还有概念,但如果你学的标准架构的 MCS-51 ,那 么上手 32 位可能困难就更多了。所以我一直推荐学习 8 位机应该认真的从 AVR 开始。尽管 51 有很大的市 场,价格也相对便宜,但从长远的眼光看问题,从后续掌握 32 位的使用,考虑到学生的可持续发展, AVR 应该是比较好的选择。) 2 . cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总 的控制该中断通道。它们包括有: z 中断优先级控制字: PRI_n (上面提到的) z 中断允许设置位:在 ISER 寄存器中 z 中断允许清除位:在 ICER 寄存器中 z 中断悬挂 Pending (排队等待