嵌入式操作系统课件

上传人:29 文档编号:172844516 上传时间:2022-12-07 格式:PPT 页数:79 大小:2.74MB
返回 下载 相关 举报
嵌入式操作系统课件_第1页
第1页 / 共79页
嵌入式操作系统课件_第2页
第2页 / 共79页
嵌入式操作系统课件_第3页
第3页 / 共79页
点击查看更多>>
资源描述
嵌入式操作系统嵌入式操作系统中断和异常中断和异常10/20/09嵌入式嵌入式OS3/79为什么会有中断为什么会有中断内核的一个主要功能就是处理硬件外设I/O处理器速度一般比外设快很多内核必须处理其他任务,只有当外设真正完成了准备好了时CPU才转过来处理外设IOIO方式:轮询、中断、DMA等轮询方式效率不高中断机制就是满足上述条件的一种解决办法10/20/09嵌入式嵌入式OS4/79主要内容主要内容中断基础(中断基础(ARM版)版)Linux内核中软件级中断处理及其数据结构Linux的软中断、tasklet以及下半部分10/20/09嵌入式嵌入式OS5/79中断和异常中断和异常中断(广义)中断(广义)会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应中断异步的:由硬件随机产生,在程序执行的任何时候可能出现异常同步的:在(特殊的或出错的)指令执行时由CPU控制单元产生我们用“中断信号”来通称这两种类型的中断10/20/09嵌入式嵌入式OS6/79中断信号的作用中断信号的作用中断信号提供了一种特殊的方式,使得CPU转去运行正常程序之外的代码 比如一个外设采集到一些数据,发出一个中断信号,CPU必须立刻响应这个信号,否则数据可能丢失当一个中断信号到达时,CPU必须停止它当前正在做的事,并且切换到一个新的活动为了做到这这一点,在进程的内核态堆栈保存程序计数器的当前值(即eip和cs寄存器)以便处理完中断的时候能正确返回到中断点,并把与中断信号相关的一个地址放入进程序计数器,从而进入中断的处理10/20/09嵌入式嵌入式OS7/79中断信号的处理原则中断信号的处理原则 快!当内核正在做一些别的事情的时候,中断会随时到来。无辜的正在运行的代码被打断中断处理程序在run的时候可能禁止了同级中断中断处理程序对硬件操作,一般硬件对时间也是非常敏感的内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理向后推迟上半部分(top bottom)和下半部分(half bottom)10/20/09嵌入式嵌入式OS8/79 允许不同类型中断的嵌套发生,这样能使更多的I/O设备处于忙状态 尽管内核在处理一个中断时可以接受一个新的中断,但在内核代码中还在存在一些临界区,在临界区中,中断必须被禁止10/20/09嵌入式嵌入式OS9/79中断上下文中断上下文中断上下文不同于进程上下文中断或异常处理程序执行的代码不是一个进程它是一个内核控制路径内核控制路径,代表了中断发生时正在运行的进程执行作为一个进程的内核控制路径,中断处理程序比一个进程要“轻”(中断上下文只包含了很有限的几个寄存器,建立和终止这个上下文所需要的时间很少)10/20/09嵌入式嵌入式OS10/79中断上下文举例中断上下文举例分析A,B,C,D在互相抢占上的关系 假设:2个interrupt context,记为A和B 2个process,记为C和D 1,假设某个时刻C占用CPU运行,此时A中断发生,C被A抢占,A得以在CPU上执行。由于Linux不为中断处理程序设置process context,A只能使用 C的kernel stack作为自己的运行栈C进程进程D进程进程A中断中断B中断中断A中断发生中断发生current10/20/09嵌入式嵌入式OS11/792,无论如何,Linux的interrupt context A绝对不会被某个进程C或者D抢占!这是由于所有已经启动的interrupt contexts,不管是interrupt contexts之间切换,还是在某个interrupt context中执行代码的过程,决不可能插入scheduler调度例程的调用。除非interrupt context主动或者被动阻塞进入睡眠,唤起scheduler,但这是必须避免的,危险性见第3点说明。C进程进程D进程进程A中断中断B中断中断A中断发生中断发生current10/20/09嵌入式嵌入式OS12/793,关于第2点的解释:首先,interrupt context没有process context,A中断是“借”了C的进程上下文运行的,若允许A“阻塞”或“睡眠”,则C将被迫阻塞或睡眠,仅当A被“唤醒”C才被唤醒;而“唤醒”后,A将按照C在就绪队列中的顺序被调度。这既损害了A的利益也污染了C的kernel stack。其次,如果interrupt context A由于阻塞或是其他原因睡眠,外界对系统的响应能力将变得不可忍受10/20/09嵌入式嵌入式OS13/794,那么interrupt context A和B的关系又如何呢?由于可能在interrupt context的某个步骤打开了CPU的IF flag标志,这使得在A过程中,B的irq line已经触发了PIC,进而触发了CPU IRQ pin,使得CPU执行中断B的interrupt context,这是中断上下文的嵌套过程。5,通常Linux不对不同的interrupt contexts设置优先级,这种任意的嵌套是允许的当然可能某个实时Linux的patch会不允许低优先级的interrupt context抢占高优先级的interrupt context C进程进程D进程进程A中断中断B中断中断A中断发生中断发生currentB中断发生中断发生开中断开中断10/20/09嵌入式嵌入式OS14/79中断和异常的分类(中断和异常的分类(Intel文档文档)中断分为:可屏蔽中断(Maskable interrupt)I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽中断。可屏蔽中断可以处于两种状态:屏蔽的(masked)和非屏蔽的(unmasked)非屏蔽中断(Nonmaskable interrupt)只有几个特定的危急事件才引起非屏蔽中断。如硬件故障或是掉电10/20/09嵌入式嵌入式OS15/79异常分为:处理器探测异常由CPU执行指令时探测到一个反常条件时产生,如溢出、除0错等编程异常由编程者发出的特定请求产生,通常由int类指令触发通常叫做“软中断”例如系统调用10/20/09嵌入式嵌入式OS16/79ARM的异常(中断)机制的异常(中断)机制在ARM中,中断异常系统调用统称为异常ARM的异常有7种,下面是向量表10/20/09嵌入式嵌入式OS17/79ARM的的寄寄存存器器和和模模式式10/20/09嵌入式嵌入式OS18/79ARM异常的优先级异常的优先级10/20/09嵌入式嵌入式OS19/79ARM的异常(中断)机制的异常(中断)机制发生异常时异常返回:R14_ PCSPSR_ CPSR10/20/09嵌入式嵌入式OS20/79开关中断开关中断include/asm-arm/assembler.hInterrupts are disabled when the I bit in the CPSR is set.If the I bit is clear,ARM checks for an IRQ at instruction boundaries.10/20/09嵌入式嵌入式OS21/79主要内容主要内容中断基础(ARM版)Linux内核中软件级中断处理及其数据结构内核中软件级中断处理及其数据结构Linux的软中断、tasklet以及下半部分10/20/09嵌入式嵌入式OS22/79中断和异常处理程序的嵌套执行中断和异常处理程序的嵌套执行当内核处理一个中断或异常时,就开始了一个新的内核控制路径当CPU正在执行一个与中断相关的内核控制路径时,linux不允许进程切换。不过,一个中断处理程序可以被另外一个中断处理程序中断,这就是中断的嵌套执行10/20/09嵌入式嵌入式OS23/79抢占原则普通进程可以被中断或异常处理程序打断异常处理程序可以被中断程序打断中断程序只可能被其他的中断程序打断Linux允许中断嵌套的原因提高可编程中断控制器和设备控制器的吞吐量实现了一种没有优先级的中断模型10/20/09嵌入式嵌入式OS24/79初始化中断向量表初始化中断向量表内核启动中断前,必须初始化中断向量表arch/arm/kernel/entry-armv.S,每个向量长度为4个字节个字节10/20/09嵌入式嵌入式OS25/79向量表的初始化向量表的初始化trap_init中10/20/09嵌入式嵌入式OS26/79中断的处理中断的处理vector_irq:普通的中断:普通的中断10/20/09嵌入式嵌入式OS27/7910/20/09嵌入式嵌入式OS28/79vector_stub的宏定义的宏定义/arch/arm/kernel/entry-armv.S10/20/09嵌入式嵌入式OS29/7910/20/09嵌入式嵌入式OS30/79_irq_user10/20/09嵌入式嵌入式OS31/79ret_to_userarch/arm/kernel/entry-common.S10/20/09嵌入式嵌入式OS32/79_irq_svc10/20/09嵌入式嵌入式OS33/79中断的处理中断的处理vector_fiq:快速中断:快速中断10/20/09嵌入式嵌入式OS34/7910/20/09嵌入式嵌入式OS35/7910/20/09嵌入式嵌入式OS36/79异常处理异常处理1:未定义指令异常:未定义指令异常未定义指令异常,第2个向量对于协处理器的指令,arm处理器将等待协处理器来说明是否可以处理,若无响应,则产生未定义指令异常对于其他未定义指令,也产生该异常。10/20/09嵌入式嵌入式OS37/7910/20/09嵌入式嵌入式OS38/79arch/arm/kernel/entry-armv.S10/20/09嵌入式嵌入式OS39/79_und_usr参见arch/arm/kernel/traps.c按hook处理,或者发送信号终止进程的执行10/20/09嵌入式嵌入式OS40/79_und_svc参见arch/arm/kernel/traps.c按hook处理,或者发送信号终止进程的执行10/20/09嵌入式嵌入式OS41/79中断处理中断处理中断跟异常不同,它并不是表示程序出错,而是硬件设备有所动作,所以不是简单地往当前进程发送一个信号就OK的主要有三种类型的中断:I/O设备发出中断请求时钟中断处理器间中断(在SMP,Symmetric Multiprocessor上才会有这种中断)10/20/09嵌入式嵌入式OS42/79I/O中断处理中断处理I/O中断处理程序必须足够灵活以给多个设备同时提供服务比如几个设备可以共享同一个IRQ线(2个8259级联也只能提供15根IRQ线,所以外设共享IRQ线是很正常的)这就意味着仅仅中断向量解决不了全部问题10/20/09嵌入式嵌入式OS43/79灵活性以两种不同的方式达到IRQ共享:中断处理程序执行多个中断服务例程(interrupt service routines,ISRs)。每个ISR是一个与单独设备(共享IRQ线)相关的函数IRQ动态分配:一条IRQ线在可能的最后时刻才与一个设备相关联10/20/09嵌入式嵌入式OS44/79为了保证系统对外部的响应,一个中断处理程序必须被尽快的完成。因此,把所有的操作都放在中断处理程序中并不合适Linux中把紧随中断要执行的操作分为三类紧急的(critical)一般关中断运行。诸如对PIC应答中断,对PIC或是硬件控制器重新编程,或者修改由设备和处理器同时访问的数据10/20/09嵌入式嵌入式OS45/79非紧急的(noncritical)如修改那些只有处理器才会访问的数据结构(例如按下一个键后读扫描码),这些也要很快完成,因此由中断处理程序立即执行,不过一般在开中断的情况下10/20/09嵌入式嵌入式OS46/79非紧急可延迟的(noncritical deferrable)如把缓冲区内容拷贝到某个进程的地址空间(例如把键盘缓冲区内容发送到终端处理程序进程)。这些操作可以被延迟较长的时间间隔而不影响内核操作,有兴趣的进程将会等待数据。内核用在一个更为合适的时机用独立的函数来执行这些操作10/20/09嵌入式嵌入式OS47/79不管引起中断的设备是什么,所有的I/O中断处理程序都执行相同的基本操作1,若有必要,进入核心态2,在内核态堆栈保存上下文(用户态核心态)3,调用asm_do_IRQ4,恢复上下文5,若有必要,返回用户态10/20/09嵌入式嵌入式OS48/79中断处理中断处理asm_do_IRQ()函数arch/arm/kernel/irq.cinclude/asm-arm/mach/irq.h10/20/09嵌入式嵌入式OS49/79asm_do_IRQ使用的数据结构(体系结构无关)irq_desc数组包含了NR_IRQS个irq_desc_t描述符NIrq_descIrq_chip中断控制器处理例程每一个中断号具有一个描述符,使用action链表连接共享同一个中断号的多个设备和中断10/20/09嵌入式嵌入式OS50/79查看相关数据结构查看irq_desc数组的定义和最初的初始化include/linux/irq.hkernel/irq/handle.c10/20/09嵌入式嵌入式OS51/79irqaction数据结构数据结构用来实现IRQ的共享,维护共享irq的特定设备和特定中断,所有共享一个irq的链接在一个action表中,由中断描述符中的action指针指向设置irqaction的函数:setup_irq链表中断处理程序include/linux/interrupt.hkernel/irq/manage.c10/20/09嵌入式嵌入式OS52/79irq_chip数据结构数据结构为特定PIC编写的低级I/O例程例如为一个中断设置irq_chipset_irq_chiparch/arm/plat-s3c24xx/irq.ckernel/irq/chip.c10/20/09嵌入式嵌入式OS53/79例如,例如,Init_IRQ的中断初始化的中断初始化arch/arm/kernel/irq.c函数setup_arch:函数setup_arch:10/20/09嵌入式嵌入式OS54/79关于关于machine_arch_type 以s3c2410为例include/asm-arm/mach-types.harch/arm/kernel/setup.c10/20/09嵌入式嵌入式OS55/79关于关于machine_descinclude/asm-arm/mach/arch.h10/20/09嵌入式嵌入式OS56/7910/20/09嵌入式嵌入式OS57/79以以smdk2410为例为例arch/arm/mach-s3c2410/mach-smdk2410.c阅读:arch/arm/plat-s3c24xx/irq.c10/20/09嵌入式嵌入式OS58/79irq_desc的第一个数据项:的第一个数据项:irq_flow_handler_t handle_irq_set_irq_handler设置handle_irq数据项handle_level_irq handle_simple_irqhandle_fasteoi_irqhandle_edge_irqhandle_percpu_irqarch/arm/plat-s3c24xx/irq.ckernel/irq/chip.c10/20/09嵌入式嵌入式OS59/79Actionhandle在setup_irq时,给定例如arch/arm/plat-s3c24xx/time.c10/20/09嵌入式嵌入式OS60/79中断处理中断处理asm_do_IRQ()函数arch/arm/kernel/irq.cinclude/asm-arm/mach/irq.h10/20/09嵌入式嵌入式OS61/79以以handle_level_irq为例为例handle_level_irqhandle_IRQ_event(irq,action);kernel/irq/handle.c10/20/09嵌入式嵌入式OS62/79小结:中断处理过程小结:中断处理过程根据需要进入核心态保存上下文调用asm_do_IRQ根据中断号,找到中断处理函数处理恢复上下文根据需要返回用户态10/20/09嵌入式嵌入式OS63/79主要内容主要内容中断信号的作用和中断信号处理的一般原则I/O设备如何引起CPU中断x86 CPU如何在硬件级处理中断信号Linux内核中软件级中断处理及其数据结构Linux的软中断、的软中断、tasklet以及下半部分以及下半部分10/20/09嵌入式嵌入式OS64/79软中断、软中断、tasklet以及下半部分以及下半部分对内核来讲,可延迟中断不是很紧急,可以将它们从中断处理例程中抽取出来,保证较短的中断响应时间Linux2.6提供了三种方法 可延迟的函数软中断、tasklet Tasklet在软中断之上实现 一般原则:在同一个CPU上软中断/tasklet不嵌套 软中断由内核静态分配(编译时确定)Tasklet可以在运行时分配和初始化(例如装入一个内核模块时)工作队列(work queues)10/20/09嵌入式嵌入式OS65/79软中断初始化激活屏蔽执行tasklettasklet_hitasklettasklettasklet下半部分激活导致一个相应的tasklet插入10/20/09嵌入式嵌入式OS66/79一般而言,可延迟函数上可以执行4种操作初始化:定义一个新的可延迟函数,通常在内核初始化时进行激活:设置可延迟函数在下一轮处理中执行屏蔽:有选择的屏蔽一个可延迟函数,这样即使被激活也不会被运行执行:在特定的时间执行可延迟函数10/20/09嵌入式嵌入式OS67/79Linux2.6.26使用有限个软中断软中断软中断优先级0:处理高优先级的tasklet和下半部分优先级2:把数据包传送到网卡优先级3:从网卡接受数据包优先级5:处理tasklet优先级1:与时钟中断相关的tasklet优先级4:块设备相关优先级6:调度SMP相关include/linux/interrupt.h10/20/09嵌入式嵌入式OS68/79在softirq_vec中定义优先级对应于softirq_vec的下标软中断函数及其参数kernel/softirq.cinclude/linux/interrupt.h10/20/09嵌入式嵌入式OS69/79软中断的初始化软中断的初始化初始化软中断函数分别在softirq_init和net_dev_init、blk_dev_init等中初始化例如例如kernel/et/core/dev.ckernel/softirq.c10/20/09嵌入式嵌入式OS70/79软中断的触发软中断的触发raise_softirqinclude/asm-blackfin/hardirq.htypedef struct unsigned int _softirq_pending;unsigned int local_timer_irqs;_cacheline_aligned irq_cpustat_t;kernel/softirq.c#ifndef _ARCH_IRQ_STATirq_cpustat_t irq_statNR_CPUS _cacheline_aligned;EXPORT_SYMBOL(irq_stat);#endifkernel/softirq.c10/20/09嵌入式嵌入式OS71/79软中断的检查软中断的检查local_softirq_pending在某些特定的时机,会检查是否有软中断被挂起调用local_bh_enable重新激活软中断时当asm_do_IRQ完成了I/O中断的处理时调用irq_exit当那个特定的进程ksoftirqd被唤醒时这种时机,称为检查点if(!in_interrupt()&local_softirq_pending()invoke_softirq();0:disableinclude/linux/interrupt.hkernel/softirq.ckernel/softirq.c10/20/09嵌入式嵌入式OS76/79Tasklet的使用的使用当需要使用tasklet时,可以按照如下方法进行1、分配一个tasklet的数据结构,并初始化=相当于声明(定义)一个tasklet2、可以禁止/允许这个tasklet=相当于定义了一个是否允许使用tasklet的窗口3、可以激活这个tasklet=这个tasklet被插入task_vec或者task_hi_vec的相应CPU的链表上,将在合适的时机得到处理10/20/09嵌入式嵌入式OS77/79激活激活tasklet的方法的方法即将tasklet插入到合适的链表中Tasklet_scheduleTasklet_hi_schedule10/20/09嵌入式嵌入式OS78/79工作队列和工作线程工作队列和工作线程相关数据结构workqueue_struct;cpu_workqueue_structwork_struct;delayed_work入列 queue_work;queue_delayed_work工作队列的处理run_workqueueworker_thread10/20/09嵌入式嵌入式OS79/79从中断和异常返回(阅读源码)从中断和异常返回(阅读源码)中断和异常的终止目的很清楚,即恢复某个程序的执行,但是还有几个问题要考虑内核控制路径是否嵌套如果仅仅只有一条内核控制路径,那CPU必须切换到用户态挂起进程的切换请求如果有任何请求,必须调度;否则,当前进程得以运行挂起的信号如果一个信号发送到进程,那必须处理它
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!