中断处理

stm32学习笔记05中断和事件

心不动则不痛 提交于 2020-02-16 21:23:31
1、中断和事件的区别: https://www.cnblogs.com/smartjourneys/articles/7363114.html 向量中断和非向量中断还是有点不懂 https://www.cnblogs.com/yanglin1228/archive/2011/02/14/4812067.html 2、中断和异常:   中断与异常有什么区别:   1、中断:系统停止当前正在运行的程序而转向其他服务,可能是因为优先级高的请求   服务了,或者是因为人为安排中断。中断是属于正常现象。   异常:是由于软件错误而引起的   2、中断是 CPU所具备的功能 -- 硬件   异常是软件运行过程中的一种开发过程中没有考虑到的程序错误 -- 软件   3、   1)中断的概念   所谓中断是指 CPU对系统发生的某个事件作出的一种反应: CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。    引起中断的事件称为中断源,中断源向 CPU提出进行处理的请求称为中断请求。   2)中断类型   按中断事件来源进行分类,主要有两类:   ( 1)中断。由 CPU以外的事件引起的中断,如 I/O中断、时钟中断、控制台中断等。   ( 2)异常( exception)。来自 CPU的内部事件或程序执行中的事件引起的过程。如由于

【自制操作系统08】中断

丶灬走出姿态 提交于 2020-02-16 18:29:21
由于中断这块的知识和代码都占较大篇幅,因此分成两章来讲,本章不包含任何中断的代码,只讲理论部分,以及中断的大概流程。代码实现部分由下一章来讲解 【自制操作系统09】中断的代码实现 一、到目前为止的程序流程图 为了让大家清楚目前的程序进度,画了到目前为止的程序流程图,如下。 二、什么是中断 这里我们先从形象的角度来描述,中断就是让操作系统停止手中正在进行的工作,先把中断信号对应的处理程序执行完毕,再回到之前的程序中继续进行,这样一个机制。 一个很形象的说法是,我们的操作系统就是 中断驱动 的,可以把操作系统简单理解为一个 死循环 ,无时无刻不在等待中断的来临, 被动 地执行相应的任务。 while(true){ 操作系统代码 } 三、中断的分类 外部中断 外部中断通过两个引脚连接到 CPU 上,一个是可屏蔽中断 INTR,一个是不可屏蔽中断 NMI INTR :硬盘、打印机、网卡等设备发出的中断信号,可通过 eflags 寄存器的 IF 位将所有这些外部设备的中断屏蔽 NMI :电源掉电、内存读写错误、总线奇偶校验错误等灾难性的错误,不可屏蔽,CPU 必须立刻处理 对于可屏蔽中断,Linux 的处理方式是分成 上半部 和 下半部 。上半部执行时关闭中断,立刻执行完毕;下半部执行时打开中断,此时如果有其他中断进来,则让给其他中断(也是上半部执行完毕)。 内部中断 内部中断可分为 软中断

什么是真正的实时操作系统(转)

余生颓废 提交于 2020-02-16 17:41:20
转载链接: https://blog.csdn.net/zhourui1982/article/details/5282361 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platform team封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统? 1. 首先说一下实时的定义及要求: 参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 http://www.faqs.org/faqs/realtime-computing/faq/ 一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是

Java内部类与final关键字详解

