中断优先级

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

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

不羁岁月 提交于 2020-03-30 01:55:46
1、CC2530的IO口概述   CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC、定时器或USART外设。这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现。    I/O 端口具备如下重要特性:      􀁺 21 个数字I/O 引脚     􀁺 可以配置为通用I/O 或外部设备I/O     􀁺 输入口具备上拉或下拉能力     􀁺 具有外部中断能力。   21 个I/O 引脚都可以用作于外部中断源输入口。因此如果需要外部设备可以产生中断。 外部中断功能也可以从睡眠模式唤醒设备 。 2、未使用的I/O 引脚处理   未使用的I/O 引脚电平是确定的,不能悬空。一个方法是使引脚不连接,配置引脚为具有上拉电阻的通用I/O输入。这也是所有引脚复位后的状态(除了P1.0 和P1.1 没有上拉/下拉功能)。或者引脚可以配置为通用I/O输出。这两种情况下引脚都不能直接连接到VDD 或GND, 以避免过多的功耗 。 3、低I/O 电压   在数字I/O 电压引脚DVDD1 和DVDD2 低于2.6V 的应用中,寄存器位PICTL.PADSC 应设置为1,以获得DC 特性表中所述的输出DC 特性。 4、通用I/O    用作通用I/O 时,引脚可以组成3 个8 位端口,端口0、端口1 和端口2,表示为P0、P1

操作系统中断

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

时钟中断周期对操作系统整体实时性的影响分析

怎甘沉沦 提交于 2020-03-29 03:58:14
时钟中断是操作系统最重要的中断,操作系统内核依靠时钟中断完成时间片计算和分配、定时等管理工作,是分时机制实现的基础。可以说如果没有时钟中断,操作系统将无法正常运行。时钟中断由专门的时钟芯片产生,比如PC机上的8253芯片。大多数的操作系统实现,时钟中断周期会维持在10ms到100ms之间,比如Windows操作系统,其时钟中断周期一般为10ms或者20ms。表面上看,似乎时钟中断周期越短,系统的实时性越好,因为进程或线程的运行时间片会被控制的越精确,优先级高的进程或线程会优先得到运行。但仔细分析起来,会发现实际并不是这么回事,时钟中断周期的大小与系统整体实时性关系并不十分紧密。 可用两个指标来衡量操作系统的实时性:一个是中断响应时间,即从外部中断发生,到得到操作系统处理之间的时间;另外一个是任务切入时间,即一个高优先级的线程运行所需的资源就绪,到得到调度所需的时间。时钟中断周期的大小,与这两个指标并无直接关联。 首先看中断响应时间,这个时间与硬件系统关联紧密。中断一般由外部设备引发,外部设备的控制电路连接到计算机的中断控制器上(比如PC的8259A芯片)。一旦外部设备发生中断,设备会通过一条中断引脚通知中断控制器,中断控制器根据输入引脚的状态(比如是否禁止引发中断)、输入引脚的优先级、连接到片上的其它中断引脚的情况,综合判断是否需要对该中断进行处理。如果判断结果为进一步处理

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-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 (排队等待

STM32F4关键寄存器总结

放肆的年华 提交于 2020-03-12 07:53:52
—— 整理自STM32F4中文参考手册(ST)、STM32F4开发指南-寄存器版本(正点原子)、cortex m3与m4权威指南(英文) 目录 NVIC GPIO EXIT USART TIM(2~5) 基本设置 PWM相关 NVIC 此章节与内核相关,未在参考手册中出现,需参考权威指南。 ISER1~8 (Interrupt Set-Enable Registers)中断使能寄存器组。CM4 内核支持 256 个中断,用 8 个 32 位寄存器来控制,每个位控制一个中断。由于STM32F4 的可屏蔽中断最多只有 82 个,所以仅ISER[0~2]有效,其中ISER[0]的 bit0~31 分别对应中断0~31;ISER[1]的 bit0~32 对应中断 32~63;ISER[2]的 bit0~17 对应中断 64~81。设置相应的 ISER 位为 1,使特定中断被使能。 具体每一位对应哪个中断,请参考 stm32f4xx.h 里面的第 188 行处。 ICER1~8 (Interrupt Clear-Enable Registers)中断除能寄存器组。用来清除某个中断的使能。其对应位所代表的中断和 ISER 相同。通过置位来清除中断位。 ISPR1~8 (Interrupt Set-Pending Registers)中断挂起控制寄存器组。其对应位所代表的中断和 ISER 相同

7、Esp8266 硬件中断定时器器

☆樱花仙子☆ 提交于 2020-03-08 19:36:13
如果使用 NMI 中断源,且为自动填装的定时器,调用 hw_timer_arm 时参数 val 必须大于 100。 如果使用 NMI 中断源,那么该定时器将为最高优先级,可打断其他 ISR。 如果使用 FRC1 中断源,那么该定时器无法打断其他 ISR。 API 实验代码 定时500ms // LED初始化 void ICACHE_FLASH_ATTR LED_Init_JX ( void ) { PIN_FUNC_SELECT ( PERIPHS_IO_MUX_GPIO4_U , FUNC_GPIO4 ) ; // GPIO4设为IO口 GPIO_OUTPUT_SET ( GPIO_ID_PIN ( 4 ) , 1 ) ; // IO4 = 1 } // 硬件定时器中断回调函数【注意:中断函数前不要有"ICACHE_FLASH_ATTR"宏】 void HW_Timer_INT ( void ) // ②:硬件定时器中断回调函数 { F_LED = ! F_LED ; GPIO_OUTPUT_SET ( GPIO_ID_PIN ( 4 ) , F_LED ) ; // LED状态翻转 os_printf ( "\r\n--- HW_Timer_INT ---\r\n" ) ; // 进入硬件定时器中断回调函数标志 } void ICACHE_FLASH_ATTR user