教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

ARM中断基础知识 - 图文

来源:网络收集 时间:2026-09-06
导读: ARM中断基础知识 一、ARM内核工作模式 因为中断会设计到ARM内核工作模式的切换,所以先简要介绍一下各个模式: ARM模式的切换要设计到寄存器CPSR,下面是各个位表示的含义,CPSR[4:0]是工作模式切换控制位。 T=0时是ARM指令模式,T=1时是Thumb指令模式。 F=

ARM中断基础知识 一、ARM内核工作模式 因为中断会设计到ARM内核工作模式的切换,所以先简要介绍一下各个模式: ARM模式的切换要设计到寄存器CPSR,下面是各个位表示的含义,CPSR[4:0]是工作模式切换控制位。 T=0时是ARM指令模式,T=1时是Thumb指令模式。 F=0时是允许FIQ,F=1是禁止FIQ I=0时是允许IRQ,I=1是禁止IRQ 在开发板刚刚启动起来的时候首先得关闭所有中断,等把开发板的硬件初始化,各种参数设置好之后就可以打开中断了。 CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C) C 控制域屏蔽字节( CPSR[7:0] ) X 扩展域屏蔽字节( CPSR[15:8] ) S 状态域屏蔽字节( CPSR[23:16] ) F 标志域屏蔽字节( CPSR[31:24] ) 常用于MRS或MSR指令,用于cpsr中的值转移到寄存器或把寄存器的内容加载到cpsr中. 如: MSR CPSR_c,#0xd3 ARM 内核工作模式的切换是要自己手动切换的, 设置CPSR 寄存器低5位进行切换(第五位始终是1) cpsr[4:0] 1,0000 1,0001 1,0010 1,0011 1,0111 1,1011 1,1111 处理器模式 用户模式 快速中断模式 中断模式 管理模式 中止模式 未定义 系统模式 英文表示 usr fiq irq svc abt und sys CPU刚刚复位后的模式是管理模式(SVC),如果我们写纯裸机代码(不使用uboot),刚开始是在stepping stone中运行的,我们在这个里面得完成代码的一些硬件的初始化,比如时钟初始化,sdram初始化,nandflash初始化(从nandflash启动)等等,然后把程序从nandflash中拷贝到sdram中运行,在这段启动代码中我们免不了要初始化各种堆栈,而且是各个模式下的堆栈最好都提前设置好,这里就要考虑各种因素了。

比如我们是在OK6410平台上面测试,当复位或者开机后处于8K 大小的stepping stone中,此时我们设置堆栈是SVC下的堆栈,如果我们要设置其他模式下的堆栈的话我们就必须手动的设置CPSR下的模式位,来跳转到各个模式下设定好对应的堆栈。因为以后是要在sdram中运行了,所以这些堆栈应当设定为sdram中的地址。OK6410中的sdram是256M的,所以我们可以从顶部开始设置,比如说切换到irq模式,把堆栈设置为SP = 0x60000000 (因为S3C6410中内存起始地址是从0x50000000开始的,加上256M,即0x10000000,得到栈顶为0x60000000),然后切换到fiq模式下,把堆栈设置为SP = 0x5f000000,一次类推。但是要注意的是,我们还在stepping stone中运行的时候SVC的堆栈还是得保持在片内内存的顶部即SP = 8*1024,直到要跳转到sdram中运行的时候了才把SVC的堆栈设置到sdram中去。

有些人喜欢刚开始只设置SVC的堆栈(因为刚开启的时候就是这个模式,所以必须设置一下),而不设置别的模式的堆栈,等到中断发生了之后,在中断函数中设置堆栈的地址。我觉得这样有些不妥,提前都设置好,以后中断进来后就省去了每次设置堆栈的步骤,提高了效率。 中断向量表:

以下代码就是切换CPU工作模式的示例

;********** Begin init stact ***********/ ;在6种模式下切换并设置堆栈指针 MRS R0,CPSR ;把CPSR读取到R0 BIC R0,#0x1f ;低5位清零

LDR R1,=MODE_Fiq ;设置R1 为0b10001,跳转到fiq模式 ORR R0,R0,R1 ;R0和R1相或,设置低5位 MSR CPSR_c,R0 ;把R0的值重新赋值到CPSR LDR SP,=Stact_Fiq ;设置fiq的栈指针 BIC R0,#0x1f ;低5位清零 LDR R1,=MODE_Irq ;跳转Irq模式 ORR R0,R0,R1 MSR CPSR_c,R0

LDR SP,=Stact_Irq ;设置irq的栈指针 BIC R0,#0x1f

LDR R1,=MODE_Svc ;跳转到svc模式 ORR R0,R0,R1 MSR CPSR_c,R0

LDR SP,=Stact_Svc ;设置svc的栈指针 BIC R0,#0x1f

