A: 从栈地址开始,栈顶为AT91SAM7S64的16K片内RAM尽头0x00204000
IRQ_STACK_SIZE =
3*8*4
FIQ_STACK_SIZE = 0x004
ABT_STACK_SIZE = 0x004
UND_STACK_SIZE =
0x004
SVC_STACK_SIZE = 0x800
SYS_STACK_SIZE =
0x400

irq栈为什么用3*8*4=96B呢?因为irq最多8级嵌套,ARM字长4B,而3,是由于每次进栈均破坏了3个寄存器r0、spsr、lr,所以需要压栈保存的也就是3。计算十分精准,没有一个字浪费,这是AT第一牛X的地方。

当irq发生时,下列操作处理器自动完成:
1。r14(irq)=返回地址
2。spsr(irq)=cpsr(中断发生前的模式)
3。改cpsr,成模式为irq,禁止irq中断。
4。设pc,跳转到0x00000018去

下面看中断0x00000018指向的irq_handle代码:

;因为要继续调用函数,lr会被冲掉,所以压irq栈
sub
lr,lr,#4
stmfd sp!,{lr}

;将r0和spsr压irq栈,因为下面用到r0,spsr
mrs
r14,spsr
stmfd
sp!,{r0,r14}

;写IVR,支持保护模式,普通模式无效
;释放NIRQ,清除保护模式下中断源
ldr
r14,=AT91C_BASE_AIC
ldr r0,[r14,#AIC_IVR]
str r14,[r14,
#AIC_IVR]

;允许中断嵌套,由irq模式切换入svc模式
msr cpsr_c,
#ARM_MODE_SVC

;保存scratch和被使用到的寄存器、lr入svc堆栈
stmfd sp!, {r1-r3, r12,
r14}

;跳转到AIC_IVR指向的中断服务程序地址
mov r14,pc
bx
r0

;恢复scratch、被用到的寄存器、lr
ldmia sp!,{r1-r3, r12,
r14}

;禁止irq中断嵌套,由svc切换到irq模式。
msr cpsr_c,#I_BIT |
ARM_MODE_IRQ

;写AIC_EOICR
ldr r14,=AT91C_BASE_AIC
str r14,[r14,
#AIC_EOICR]

;恢复spsr、r0
ldmia sp!,{r0, r14}
msr spsr_cxsf,
r14

;中断返回
ldmia sp!,
{pc}^

以上就是全部,让我惊叹的是如上做法支持了中断嵌套,想了想,自己以前搞的东西还真是全部回避回去了,也就是说,以前各个中断并没有优先级区分,进了中断就关门i->I。中断服务程序执行完了再打开,优点是简单明了,缺点是中断服务程序必须迅速处理完.

ATMEL精妙的IRQ中断处理过程的更多相关文章

  1. 实验五:分析system_call中断处理过程

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

  2. Linux kernel的中断子系统之(六):ARM中断处理过程

    返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...

  3. linux驱动之中断处理过程汇编部分

    linux系统下驱动中,中断异常的处理过程,与裸机开发中断处理过程非常类似.通过简单的回顾裸机开发中断处理部分,来参考学习linux系统下中断处理流程. 一.ARM裸机开发中断处理过程 以S3C244 ...

  4. Linux中断 - ARM中断处理过程

    一.前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作.具体整个处理过程分成三个步骤来描述: 1.第二章描述了中断处理的准备过程 2.第三章描述了当发生中的时候 ...

  5. 通过分析system_call中断处理过程来深入理解系统调用

    通过分析system_call中断处理过程来深入理解系统调用 前言说明 本篇为网易云课堂Linux内核分析课程的第五周作业,上一次作业中我以2个系统调用(getpid, open)作为分析实例来分析系 ...

  6. 分析system_call中断处理过程

    分析system_call中断处理过程 上周我们使用gcc内嵌汇编调用系统调用,这次我们具体分析下过程. 将getpid嵌入menuos 代码从github下载,步骤如下: 1. 增加一个函数,get ...

  7. bootloader启动代码init.s解析----IRQ中断处理函数

    bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...

  8. 20135202闫佳歆--week5 分析system_call中断处理过程--实验及总结

    week 5 实验:分析system_call中断处理过程 一.使用gdb跟踪分析一个系统调用内核函数(上周选择那一个系统调用)--getpid 复习视频: 如何实现? - 更新menu代码到最新版 ...

  9. 《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁

    20135311傅冬菁  原创作品 <Linux内核分析>MOOC课程 分析system_call中断处理过程 内容分析与总结: 系统调用在内核代码中的工作机制和初始化 系统调用在用户态中 ...

随机推荐

  1. Python_oldboy_自动化运维之路_全栈考试(五)

    1.执行 Python 脚本的两种方式 [root@localhost tmp]# cat a.py #!/usr/bin/python # -*- coding: UTF-8 -*- print & ...

  2. java 添加一组元素

    在java包中的Arrays和Collection类中都有很多实用方法,可以在一个Collection中添加一组元素,Array.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变 ...

  3. 整理一下关于Crypto加密的坑

    之前写接口一般不用加密(做了权限处理),最近公司要求接口加密,我开始了入坑之路 因为公司其他人用的AES和DES加密,我就在网上查了下关于这方面的使用方法. 首先安装Crypto pip instal ...

  4. hdu 1398 整数划分变形 (母函数)

    有1,4,9,16,25.....2^17这么多面值的硬币,问任意给定一个不大于300的正整数面额,用这些硬币来组成此面额总共有多少种组合种数 比如10全14 + 6个 14+4+1+19+1 求(1 ...

  5. C++拾遗——重新开始

    http://www.cnblogs.com/uniqueliu/category/307731.html

  6. Android Studio编译慢、卡死和狂占内存怎么破?

    https://www.zhihu.com/question/27953288 作者:知乎用户链接:https://www.zhihu.com/question/27953288/answer/118 ...

  7. HBase(八)HBase的协处理器

    一.协处理器简介 1. 起源 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hbase 中,统计数 ...

  8. CROC 2016 - Elimination Round (Rated Unofficial Edition) F - Cowslip Collections 数论 + 容斥

    F - Cowslip Collections http://codeforces.com/blog/entry/43868 这个题解讲的很好... #include<bits/stdc++.h ...

  9. redhat重置密码

    当忘记虚拟机密码时怎么办? 1.启动虚拟机,当虚拟机显示输入enter启动时输入e 2.再次用上下键选中你平时启动linux的那一项(类似于kernel /boot/vmlinuz-2.4.18-14 ...

  10. thinkphp条用函数与类库

    手册上说的很冗余,没看懂,下面简单的讲一下具体用法. 函数调用: lib公共函数库叫 common.php App/common/common.php 分组模块下的公共函数库叫 function.ph ...