中断服务程序

LDK3读书笔记(第一章)

自作多情 提交于 2019-12-17 01:21:34
操作系统 :   操作系统是指在整个系统中负责完成 基本功能 和 系统管理 的那些部分。包括内核、设备驱动程序、启动引导程序、用户界面、基本的文件管理工具和系统工具。 内核基本组成 : 负责响应中断的 中断服务程序 负责管理多个进程从而分享处理器时间的 调度程序 负责管理进程地址空间的 内存管理程序 网络 进程间通信 服务程序 内核空间 :处于 系统态 并 被保护 起来的 内存 空间。 应用程序的工作方式:   当一个应用程序执行一条系统调用,我们说 内核正在代其执行 。如果进一步解释,在这种情况下,应用程序被称为通过系统调用 在内核空间运行 ,而内核被称为 运行于进程上下文中 。这种交互关系(应用程序通过系统调用界面陷入内核)是应用程序完成其工作的基本行为方式。 我们可以将每个处理器在任何指定时间点上的活动必然概括为下列三者之一: 运行于用户空间,执行用户进程; 运行于内核空间,处于进程上下文,代表某个特定的进程执行; 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。   以上所列几乎包括所有情况,即使边边角角的情况也不例外。例如,当CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行于内核空间。 中断机制:   当硬件设备想和系统通信的时候,它首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。中断通常对应着一个中断号

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(四)

