中断服务程序

STM32基于Rt-thread3.12系统的串口通讯

泪湿孤枕 提交于 2020-01-06 23:10:32
前言 STM32的串口收发可以说是对这个芯片学习的一个基础,相信接触过STM32的朋友首先学会的就是它的GPIO和USART。对GPIO和串口初始化的操作我在这里不做赘述,这些在STM32的例程里面很容易找到学会。我们在这里重点介绍STM32的串口中断接收,以及在RTT系统中我们如何把串口device注册到系统的对象容器里。 关于RT-Thread3.12系统 作为国产小型嵌入式系统中的翘楚,RTT也是被大多数产品所使用。我参与的这个项目RTT的主要工作就是多线程调度和串口device的控制。对于线程的调度先不详细说明,我们这里只介绍串口通讯一个线程的东西。 RTT对象 在 RT-Thread中,所有的数据结构都称之为对象。 其中线程,信号量,互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时 器在 rtdef.h 中有明显的枚举定义,即为每个对象打上了一个数字标签。我们这里的对象就特指设备,而我们的设备就特指串口。 那么我们使用这个对象有什么用处呢,我私以为有两个最大的用处,一是有利于设备管理,二是基于程序安全考虑。我使用这一功能的时候基本与第一个用处不沾边,因为我们就一个串口设备。主要还是基于安全的考虑才使用RTT对象。 使用系统的对象也就是把硬件驱动注册到系统中,让系统对就硬件进行操控,我们再通过系统操控硬件。 串口注册到系统

linux中断源码分析 - 概述(一)

梦想的初衷 提交于 2020-01-04 14:35:28
本文为原创,转载请注明: http://www.cnblogs.com/tolimit/ 关于中断和异常   一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方。在CPU里,中断和异常都会放入到一个中断描述符表中,都需要特定的处理程序进行处理,并且它们都是异步事件,内核完全不知道何时会有一个异常或者中断发生。当异常或者中断发生时,进程都会陷入内核,在内核中执行相应的处理。异常一般都是由CPU内部或者进程产生,而中断一般都是由外部设备产生。异常处理过程实际上和系统调用没什么区别(实际上系统调用是通过一个0x80异常陷入内核当中),而中断的处理过程和情况就相对来说比较复杂。一个中断处理分为硬中断和软中断两个部分,在中断处理的过程中系统是禁止调度和抢占的,而异常处理过程中是允许的。一个中断处理程序可以抢占其他的中断处理程序,也可以抢占异常处理程序,相反的,异常处理程序却不能够抢占中断处理程序。 可编程中断控制器(PIC、APIC)   为了方便说明,这里我们将PIC和APIC统称为中断控制器。中断控制器是作为中断(IRQ)和CPU核之间的一个桥梁而存在的,每个CPU内部都有一个自己的中断控制器,中断线并不是直接与CPU核相连,而是与CPU内部或外部的中断控制器相连。而为什么叫做可编程中断控制器,是因为其本身有一定的寄存器

IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表

ぐ巨炮叔叔 提交于 2020-01-04 14:29:33
原文: IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的。 一、有关IDT的基本知识 1、中断时一种机制,用来处理硬件需要向CPU输入信息的情况。 比如鼠标,键盘等。 2、中断和异常的产生是随机的,在CPU正常运行过程中随时可能产生。CPU的中断处理机制 3、中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入int n指令可以产生n号中断和异常(n从0-ffh)。 4、同时CPU的中断异常机制还是重要特性的支持原理,比如程序调试,程序运行过程中的异常处理(如零除数异常、内存分页错误等)。 5、早期的操作系统甚至是通过中断来进行内核调用的。int指令是一种c从ring3 进入ring 0的方法。比如windows在xp版本之前使用的int 2e。在x86 CPU提供了sysenter指令后,这种方式才被放弃。 6、每一种中断对应一个中断号。CPU执行中断指令时,会去IDT表中查找对应的中断服务程序(interrupt service routine ,ISR)。ISR(为了表述方便后面用ISR n表示n号中断的处理程序),x86CPU最大可以支持256种中断。 7、中断是CPU的机制

异常、中断、陷阱

。_饼干妹妹 提交于 2020-01-04 14:29:13
int 3 指令是常见的 断点中断,研究这个的时候发现个系统的一些机制有关。就研究了一下中断的分类,还有异常和陷阱。下面是我百度之后的一些总结: 中断的分类:外中断和内中断 根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。 根据中断源产生的条件,可把中断分为外中断和内中断。 外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。 内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。 为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。 除了在优先级的设置方面有区别之外, 中断和陷阱还有如下主要区别: 1、陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的

《实时控制软件设计》第一周作业

拜拜、爱过 提交于 2020-01-04 12:58:53
第一周,老师讲了实时控制系统的历史和实现方法,在做案例分析前我想先通过听课和网上的资料总结一下实时控制系统的特点: “实时系统是能够在确定的时间内执行计算或处理事务并对外部事件作出响应的计算机系统“,正好最近在学微机原理,也正好上到了中断程序那一章,咦我就在想,好像用中断程序也可以 “执行计算或处理事务并对外部事件作出响应” 不过马上又反应过来,好像在执行中断程序的时候不能响应别的中断,如果想要响应的话还要在中断服务里面再加一个中断,突然发现稍微复杂一点的控制,中断就不够用了;而且更重要的是响应的时间慢,对于那种要求很快速响应的外部事件(我记得看过一部关于某可乐公司易拉罐的生产线上面,最后踢除不合格产品的时候,就是在输送线上加一个传感器和机械手,检测到不合格的产品,机械臂立马把它“弹”出去,那输送线的速度真是飞快,要从检测到机械臂做出动作最多只能有很短的反应时间)可能就无能为力了。我就大概明白实时控制系统为什么主要用在工业控制中了。 上图是RT-Linux系统的结构,Linux运行在实时核心下,实时内核直接管理硬件中断,如果中断是实时中断,那么就直接执行实时操作,几乎没有延时,实时操作完了再运行Linux进程 “具体地说就是当有实时任务要完成时,实时操作系统运行实时内核下的任务;当没有实时任务时,实时内核调度 Linux运行。所以Linux是实时内核中优先级最低的一个任务。”