一个人想着一个人 提交于 2020-02-16 16:19:49
一、基础篇 进程是系统进行资源分配和调动的基本单位,一个进程中至少有一个线程,进程中多个线程共享进程的资源。 线程是进程中的一个实体,线程是不会独立存在的,没有进程就没有线程。 对于CPU资源比较特殊,线程才是CPU分配的基本单位。 main函数启动->JVM进程->main函数线程称为主线程 内存与线程 内存与线程的关心,主要指JVM内存模型与线程之间的关系,它也是线程安全问题的主要诱因。 使用JDK工具观察线程 jcmd jstack jvisualVM jconsole 线程创建的三种方法 Account类 package com.aidata.concurrency; public class Account { private String accountNo; private String accountName; private boolean valid; public Account(){} public Account(String accountNo, String accountName, boolean valid){ this.accountNo = accountNo; this.accountName = accountName; this.valid = valid; } public String getAccountNo() { return

stm32学习之路定时器的使用

流过昼夜 提交于 2020-02-16 13:08:13
上次讲了滴答定时器,这个我们来说下stm32 的其他定时器,分别有三种, 基本定时器,通用定时器和 高级定时器,在STM32F1 的定时器中分别由2 个基本定时器(TIM6、 TIM7) 、 4 个通用定时器(TIM2-TIM5) 和 2 个高级定时器(TIM1、 TIM8) 组成(这些资料也有),这接进入主题吧,这次我们讲的是stm32 的通用定时器(从简单的入门). 通用定时器包含一个 16 位自动重载计数器(CNT) ,就是可以计数2^16次,还有其计数的频率可以由分频系数 PSC 来控制,PSC的取值范围为1~65535,定时器的能实现什么功能就不说了,也找的到,这次通过定时器来控制led亮和灭。 开始之前我们要添加stm32f10x_tim.c 库文件,定时器器的所需要的配置函数都在这个库里面。 在stm中很多操作都是要先时钟使能,以通用定时器TIM3为例子,首先是通用定时器是挂载在APB1总线上,所以可以使用 APB1 总线时钟使能函数来使能 TIM3, 调用的库函数如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能 TIM3钟 其次就是初始化时钟(配置时钟)调用的函数是 void TIM_TimeBaseInit(TIM_TypeDef *TIMx,TIM_TimeBaseInitTypeDef *

简单看看ThreadPoolExecutor原理

你。 提交于 2020-02-15 22:20:12
  线程池的作用就不多说了,其实就是解决两类问题:一是当执行大量的异步任务时线程池能够提供较好的性能,在不使用线程池时,每当需要执行异步任务是需要直接new一个线程去执行,而线程的创建和销毁是需要花销的,而线程池中的线程是可复用的,不需要每次执行异步任务时都去创建和销毁线程;二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数、动态新增线程等; 一.Executors工具类   我们创建一个线程池最好直接用这个工具类去创建,常用的线程池有几种,一种是用newFixedThreadPool方法创建固定大小的线程池,一种是newSingleThreadExecutor方法创建单线程的线程池,一种是newCachedThreadPool方法创建线程最多个数为Integer.MAX_VALUE的线程池,还有一些其他的线程池;   看一下Executors工具类中一些重要的方法,先是newFixedThreadPool方法,只看这个,我们可以实际的线程池类型是ThreadPoolExecutor,而且内部是以LinkedBlockingQueue这个并发队列实现的,前面说过,这是一个有界阻塞队列,底层是一个单向链表,入队和出队是用独占锁实现的一个生产者消费者模式,比较容易;   newSingleThreadExecutor方法,其实可以看到就是用上面的这种线程池实现的

InterruptedException详解

天大地大妈咪最大 提交于 2020-02-15 22:04:11
1.线程为什么会抛出InterruptedException? 假如现在有两个线程1和2;线程1在正常执行,此时线程2调用了线程1的interrupt方法;代码如下: @RunWith(SpringJUnit4ClassRunner.class) public class SynchronizedTest { @Test public void testSynchronized(){ Thread thread = new Thread(){ public void run(){ System.out.println(Thread.currentThread().getName()+ "线程开始了~"); System.out.println(Thread.currentThread().getName()+ "线程结束了~"); } }; thread.start(); System.out.println("1" + thread.isInterrupted()); thread.interrupt(); System.out.println("2" + thread.isInterrupted()); System.out.println("测试结束"); } } 运行结果如下: 1false 2true 测试结束 Thread-2线程开始了~ Thread-2线程结束了~

CPU中断的工作原理,从最底层讲起

a 夏天 提交于 2020-02-15 13:23:23
  前言   中断的概念属于硬件层。虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要。   我们在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的为我们服务。   处理器基于硬件封装对外的指令集,底层语言封装指令集为我们提供更加简单的抽象,高级语言基于底层语言赋予程序更明确的语义。可以看到在这条关系链条中,下层的变动会牵一发而动全身影响上层。而上层想要提高效率,改变机制也必须得到下层的支持。   像 I/O 处理的不断演进,从占用CPU等待到通过中断阻塞等待到多路复用与异步,如果没有下层的支持上层是不可能实现的。而不了解下层的原理我们也很难真正理解一个机制的高效的原因。因此了解下层的原理对应用层工程师来说同样重要。   什么是中断   现代计算机具有多任务处理的能力,往往一台我们办公使用的普通计算机上都会同时运行着几十上百的任务(进程)。我们很难想象,我们点击一下鼠标,需要等待计算机的进程调度模块调度到鼠标处理任务后再给我们做出响应,这对我们来说是不可接受的。   现实是我们在点击鼠标或键盘时(正如我现在在做的事情),计算机会立即给我反馈处理结果,计算机与我们之间是在进行实时交互的。而实时性的实现便是依赖了中断,中断是为了顺应人们对实时性交互的需求而产生的技术。中断之所以有用,是因为它会立刻停下当前的程序(软件

线程池

人走茶凉 提交于 2020-02-14 23:25:04
1. 线程池 线程池是一种复用线程的技术,由于线程的销毁和创建会大大浪费时间以及浪费内存,而线程池可以让线程执行完任务后不立即销毁,让线程重复使用,继续执行其他任务。 2. 线程池详解 ThreadPoolExecutor 线程池中最核心的类是ThreadPoolExecutor,它实现了execute(Runnable command) ,这个方法是用来向线程池传入任务。此类的构造函数如下: public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long keepAliveTime , TimeUnit unit , BlockingQueue < Runnable > workQueue ) ; public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long keepAliveTime , TimeUnit unit , BlockingQueue < Runnable > workQueue , ThreadFactory threadFactory ) ; public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long

Java多线程(三)

为君一笑 提交于 2020-02-13 22:35:08
个人博客 http://www.milovetingting.cn Java多线程(三) 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! 线程基本方法 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。 线程睡眠(sleep) sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态 线程让步(yield) yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对线程优先级并不敏感。 线程中断(interrupt) 中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位