中断处理

Linux内核设计与实现

老子叫甜甜 提交于 2019-12-12 08:52:50
第6章 中断和中断处理程序 6.1 中断 1)物理学角度,中断是一种电信号,由硬件生产,并直接送入中断控制器的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器检测到此信号,便中断当前工作转而处理中断。此后,处理器通知操作系统已经产生中断,操作系统对这个中断进行适当的处理。 2)中断使得硬件得以与处理器通信 3)不同设备对应的中断不同,每个中断都有一个唯一的数字标识 4)异常:它在产生时必须考虑与处理器时钟同步,称为同步中断 6.2 中断处理程序 1)响应中断时,内核会执行一个函数,该函数叫做中断处理函数 2)它是驱动程序的一部分 3)和其他内核函数的区别:中断处理程序是被内核调用来响应中断的,运行与中断上下文。 4)上半部和下半部:中断处理程序就是上半部,做有严格实现的工作 6.3 注册中断处理程序 1)int request_irq(unsigned int irq, //要分配的中断号 irqreturn_t (*handler)(int, void *, struct pt_regs *), //指向处理这个中断的实际中断处理程序 unsigned long irflags, //SA_INTERRUPT,SA_SAMPLE_RANDOM,SA_SHIRQ const char *devname, //与中断相关的设备的ASCII文本表示法 void *dev

NVIC 原子的

一个人想着一个人 提交于 2019-12-11 16:25:05
#include “sys.h” //第0组:所有4bit用于指定响应优先级; //第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; //第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; //第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级; //第4组:所有4位用于指定抢占式优先级。 //所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以 //在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 //当 两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后 //,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处 //理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一 //个;如果他们的抢占式优先级和响应优先级都相等,则根据他们 在中断表中的排位顺序决定 //先处理哪一个。每一个中断源都必须定义2个优先级。 void NVIC_Configuration(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 } 00优先级最高 四位一共16种优先级 来源: CSDN 作者: 夜灼华 链接: https:/

嵌入式第六课-中断控制器

こ雲淡風輕ζ 提交于 2019-12-11 08:32:21
ARM存在多种 工作模式 ,这些工作模式大体来说有三点差异: 1.使用的寄存器有差异 2.不同的权限,通过MMU实现 3.不同的触发条件,上电时进入SVC,发生中断时进入IRQ等 中断 中断是一种异常。当异常发生后:1.CPU进入异常模式,切换寄存器;2.CPU跳至异常入口 中断的使用: 1.中断发生:保存中断前的状态,使能中断,初始化 2.中断处理:分辨中断源以进行不同的处理;清理工作 3.恢复状态 代码 头文件: @ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @ File:head . S @ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数 @ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * . extern main . text .

程序员需要了解的硬核知识之控制硬件

孤街醉人 提交于 2019-12-10 21:45:40
应用和硬件的关系 我们作为程序员一般很少直接操控硬件,我们一般通过 C、Java 等高级语言编写的程序起到间接控制硬件的作用。所以大家很少直接接触到硬件的指令,硬件的控制是由 Windows 操作系统 全权负责的。 你一定猜到我要说什么了,没错,我会说但是,任何事情没有绝对性,环境的不同会造成结果的偏差。虽然程序员没法直接控制硬件,并且 Windows 屏蔽了控制硬件的细节,但是 Windows 却为你开放了 系统调用 功能来实现对硬件的控制。在 Windows 中,系统调用称为 API ,API 就是应用调用的函数,这些函数的实体被存放在 DLL 文件中。 下面我们来看一个通过系统调用来间接控制硬件的实例 假如要在窗口中显示字符串,就可以使用 Windows API 中的 TextOut 函数。TextOut 函数的语法(C 语言)如下 BOOL TextOut{ HDC hdc, // 设备描述表的句柄 int nXStart, // 显示字符串的 x 坐标 int nYStart, // 显示字符串的 y 坐标 LPCTSTR lpString, // 指向字符串的指针 int cbString // 字符串的文字数 } 那么,在处理 TextOut 函数的内容时,Windows 做了些什么呢?从结果来看,Windows 直接控制了作为硬件的显示器。但 Windows

基于STC12C5A60S2的内嵌A/D和内嵌PWM的PID参数整定

非 Y 不嫁゛ 提交于 2019-12-10 15:55:42
控制对象传递函数:Gp=20/(s(0.1s+1)(0.2s+1) 第一个实验主要是出现等幅震荡的波形(纯比例控制): #include <STC12C5A60S2.H> #include <absacc.h> typedef unsigned char u8; //无符号字符型变量新表示方法定义 typedef unsigned int u16; //无符号整型变量新表示方法定义 //#define AD0 XBYTE [0xF0FF] //给定量外部AD通道0的端口地址 //#define AD1 XBYTE [0xF1FF] //反馈量外部AD通道1的端口地址 //#define DA XBYTE [0xEFFF] //外部DA转换数据输入端口地址 #define D_port XBYTE [0x7FFF] //数码管段码锁存器端口地址 #define B_port XBYTE [0xBFFF] //数码管位码锁存器端口地址 #define A0_r -9.27 //实验五的4通道数据 #define Am_r 10.24 //实验五的4通道数据 #define N0_r 0x20 //实验五的4通道数据 #define Nm_r 0xe0 //实验五的4通道数据 #define A0_m -9.32 //实验五的5通道数据 #define Am_m 9.91 /

[Google Guava] 3-缓存

久未见 提交于 2019-12-10 15:45:22
原文地址 译文地址 译者:许巧辉 校对:沈义扬 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 02 .maximumSize(1000) 03 .expireAfterWrite(10, TimeUnit.MINUTES) 04 .removalListener(MY_LISTENER) 05 .build( 06 new CacheLoader<Key, Graph>() { 07 public Graph load(Key key) throws AnyException { 08 return createExpensiveGraph(key); 09 } 10 }); 适用性 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。 Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。 通常来说, Guava Cache 适用于:

WinDbg常用命令系列---sx, sxd, sxe, sxi, sxn, sxr, sx- (设置异常)

試著忘記壹切 提交于 2019-12-10 14:07:15
简介 sx*命令控制调试器在正在调试的应用程序中发生异常或发生某些事件时采取的操作。 使用形式 sx sx { e | d | i | n } [ -c " Cmd1 " ] [ -c2 " Cmd2 " ] [ -h ] {Exception|Event| * } sx- [ -c " Cmd1 " ] [ -c2 " Cmd2 " ] {Exception|Event| * } sxr 参数 -c " Cmd1 " 指定在发生异常或事件时执行的命令。 当处理此异常的第一次机会发生时,无论此异常是否中断调试器,都将执行此命令。 必须将 Cmd1 字符串用引号引起来。 此字符串可以包含用分号分隔的多个命令。 -C 和带引号的命令字符串之间的空格是可选的。 -c2 " Cmd2 " 指定在发生异常或事件并且在第一次机会未处理时执行的命令。 当第二次处理此异常时,会执行此命令,无论此异常是否中断调试器。 必须将 Cmd2 字符串用引号引起来。 此字符串可以包含用分号分隔的多个命令。 -C2 和带引号的命令字符串之间的空格是可选的。 -h 更改指定事件的处理状态,而不是其中断状态。 如果 事件 为 cc 、 hc 、 bpec 或 ssec ,则无需使用 -h 选项。 Exception 以当前基数指定命令作用于的异常号。 Event 指定命令所作用的事件。这些事件用简短的缩写来表示。

FutureTask的get()方法之异常处理

China☆狼群 提交于 2019-12-10 10:23:33
项目中遇到线程池异步处理Callable请求,阻塞接收future.get()结果时,对线程中断状态位state的处理问题。try {   Future<Object> future = executor.submit(callcable);   future.get(); } catch (InterruptedException e) {   Thread.interrupted(); // 重置当前线程的中断位state为true,便于该线程以后被其他任务正常调用 } 对项目中的这种处理感到疑惑,翻了下源码中具体的实现细节,发现Future的实现类FutureTask的get()方法如下: public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); // throws InterruptedException return report(s); // throws ExecutionException }其中InterruptedException是awaitDone(false, 0L)方法抛出的: if (Thread.interrupted()) { removeWaiter(q

epoll的本质是什么

混江龙づ霸主 提交于 2019-12-10 09:25:56
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道:

进程通信和同步(转)

ぃ、小莉子 提交于 2019-12-09 21:24:53
概念 竞争条件 多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时许,称为竞争条件。 忙等待的互斥 几种实现互斥的方案: 屏蔽中断 1在单处理器系统中,最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,包括时钟中断。CPU 只有在发生中断的时候才会进行进程切换,这样在中断被屏蔽后 CPU 将不会被切换到其他进程。 锁变量 严格轮换法 while (TRUE) { while (turn != 0) critical_region(); turn = 1; noncritical_region(); } while (TRUE) { while (turn != 1) critical_region(); turn = 0; noncritical_region(); } 忙等待检查变量。使用忙等待的锁称为自旋锁。 Peterson 解法 #define FALSE 0 #define TRUE 1 #define N 2 /* number of processes */ int turn; /* whose turn is it? */ int interested[N]; /* all values initially 0 (FALSE) */ void enter_region(int process); /* process is 0 or 1 */ {