HardFault_Handler问题

删除回忆录丶 提交于 2020-01-02 18:08:28
1、问题描述:mio板M2口连接雷达(即can口有数据时),程序跑到can中断使能代码时,程序跳转到“HardFault_Handler”,见下图: 代码跑到此处 解决历程: 1、修改堆栈 先是网上搜索此问题,大致两个解决方法: A、内存溢出或者访问越界 B、堆栈溢出 此代码在第一版mio上工作正常,排除A的可能性;怀疑不小心修改了配置,改变了堆栈大小。 于是,去修改堆栈的大小。可,无论怎么增加size,都还是一样的错误。 2、查看map文件 修改堆栈大小不起作用时,感觉好疑惑,怎么会这样?后与同事沟通,建议看看map文件,会不会can中断服务程序没有被编译? 在map文件里,找到定时器和串口中断服务函数,的的确确没有can中断服务函数。 3、can中断配置 这个时候,有点不理解,MY_NVIC_Init(1,0,USB_LP_CAN1_RX0_IRQn,2);对应配置了中断抢占优先级、响应优先级、中断编号和中断分组,并没有注册中断函数,那么中断函数是怎么关联的呢? 网上搜索:若要调用相关的中断功能,在NVIC中配置相关的中断优先级和中断号, STM32内部会根据配置的中断号在启动文件中寻找相应的中断函数的相应的入口函数。 另外:ST公司在提供的启动文件startup_stm32fXXX.s中都对相应的中断号对应的中断处理函数的入口都已经规定好了

单片机(5)

寵の児 提交于 2019-12-29 11:29:57
计算机通信   随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。   在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。   计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类:并行通信与串行通信。   并行通信通常是将数据字节的各位用多条数据线同时进行传送 。      并行通信控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。   串行通信是将数据字节分成一位一位的形式在 一条传输线上逐个地传送。      串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 串行通信的基本概念   一、异步通信与同步通信     1、异步通信       异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。              异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系

ucosii-2- 5330杨璟旭

老子叫甜甜 提交于 2019-12-29 10:04:21
题目要求 阅读附件中的代码,回答: ucos是如何分层的? HAL都有哪些代码? 分析任务是如何切换的? 1. ucos是如何分层的? 一共四层:硬件相关层,驱动接口层,应用接口层,应用层。好的分层会让软件开发相对独立化,分工同步进行。 所有的硬件被抽象化,应用层的程序,在硬件完全更换的情况下,只要硬件相关层被更新,完全可以等同原先的所实现的功能。这样就极大成度上方便了移植。 硬件相关层: 在这层中,要尽量所有硬件相关都囊括在其中。不管是GPIO还是定时器,或串行接口。只要提供标准统一的接口,就可以让上层会因此而变的很潇洒。这其中有三个最为重要的接口Open,Close,Ctrl。 Open主要来完成对应硬件初始化,形参中包括了些,初始化的相关参数。Close失能硬件。Ctrl来实现一些控制的修改如:优先级,中断回调函数等等,硬件的不同,内容也大为不同。 驱动接口层: 其实在上一层也算是驱动层,只不过因为硬件相关,而把他分离。这层中会用到一个或多个硬件层的接口,进行组合来实现特定功能的程序。这部分程序可举例进行说明。以Flash为列,它这里主要调用硬件层的SPI函数接口,但是主要的写,读指令都是在这里函数中完成的。在这层中需要提供5个标准统一的接口函数: XXXOpen XXXClose XXXWrite XXXRead XXXIoCtl 没有被用到的函数,可以为空

int指令(软件中断指令)

痞子三分冷 提交于 2019-12-27 05:14:35
INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。 中断服务子程序和标准过程的最大区别是 汇编程序可以有任意个过程,中断服务子程序最多有256个过程、 INT指令共有四中不同的格式: 《1》 int n   n是中断号,这就允许用户程序调用256个中断服务子程序。   该指令2字节长度,第一字节是int机器码,第二字节是8位立即数,表示中断号。   CPU在执行到INT指令时,通过中断描述符表找到中断号对应的中断服务子程序的地址,(本质上就是一个异常处理程序的软件调用) 《2》 int 3   INT 3 是中断指令的一种特殊形式,仅有一个字节长。   调试器将该指令当作软件中断指令来用。调试的时候,当程序中的某一位置加断点的时候,调试器会把断点处指令编码的第一个字节替换为INT 3指令的编码。 当程序执行到INT 3,回向调试器申请系统调用,调试器因此获得CPU控制权。之后,再用原先的编码替换INT 3 编码。 《3》INTO 中断号4   如果溢出标志位为1,则INTO指令会产生一个软件中断,利用这个指令可以快速测试算术运算指令之后是否有溢出产生。 《4》BOUND 中断号5   BOUND reg,mem   其执行算法为:if(reg<[mem])or(reg>

软中断和硬中断的区别 ?

夙愿已清 提交于 2019-12-25 03:36:23
目录 硬中断 1.由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包 的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。 硬中断是外部设备对CPU的中断; 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。 软中断 1.通常是硬中断服务程序对内核的中断; 2.为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作