当前位置:首页 > 单片机 > 单片机
[导读]ARM体系结构中,把复位、中断、快速中断等都看作‘异常’,当这些‘异常’发生时,CPU会到固定地址处去找指令,他们对应的地址如下: 地址 异常类型 进入时的工作模式 0x00000000 Reset Supervisor 0x00000004 Und U

ARM体系结构中,把复位、中断、快速中断等都看作‘异常’,当这些‘异常’发生时,CPU会到固定地址处去找指令,他们对应的地址如下:

地址 异常类型 进入时的工作模式

0x00000000 Reset Supervisor

0x00000004 Und Undefined

0x00000008 Soft interupt Supervisor

0x0000000c Abort(prefetch) Abort

0x00000010 Abort(data) Abort

0x00000014 Reserved Reserved

0x00000018 IRQ IRQ

0x0000001c FIQ FIQ

首先要明确的一点就是,无论内存地址空间是如何映射的,以上这些地址都不会变,比如当有快速中断发生时,ARM将铁定到0X0000001C这个地址处取指令。这也是BOOTLOADER把操作系统引导以后,内存必须重映射的原因!否则操作系统不能真正接管整套系统!

LINUX启动以后要初始化这些区域,初始化代码在main.c中的start_kernel()中,具体是调用函数trap_ini()来实现的。如下面所示(具体可参照entry-armv.S):

.LCvectors: swi SYS_ERROR0

b __real_stubs_start + (vector_undefinstr - __stubs_start)

ldr pc, __real_stubs_start + (.LCvswi - __stubs_start)

b __real_stubs_start + (vector_prefetch - __stubs_start)

b __real_stubs_start + (vector_data - __stubs_start)

b __real_stubs_start + (vector_addrexcptn - __stubs_start)

b __real_stubs_start + (vector_IRQ - __stubs_start)

b __real_stubs_start + (vector_FIQ - __stubs_start)

ENTRY(__trap_init)

stmfd sp!, {r4 - r6, lr}

adr r1, .LCvectors @ set up the vectors

ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}

stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}

add r2, r0, #0x200

adr r0, __stubs_start @ copy stubs to 0x200

adr r1, __stubs_end

1: ldr r3, [r0], #4

str r3, [r2], #4

cmp r0, r1

blt 1b

LOADREGS(fd, sp!, {r4 - r6, pc})

以上可以看出这个函数初始化了中断向量,实际上把相应的跳转指令拷贝到了对应的地址。

当发生中断时,不管是从用户模式还是管理模式调用的,最终都要调用do_IRQ():

__irq_usr: sub sp, sp, #S_FRAME_SIZE

stmia sp, {r0 - r12} @ save r0 - r12

ldr r4, .LCirq

add r8, sp, #S_PC

ldmia r4, {r5 - r7} @ get saved PC, SPSR

stmia r8, {r5 - r7} @ save pc, psr, old_r0

stmdb r8, {sp, lr}^

alignment_trap r4, r7, __temp_irq

zero_fp

1: get_irqnr_and_base r0, r6, r5, lr

movne r1, sp

adrsvc ne, lr, 1b

@

@ routine called with r0 = irq number, r1 = struct pt_regs *

@

bne do_IRQ @ 调用do_IRQ来实现具体的中断处理

mov why, #0

get_current_task tsk

b ret_to_user

对于以上代码,在很多文章中都有过分析,这里不再赘述。

Linux每个中断通过一个结构irqdesc来描述,各中断的信息都在这个结构中得以体现:

struct irqdesc {

unsigned int nomask

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

CPU亲和度通过限制进程或线程可以运行的CPU核心集合,使得它们只能在指定的CPU核心上执行。这可以减少CPU缓存的失效次数,提高缓存命中率,从而提升系统性能。

关键字: Linux 嵌入式

ARM系统几乎都采用Linux的操作系统,而且几乎所有的硬件系统都要单独构建自己的系统,与其他系统不能兼容,这也导致其应用软件不能方便移植,这一点一直严重制约了ARM系统的发展和应用。GOOGLE开发了开放式的Andro...

关键字: Linux x86 ARM

随着计算需求的多样化,尤其是随着移动设备、嵌入式系统和云计算的兴起,ARM 和 x86 架构之间的争论变得更加突出。ARM(高级 RISC 机器)和 x86 代表两种不同类型的处理器架构,每种架构都针对不同的工作负载和用...

关键字: Linux x86 ARM

从画质优化 (NSS) 到帧率提升 (NFRU) 和光线追踪(NSSD),Arm 计划覆盖移动端图形处理的多个维度,推动边缘 AI 图形革命。而未来通过持续的技术迭代,Arm也将保持在移动计算领域的技术领先,满足手游、A...

关键字: ARM 神经图形技术 GPU AI ML

在Linux系统性能优化中,内存管理与网络连接处理是两大核心领域。vm.swappiness与net.core.somaxconn作为关键内核参数,直接影响系统在高负载场景下的稳定性与响应速度。本文通过实战案例解析这两个...

关键字: Linux 内存管理

7月31日消息,据媒体报道,芯片架构提供商Arm Holdings首席执行官Rene Haas宣布,公司正加大投入开发自有芯片产品,此举标志着其从传统IP授权模式向提供实体芯片的战略重大转变。

关键字: ARM META
关闭