假装没事ソ 提交于 2019-12-16 15:04:12
继续...... 再回到那个重要得函数: void OS_Sched (void) { #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u; #endif OS_ENTER_CRITICAL(); if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */ if (OSLockNesting == 0u) { /* ... scheduler is not locked */ OS_SchedNew(); OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */ #if OS_TASK_PROFILE_EN > 0u OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */ #endif OSCtxSwCtr++; /* Increment context switch

I/O中断原理

老子叫甜甜 提交于 2019-12-14 18:50:28
目录 I/O中断原理 前言 什么是中断 中断类型 硬件中断 软件中断 I/O中断流程 无中断 有中断 中断处理 相关文献 I/O中断原理 前言 在 Windows内核原理-同步IO与异步IO 和 《高性能网络通讯原理》 两篇文章中,都出现了 中断 这两个字。本篇文章会对中断操作的原理进行说明。 什么是中断 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 我们知道CPU是按指令顺序进行执行的,操作系统每过大约15ms会发生一次线程调度(Windows下),根据线程优先级先调度优先级高的线程。但是实际情况并没有那么简单,若我们接收到一个网络请求,如果要等当前线程执行完或15ms线程调度之后才去处理网络请求,网卡缓冲区很有可能会被占满,此时就发生了丢包。 中断类型 中断分为硬件中断和软件中断。 硬件中断 硬件中断即为硬件发出的中断信号,如I/O中断和硬件失效中断。 I/O中断:由I/O控制器产生,用于发送信号通知操作完成等信号。 硬件失效中断:如掉电或存储器奇偶错之类的故障。 软件中断 软件中断即为非硬件发出的中断信号,如程序中断和时钟中断。 程序中断:一些指令产生的异常(如算数移除、除数为0等)。 时钟中断

28335GPIO及外部中断配置介绍

ぐ巨炮叔叔 提交于 2019-12-13 03:20:06
本文转载连接: https://blog.csdn.net/E_ROAD_BY_U/article/details/53083151 弄了两周终于把28335的启动流程、寄存器及中断向量表的映射方法、内存的划分等有了一个全面的了解,今天看到久违的LED灯的闪烁,顿扫阴霾。特在此总结下28335GPIO及外部中断配置介绍。其实对于一个微控制器,只要能够独立实现这两个功能,也算是入门了。 一、GPIO口介绍 外界二进制信息(数字量)要被CPU处理,要给存储器存放,就需要外界信息源与两者之间的交换接口,这样的交换接口若用来进行通用目的数字量的输入输出,就被称为通用数字量输入/输出接口,简称GPIO。F28335 DSP有多达88个GPIO口,对应着芯片引出的88个引脚,随着芯片的封装与尺寸的确定,引脚数目是有限的,所以这88个引脚多数都是功能复用的,即可以灵活配置为输入引脚,也可以灵活配置为输出引脚,即可以作为通用I/O引脚,也可以作为特殊功能口(如SCI、SPI、ECAN等),非常灵活,用户根据需要,可以通过GPIO MUX(输入输出多路选择器,复用开关)寄存器来进行相关配置。 F28335DSP将这88个GPIO口分成了A、B、C三大组,A组包括GPIO0至GPIO31,B组包括GPIO32至GPIO63,C组包括GPIO64至GPIO87,每个引脚都复用了多个功能,同一时刻

STM32 学习笔记 -- EXIT外部中断 按键的误触发问题

橙三吉。 提交于 2019-12-12 09:01:59
版权声明:本文为CSDN博主「menghuanshen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/menghuanshen/article/details/89424062 ———————————————— EXIT外部中断 按键的误触发问题 最近在调试按键作为外部中断exti进行触发动作,发现每次按键按下和按键抬起都会多次进入中断函数,造成程序不稳定,经过反复调试和查阅资料,最后终于已经把这个问题解决,现在总结一下: 1、EXTI重复配置两次导致误触发中断的问题 如果重复两次配置EXTI的话,由于第一次已经打开中断,当进行第二次配置中断的时候,会把中断引脚首先配置成默认引脚,然后在配置成目的引脚,这样由于默认引脚是低电平,所以在切换的过程中就会进入一次中断!!具体请参见: http://bbs.elecfans.com/jishu_942011_1_1.html 2、STM32F407 外部中断误触发问题 现象:调试STM32F407低功耗的时候,使用的PA0做个唤醒源,发现在没有触发EXTI的时候,MCU居然被唤醒。 原因:PA0配置成EXTI(上拉输入),一直被误触发。 解决方式:将PA1配置成浮空输入(GPIO_PuPd_NOPULL),并且外部上拉一个4.7k电阻

libev 笔记(一):“事件驱动模型” 的 理解

醉酒当歌 提交于 2019-12-10 22:52:35
libev 是 一种 “事件驱动”的编程框架,所谓“事件驱动”,简单地说就是就是 有什么动作(点按钮、中断),程序就执行什么操作(中断服务函数、回调函数),当然事件不仅限于用于的操作,只要是定义好的,各种突发、预设的各种将要发生的事情,都是事件。这里,我对CPU相对熟悉一些,可以把“事件驱动”理解为 自定义软件中断。这里我们举几个案例来分析: 案例1: 状态机FSM 状态机是一种常用的编程框架,本质上讲,状态机也是一种事件驱动,“状态”就相当于“事件”,不同状态执行不同的代码功能,这里的代码功能就相当于 事件对应的 驱动 功能。 案例2:硬件中断 硬件中断是 最典型的 事件驱动,只不过这里的中断是CPU厂家预设的,当发生某一硬件中断时,执行对应的 中断服务函数,这里的 “中断”就是 “事件”,而 中断服务函数 就是 驱动。 案例3:功能 回调函数 我们在使用 一些 SDK 的时候,很多的SDK 都会提供 接口 和回调函数,这种回调 函数 也是事件驱动模型,只不过这些 事件 是SDK 定义好的,回调函数 是允许用户 自定义的 事件驱动 函数。 libev 提供了基本的 IO 事件、定时器事件、信号事件,这三种事件用的比较多,这里的IO就是针对 文件描述符,在Linux下,一切设备都是 文件,所以 IO 事件可以针对 所有的外设备,比如网口、socket,串口,文件等。定时器

基于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 /

网络设备驱动和数据链路层的分析

梦想的初衷 提交于 2019-12-09 21:24:45
分类: linux源码分析 2006-07-24 16:15 1446人阅读 评论 (0) 收藏 举报 当物理网络设备接收到数据时,系统是如何知道并读取数据的呢?当前可通过两种途径解决这个问题。 一种方法是轮询方式 ,系统每隔一定的时间间隔就去检查一次物理设备,若设备“报告”说有数据到达,就调用读取数据的程序。在 Linux 中,轮询方式可通过 定时器 实现,但该方法存在一个明显的缺点:不管设备是否有数据,系统总是要固定地花 CPU 时间去查看设备,且可能延迟对一些紧急数据的处理,因为网络设备有数据时可能不能马上得到 CPU 的响应。在这种方式下,设备完全处于一种被动的状态,而 CPU 又负担过重。无论从资源的利用率上还是从效率上看,这种方法都不是最优的。 另一种方法是中断方式 ,中断方式利用硬件体系结构的中断机制实现设备和系统的应答对话,即当物理设备需要 CPU 处理数据时,设备就发一个中断信号给系统,系统则在收到信号后调用相应的中断服务程序响应对设备中断的处理。中断方式有效地解决了设备与 CPU 的对话交流问题,并将 CPU 从繁重的设备轮询中解脱出来,大大提高了 CPU 的利用率。当前不管是 Linux 平台还是 Windows 平台,它们的网络设备驱动程序 几乎都是使用中断方式 的。故在此我们主要讨论基于中断方式的网络设备驱动程序。 网 络分层引起的一个问题是

物联网操作系统

╄→гoц情女王★ 提交于 2019-12-09 11:53:19
原文:https://blog.csdn.net/lu_embedded/article/details/78363460 前言    今天 PC 和手机时代的操作系统霸主未必能在物联网时代延续霸业 。 操作系统产业的规律是,当垄断已经形成,后来者就很难颠覆,只有等待下一次产业浪潮。 如此关键的产业环节必然是兵家必争之地 。 ARM、谷歌、微软、华为、阿里、海尔 等国内外著名的 IT 企业纷纷推出物联网操作系统,整个产业呈现出群雄逐鹿的壮观景象。 传统的嵌入式系统公司也不甘示弱,纷纷通过开源和并购策略推出面向物联网软件平台,比如 Intel、风河、芯科和 Micrium 。 在一轮新的产业浪潮中,国内创业公司也走在风口浪尖上,他们纷纷推出自己的物联网操作系统,比如 庆科、Ruff 和 RT-thread。   回溯物联网操作系统的发展历程,2014年是个重要的、标志性的起点。正是从这一年开始,ARM、谷歌、微软等国际巨头陆续登场,形形色色物联网操作系统进入我们的视野。    ARM Mbed OS   mbed OS 是 ARM 公司专门为 IoT 设计的一个操作系统平台,它支持所有基于 Cortex M 系列的控制器,mbed OS 是开源的操作系统,详情源代码请看:https://github.com/ARMmbed/mbed-os,更多介绍请看官网:https://mbed

Linux操作系统 Linux内核

我的未来我决定 提交于 2019-12-08 05:14:18
Linux内核 预备知识: 1、POSIX(Portable Operating System Interface of UNIX-可移植操作系统接口):定义了 操作系统 应该为 应用程序 提供的 接口标准 ,是IEEE为要在 各种UNIX操作系统 上运行的软件而定义的 一系列API标准的总称 。不同的操作系统根据POSIX标准将实现相同的功能的系统调用标准化。 2、一方面,设计程序只需要跟API打交道和系统调用无关紧要,另一方面, 内核 只跟 系统调用 打交道, 库函数及应用程序 是怎么系统调用不是内核所关心的。 3、完成同一功能, 不同内核 提供的 系统调用 (一个函数)是不同的,所以API又分为Windows API和Linux API。根据POSIX标准,在一个 POSIX操作系统 上开发的软件,能够在 任何其它的POSIX操作系统 上编译执行。 4、标准库:POSIX标准的C/C++库,一、BSD,这个库是AOSP使用的标准C库;二、Bionic,这个是BSD的衍生库,用于NDK开发;三、UNIX C/C++,GUN C/C++,MicroSoft Visual C/C++ 5、POSIX 进程间通信 :POSIX消息、POSIX信号量、POSIX共享内存;System V IPC 6、Linux内核的主要模块(或组件)分以下几个部分: 存储管理 、 CPU和进程管理 、