-----------------------------------------------------------------------------------------------------------------------------------
ARM 920T S3C2440A
-----------------------------------------------------------------------------------------------------------------------------------
异常
异常类型
7种,分别是RST,UND,SWI,PRE_ABT,DATA_ABT,IRQ,FIQ
异常模式
5种,分别是SVC,UND,ABT,IRQ,FIQ
异常触发
SWI指令,SWI 0x4
异常响应
硬件做4件事情
1 保存 PC 到 LR_exp
2 保存 CPSR 到 SPSR_exp
3 修改 CPSR 到 exp
4 修改 PC 到 exp->0x??
异常向量表
从 0 地址开始
一共8个表项,其中0x14地方保留
每个表项是 一条跳转指令
B handler (0xEAxxxxxx)
ldr pc, =...
保存现场
压栈保存,stmfd sp!, {r0-r12, lr}
异常处理
通常用 C 语言实现,通过 r0, r1, r2, r3 传参
恢复现场
出栈保存,ldmfd sp!, {r0-r12, lr}
异常返回
要点:地址和模式的返回必须同时完成
movs pc, lr
ldmfd sp!, {r0-r12, pc}^
系统调用的实现
用汇编SWI,通过 mov r0, r1, r2
用C实现SWI, int __swi(0x4) syscall(int,...);
--------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
中断
中断源
使能 enable
触发方式 trigger method
中断控制器
屏蔽位 mask
悬挂位 pending
模式选择 IRQ/FIQ
ARM内核
IRQ禁止位 CPSR I-bit
中断的初始化流程
设置好 0x18 处的跳转指令 b irq_handler
设置 IRQ 模式下的栈指针 sp
设置 SVC 模式下的栈指针 sp
初始化中断源 GPIO
设置 GPF0 管脚的功能复用模式为 EINT0
设置 EINT0 功能触发方式为 Falling Edge Trigger
初始化中断控制器 Interrupt Controller
设置 INTMSK 屏蔽位 打开unmask
设置 INTMOD 模式为 触发IRQ异常
清除 INTPND, SRCPND 已有的bit
设置CPSR的I-bit ,清除禁止位
汇编语言,用 MSR 特权指令
满足中断触发条件,制造出一个下降沿
中断处理
清除 Pending Bit 悬挂位
1 先清除,再处理(为了防止丢失在处理过程中再来的同源中断)
2 先清除SRCPND,再清除INTPND(否则就会重复一次中断,来2次)
3 写1清0,写0则无效 PDN = 1<<0
中断返回 (IRQ&FIQ)
subs pc, lr, #4
---------------------------------------------------------------------------------------------------------------------------------------------------------------------