• 首页
  • 中国
  • OK6410A 开发板 (八) 14 linux-5.11 OK6410A 中断发生流程

OK6410A 开发板 (八) 14 linux-5.11 OK6410A 中断发生流程

2023-11-01 18浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

先硬件流程再软件流程

1. 硬件流程

When an IRQ is detected, the following actions are performed:

R14_irq = address of next instruction to be executed + 4

SPSR_irq = CPSR

CPSR[4:0] = 0b10010 /* Enter IRQ mode */

CPSR[5] = 0 /* Execute in ARM state */

/* CPSR[6] is unchanged */

CPSR[7] = 1 /* Disable normal interrupts */

CPSR[8] = 1 /* Disable Imprecise Data Aborts (v6 only) */

CPSR[9] = CP15_reg1_EEbit /* Endianness on exception entry */

if VE==0 then

if high vectors configured then

PC = 0xFFFF0018

else

PC = 0x00000018

else

PC = IMPLEMENTATION DEFINED /* see page A2-26 */

To return after servicing the interrupt, use:

SUBS PC,R14,#4

This restores both the PC (from R14_irq) and CPSR (from SPSR_irq), and resumes execution of the interrupted code.

2. 软件流程

What happens if an interrupt occurs and the interrupt handler does not remove the interrupt?

可以在中断处理代码中 启用中断

但必须

1.先确认中断

2.并等 硬件 自动移除中断后

才能 启用中断

异常向量表 第0级 irq 处理函数

异常向量表的位置 0xffff0000

虚拟地址范围应该是 0xffff0000- 0xffff1000

对应的物理地址范围是 0x5fffe000 - 0x5ffff000

map.pfn:5fffe,map.virtual:ffff0000,map.length:1000,map.type:8

irq 在 异常向量表的偏移 为 0x00000018

.globl vector_fiq_offset

.equ vector_fiq_offset, vector_fiq

.section .vectors, "ax", %progbits

__vectors_start:

W(b) vector_rst

W(b) vector_und

W(ldr) pc, __vectors_start + 0x1000

W(b) vector_pabt

W(b) vector_dabt

W(b) vector_addrexcptn

W(b) vector_irq // 跳转到 **级 irq 处理函数

W(b) vector_fiq

**级 irq 处理函数

/*

* Interrupt dispatcher

*/

vector_stub irq, IRQ_MODE, 4

.long __irq_usr @ 0 (USR_26 / USR_32)

.long __irq_invalid @ 1 (FIQ_26 / FIQ_32)

.long __irq_invalid @ 2 (IRQ_26 / IRQ_32)

.long __irq_svc @ 3 (SVC_26 / SVC_32)

.long __irq_invalid @ 4

.long __irq_invalid @ 5

.long __irq_invalid @ 6

.long __irq_invalid @ 7

.long __irq_invalid @ 8

.long __irq_invalid @ 9

.long __irq_invalid @ a

.long __irq_invalid @ b

.long __irq_invalid @ c

.long __irq_invalid @ d

.long __irq_invalid @ e

.long __irq_invalid @ f

// 这里主要处理 从 irq 异常模式 切换到 svc 异常模式

vector_name:

.if correction

sub lr, lr, #correction

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台