6410的间断体系:
嵌入式软件里的间断处理,除了间断初始化,首要作业便是编写ISR.
在嵌入式的SOC的CPU里,在CPU里内部会带一些设备模块,它们发生的间断称为内部间断。由于联线比较固定,因而编程比较简略。并且在物理上CPU别离的芯片发生的间断,称为外部间断,外部间断能够联接不同的间断脚上,因而需求对间断IO进行较杂乱的装备。
轮询形式是否一无可取?轮询的长处是在重负荷的状况下,轮询比间断功率会高许多。比方一个教室许多学生不断的问问题,这样与其不断被间断,教师还不如合格在教室走动,随机处理学生问题会高许多。
反常(Exception)
————————————————————————–
Exception(反常), 计算机体系结构中,反常或许间断是处理体系中突发事件的一种机制,简直一切的处理器都供给这种机制。反常首要是从处理器被迫承受的视点动身的一种描绘,指意外操作引起的反常。而间断则带有向处理器主动恳求的意味。但这两种状况具有必定的共性,都是恳求处理器打断正常的程序碑文流程,进入特定程序的一种机制。
从结构来看,外部设备发生的间断能够当作一种特别的反常.除了间断之外,还有ARM不少固定的反常.包含以下七种:
1. 复位(Reset)
当按下RESET键后,会发生一个复位反常,此刻程序跳转到复位反常处理程序处碑文.当CPU重启后.一般刚好跳到这个复位反常来
2. 未界说指令
当ARM的处理器或协处理器遇到不能处理的指令时,发生未界说指令反常,选用这个机制,能够经过软件仿真扩展ARM或Thumb 指令集.
3. 软件间断(SWI)
硬件间断是有固定的硬件发生的间断,而软间断是指没具体的硬件发生,是CPU虚拟出来的.该反常由程序碑文汇编SWI发生.软间断的长处,
可用于用户形式下的程序调用特权操作指令.Linux 体系调用便是运用这个反常来完成的.
有运用程序结构的优化.比方在Linux 驱动里,硬件间断不能长期运转.可是许多软件的长期操作依靠的于间断的调用.有时为处理这个抵触,会在驱动规划两级,从硬件存取用硬件间断,而长期操效果软件间断的模仿.
4. 指令预取间断
若处理预取的指令的地址不存在,或该地址不允许当时指令拜访,存储器会向处理器宣布间断信号,但当预取的指令被碑文时,才会发生指令预取间断的反常.比方用ADS把程序下载到开发板上0x8000地址上.就会发生Abort反常.
5. 数据间断
若处理器数据拜访数据的地址不存在,或该地址不允许当时指令拜访时,发生数据间断反常
6. IRQ
当外部设备在外部间断脚发生间断信号时.即触发了IRQ间断.这是外部设备运用最常用的一种手法.
在S3C24X0是一个集成的SOC,内部除了ARM模块以外.还其它内部集成的模块,如USB,RTC,等.这一些模块在CPU内部也会有相应的间断线连到ARM920T的内核上.但这一些管脚在CPU外部是不行见的,只能用于寄存器去操控.
还一些GPIO脚就充任外部间断操控线,外部IC能够把自己间断信号线连到相应的间断脚上.当外部产间断信号后,CPU就能够知道,外设有间断发来.
7. FIQ
快速间断,类似于IRQ,可是具有较快响应速度.并且设为FIQ的条件也比较严厉,比方一次触发只能有一个FIQ
一句话,间断(IRQ,FIQ,SWI)是反常中的一个特例。当发生外部间断时,大部分CPU会只发生一个反常。在反常处理程序里软件再去读不同的间断寄存器剖析后来调用ISR。这儿ISR是由软件来碑文的。象S3C2440便是这样机制。
在S3C6410中,还能够选用简化的间断处理流程。由CPU直接去调用间断的ISR来处理。 这样间断处理软件的编写难度就大大下降了。
向量(vector)
反常处理函数或间断处理函数的地址都会按间断号的顺离顺序排列在一个接连的内存傍边,从C言语的视点来看,能够当作是一个指针数组。数组又称为向量(Vector).
假如你了解S3C2440的间断处理机制,能够发现S3C6410大大简化的间断编程处理。
相关于S3C2440具体而丰厚的关于间断的解说,S3C6410的dataSheet显着是赶工之作,关于间断只需短短的15页,很多内容仍是寄存器表格。
因而以下大部分我从S3C6410的测验程序和Application Note反推出来的。并且重新用ADS写程序验证了。
S3C6410的间断首要改善是.
添加间断向量操控器,这样在S3C2440里需求用软件来跳转的间断处理机制,在S3C6410彻底由硬件来跳转。你只需把ISR地址是存在接连向量寄存器空间,而不是象S3C2440自行分配空间自行办理。
换句话说,在S3C2440下是由CPU触发IRQ/FIQ反常,由反常处理函数里再查找相关间断寄存器来跳到指定的ISR,而能够悉数由S3C6410的VIC硬件来主动处理。 这个大大简化间断处理编程。
另一个是外部间断参加滤波电路,这样本来需求软件去毛刺的当地均能够选用硬件来进行滤波了,这样大大简化外部间断处理。
S3C6410 间断操作
——————————————————————–
S3C6410 间断号
64个间断按硬件分组分红VIC0, VIC1两个组,各组由一个相应寄存器来处理。
间断号为0-31是VIC0组
间断号为32-63是VIC1组
S3C6410间断操作很简略。
翻开间断 VICxINTENABLE
x为0,1,0-31间断运用VIC0INTENABLE,32-63间断运用VIC1INTENABLE.以下各寄存器均同,不再重复.
对应位为1一共这个间断可用,如0号间断有用,是VIC0INTENABLE的第0位为1
封闭一个间断
向VICxINTENCLEAR对应方位1一共封闭这个间断.
设置间断类型
设置某一个间断是IRQ仍是FIQ,留意只需一个间断才干FIQ.设置对应位1一共设为FIQ形式。
设置S3C6410的向量地址(ISR地址)
留意在S3C6410自已从了各用32个地址接连的寄存器然成两个寄存器数组。首地址分别是0x71200100和0x71300100.你能够象指针数组相同来操作它们,数组的下标便是间断号,每个间断源对应自己的间断地址位,共64个间断源,所以是两个32*32的数组。
这样设置让开发者大大简略化ISR的向量安排。
设置间断优先级
这个也选用用32*2寄存器构成两个优先级数组。每一个寄存器对应优先等级,取值范围在0-15之间.
间断运转后指示
这个由于了用VIC,现在省掉了S3C2440一大堆的SRCPND,INTPND,INTOFFSET,SUBSRCPND等寄存器。直接由VICxADDRESS来指示当时的ISR地址。
留意这个VICxADDRESS的寄存器,在S3C6410里称为在System BUS.调用。这种方法不主张调用,由于这种形式相当于S3C2440的用软件进行ISR跳转.
这三星的给的参阅流程。
更为简略的调用方法.是VIC port 形式,是我强烈推荐的形式,它是体系发生间断后,将由VIC直接去碑文相应的ISR。这不只上编程变成简略,并且功率上更快,由于它没有拜访VICxADDRESS和在System BUS碑文的时刻
运用这种形式,只需求在发动加上特定的代码
外部间断编程
除INT_EINT0-INT_EINT4以外,悉数间断是由S3C6410内部的模块触发的。称为内部间断
INT_EINT0-INT_EINT4是外部间断,是由CPU外的外设来触发的,它的触发哪一个间断取决外设联接哪一个GPIO间断脚。
象开发板的网络操控器,按钮等都是挂在某一些GPIO脚上。它们都是运用典形外部间断.
外部间断脚
S3C6410 分9组GPIO脚来充任外部间断脚
第0组,共28脚.GPN0-GPN15 (16脚),GPL8-GPL14(7脚),GPM0-GPM4 (5脚)
第1组,由GPA0-GPA7,8个间断脚,GPB0-GPB7,8个间断脚
第2组,由GPC0-GPC0,共8个间断脚…
…
第8组,由GPP0-GPP14,共15个间断脚
第9组,由GPQ0-GPQ8,共9个间断脚
外部间断号
第0组的第0脚到第3脚的设备将触INT_EINT0=0间断
第0组的第4-11脚将触发INT_EINT1=1间断
第0组的第12-19脚将触发INT_EINT2=32间断
第0组的第20-27脚将触发INT_EINT3=33间断
第1组-第9组一切设备只触发INT_EINT4=53间断
咱们能够看到,每一个组都是多个间断脚同享一个间断号的。其间第0组比较常用,占用了3个间断号,每个管脚都有各自的子间断。1-9组同享一个间断号,每一组一个子间断源。
在ISR中,怎么判别是哪一个间断脚的发生间断?
不同的IO脚上多个设备发生同一个间断,软件怎么知道是哪一个脚?
由External Interrupt Pending Register 来判别
第0组由EINT0PEND来判别,脚位对应能够参阅上图,不是很规整。
第1,2组由EINT12PEND来判别
依此类推,EINT34PEND,EINT56PEND, 一直到EINT9PEND 来指示
外部间断信号类型
这儿设置间断发生何种信号才会被捕获。首要是五种,低电平,高电平,上升沿,下降沿或许两者均可,
第0组用 EINT0CON0/EINT0CON1两个寄存器来设定.
第1,2组选用 EINT12CON ,
第3,4组选用EINT34CON,
依此类推
暂时封闭外部间断
EINTxMask是暂时性封闭间断
为1一共封闭某一个间断,为一共翻开0,一般只需需求运用间断才会翻开。
EINT0MASK是第0组的运用
EINT12MASK是第1,2组的间断掩码
顺次类推…
界说硬件滤波类型
关于一些波形不规整的外部间断信号,能够经过滤波电路让其变成规整,这样会简化软件的编写.
S3C6410有两种滤波电路,一种延时滤波(如按钮类间断能够选用这一类型),一种是数字采样滤波.第二种滤波电路还要设采样宽度。
第0组的滤波用EINT0FLTCON0,EINT0FLTCON1, EINT0FLTCON2, EINT0FLTCON3装备.
FLTEN一共是否翻开滤波功用,FLTSEL是设置滤波方法,EINTn一共数字滤波采校的宽度
第1,2组的滤波选用 EINT12FLTCON
第3,4组的滤波选用 EINT34FLTCON
第9组滤波 选用EINT9FLTCON
外部间断编程
外部间断除了间断编程一切流程外,
一般额定装备相应的GPxCON装备成间断脚。
还要装备滤波方法和间断信号方法。
还要翻开外部间断掩码
在ISR中,在最终除了要把VICxADDRESS清0外,还需求铲除 VICxSOFTINTCLEAR相应位。
软件间断编程
————————————————————-
在S3C6410有64个软间断(与硬件间断对应),这一段描绘是十分迷糊。是同一硬件间断能够用软件触发仍是是,有一个彻底对应的软件间断?这个需求软件来验证.
软间断除硬件间断的一切流程还要加上如下两条.
用VICxSOFTINT来触发软间断
ISR退出时运用V%&&&&&%xSOFTINTCLEAR铲除状况
软间断编程流程