LDR R1,=MODE_Abort ;跳转到abort模式 ORR R0,R0,R1 MSR CPSR_c,R0

LDR SP,=Stact_Abort ;设置abort的栈指针

BIC R0,#0x1f LDR R1,=MODE_Undef ;跳转到undef模式 ORR R0,R0,R1 MSR CPSR_c,R0 LDR SP,=Stact_Undef ;设置undef栈指针 BIC R0,#0x1f LDR R1,=MODE_Sys ;跳转到sys模式 ORR R0,R0,R1 MSR CPSR_c,R0 LDR SP,=Stact_Sys ;设置sys栈指针 与S3C2440相比,S3C6410增加中断向量控制器,这样在S3C2440里需要用软件来跳转的中断处理机制,在S3C6410中可以完全由硬件来跳转。只要把ISR(中断处理函数)地址存在连续向量寄存器空间,而不必像在S3C2440自行分配空间进行管理。换句话说,在S3C2440下是由cpu触发IRQ/FIQ异常,由异常处理函数里再查找相关中断寄存器来跳到指定的ISR,而可以全部由S3C6410的VIC硬件来自动处理。这样就大大简化了中断处理编程。 另外一变化是S3C6410外部中断加入了滤波电路,这样原来需要软件去毛刺的地方均可以采用硬件来进行滤波了,这样大大简化了外部中断处理。 S3C6410具有187个多功能IO端口,其中有127个用于外部中断。这127个引脚可以分为10组: 外部中断分组 External interrupt Group 0 External interrupt Group 1 External interrupt Group 2 External interrupt Group 3 External interrupt Group 4 External interrupt Group 5 External interrupt Group 6 对应GPIO GPN0~GPN15 GPL8~GPL14 GPM0~GPM4 (16+7+5=28,所以EINT0PEND有28bit来识别这28个中断) GPA0~GPA7 GPB0~GPB6 GPC0~GPC7 GPD0~GPD5 GPF0~GPF14 GPG0~GPG7 GPH0~GPH9 External interrupt Group 7 External interrupt Group 8 External interrupt Group 9 又包含几个中断。 在VIC中,10组外部中断占用的中断源情况如下: GPO0~GPO15 GPP0~GPP14 GPQ0~GPQ9 6410支持64种中断源,即有64个中断号。INT_EINT0仅仅对应0号中断,INT_EINT0中断号 0 1 32 33 53 按键 KEY1 KEY2 KEY3 KEY4 KEY5 KEY6 中断源 INT_EINT0 INT_EINT1 INT_EINT2 INT_EINT3 INT_EINT4 对应引脚 GPN0 GPN1 GPN2 GPN3 GPN4 GPN5 对应外部中断 External interrupt 0~3 External interrupt 4~11 External interrupt 12~19 External interrupt 20~27 External interrupt group1~group9 对应外部中断 External interrupt 0 External interrupt 1 External interrupt 2 External interrupt 3 External interrupt 4 External interrupt 5 中断源 VIC组 VIC0 VIC0 VIC1 VIC1 VIC1 举个例子(OK6410的6个按键做外部中断): INT_EINT0 INT_EINT0 INT_EINT0 INT_EINT0 INT_EINT1 INT_EINT1 KEY1~KEY4都是属于INT_EINT0,即都是属于中断号为0的中断,这四个按键产生的外部中断所调用的中断处理函数的地址都是存在VIC0VECTADDR0寄存器中的,这四个随便哪个按下都会调用同一个中断处理函数,所以在处理函数里面必须判别是哪个按键所触发的中断。 中断相关寄存器的设计演变(寄存器以外部按键中断为例) IC ARM7(4510) IC ARM9(2440) CPSR I-bit IC ARM11(6410) CPSR I-bit VIC Port(Enable) VIC interface(PC <--> A0~A31) VectADDRESS(32bit -> A0~A31,中断函数地址的注册 ) Vectors(handlers中断处理函数) Priority(优先级的判别) VIC0IRQSTATUS/VIC0FIQSTATUS(IRQ/FIQ的中断悬起位) VIC0INTSELECT (选择是IRQ还是FIQ模式) VIC0INTENABLE(MASK功能) 内核 CPSR I-bit (core) 中断控制INTMOD 器 INTPND (IC) INTMSK INTOFFSET INTPRI INTPND INTMOD INTMSK SRCPND VIC0RAWINTR(显示FIQ中断是否置位,从EINT0PND上传输过来的) EINTCON 中断源控(F/R/L) 制器 GPXCON (GPIO) (EINT) 硬件层 EINTCON (F/R/L) GPXCON (EXIT) INTMASK EINT0PND (需要手动清除) EINT0CON0 (Low/High level Falling/Rising/Both ed …… 此处隐藏:3381字,全部文档内容请下载后查看。喜欢就下载吧 ……

ARM中断基础知识 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/444994.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)