第六讲 中断控制器(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所有外围接口的中断是挂到irq或fiq上的 用到什么中断你使能什么中断 总开关在:CPSR寄存器的I位和F位 次开关在INTMASK寄存器 还有接口中与中断相关的寄存器还要注意设
置!
TM
5
5
6.1.2 中断分发与处理
思路:先登记(pending)--》 按优先级选中(执行的)--》 完了再顺序执行后面的--》
ldr
r8, [r8]
str
r8, [sp,#8]
ldmfd
sp!,{r8-r9,pc}
TM
12
12
6.1.2 中断分发与处理
假如我们想挂载isr_uart中断服务程序,该 怎么做?
*(某一地址)= (unsigned int)(void*) isr_uart; ????isr_uart就是地址。
str
r0, [sp,#4]; r0的值放到 [sp+4]
ldmfd
sp!,{r0,pc} ; [sp]->r0, sp =sp+4; [sp]->pc; sp = sp+4;
………………..
HandleIRQ
#
4; 0x33ffff18
TM
10
10
6.1.2 中断分发与处理
HandleIRQ = 0x33ffff18; HandleIRQ里面放的是什么? 假设*(HandleIRQ) = (void *) isr_IRQ; 为什么会跳到isr_IRQ函数中?
20
20
6.1.2 中断分发与处理
保存现场--》关中断--》处理事件--》打开中 断--》恢复现场
讲完保存现场、恢复现场,下面讨论打开和 关中断
一般rINTMASK寄存器全部Mask 掉
TM
21
21
6.1.2 中断分发与处理
处理事件开头或结尾往往要干一件事情,即 清中断;
对于s3c2440来说,主要是清rINTSRC和 rINTPND寄存器相应位
TM
43
43
因此在嵌入式程序设计中,经常可以可以看 到寄存器用如下方式进行定义:
TM
3
3
6.1.1中断入口
所有ARM都一样,主要有七个
复位:
reset
未定义指令:
undef
软件中断:
swi
指令预取中止: pabort
数据预取中止: dabort
普通中断:
irq
快速中断:
fiq
0x0 0x4 0x8 0xc 0x10 0x18 0x1c
TM
4
4
6.1.2 中断分发和处理
TM
37
37
。例如~(0101 1001) = 1010 0110。在程序 中主要用于将操作数的某位或某些位取反, 为其他操作提供数据准备。
TM
38
38
8.2.5 移位操作
移位操作分为左移操作与右移操作。左移运 算符“<<”实现将“<<”左边的操作数的各个 二进制位向左移动“<<”右边操作数所指定 的位数,高位丢弃,低位补0。其值相当于乘 以:2“左移位数”次方。
TM
34
34
应用举例:
通过3次异或操作将寄存器rPDATAE中的内 容与变量tmp的值进行交换。
TM
35
35
rPDATAE = rPDATAE ^ tmp tmp = tmp ^ rPDATAE rPDATAE = rPDATAE ^ tmp
TM
36
36
8.2.4 取反操作
取反运算符“~”实现对参与运算的操作数对 应的各个二进制位按位求反。取反运算符 “~”具有右结合性。所有1变为0,0变为1
TM
6
6
6.1.2 中断分发与处理
登记:rSRCPND寄存器中相关位置位 优先级排序规则:设置寄存器或默认的 最高的优先级的,rINTPND置位,
rINTOFFSET置位 产生IRQ或IRQ中断
TM
7
7
6.1.2 中断分发与处理
以IRQ为例,IRQ中断服务程序该干什么?
TM
8
8
6.1.2 中断分发与处理
TM
30
30
8.2.2按位或操作
按位或操作运算符“|”是把参与运算的两个 操作数对应的各个二进制位进行按位相或。 对应的两个二进制位中只要有一个为1,结果 就为1,当两个对应的二进制位都为0时,结 果位为0。参与运算的两个操作数均以补码形 式出现。
TM
31
31
例如7 | 3,7的补码为0000 0111,3的补码 为0000 0011,结果为0000 0111。按位与操 作可以实现将特定位的置位操作,也可以用 于提取出某数的指定位。
对于irq来说,主要包括cpsr, r0-r8, r9-r12, r14等
当中断发生时,跳转到相应中断地址之前, 如0x18之前,硬件会将cpsr->spsr_irq, pc>lr;lr到底是什么呢?
TM
18
18
6.1.2 中断分发与处理
保存寄存器,spsr_irq, lr_irq是irq自己的物 理寄存器;
TM
39
39
右移运算符“>>”实现将“>>”左边的操作数 的各个二进制位向右移动“<<”右边操作数 所指定的位数。对于空位的补齐方式,无符 号数与有符号数是有区别的。对无符号数进 行右移时,低位丢弃,高位用0补齐,其值相 当于除以:2“右移位数”次方
TM
40
40
8.3 嵌入式C程序设计中的几点说明
首先跳到0x18, 即硬件将程序计数器(R15或 PC)设置为0x18, 开始从0x18这里取指令。
大家想下看,0x18这里放一条什么指令? 我们的start.s中是怎么做的?
TM
9
9
6.1.2 中断分发与处理
首先0x18 b HandlerIRQ;
HandlerIRQ HANDLER HandleIRQ;
声明时都要加以注释 ;
TM
25
25
(5)对于宏定义、数据结构声明,如果其命 名不是充分自注释的,也要加以注释。
(6)如果注释单独占用一行,与其被注释的 内容进行相同的缩进方式,一般将注释与其 上面的代码用空行隔开
(7)程序代码修改时,其注释也要及时修改 ,一定要保证代码与注释保持一致。
TM
26
26
命名规则示例:
/***************************************************************** 文件名:Test_LED.c 版本号:v1.0 创建日期:2008-7-1 作者:FE2008 硬件描述:S3C2410 GPF4 连接 LED1,S3C2410 GPF5 连接 LED2 主要函数描述:TestLED1( )函数实现 LED1 进行闪烁;TestLED2( )函数实现 LED2
rINTOFFSET只有一位置位,因此不同的偏 移对应不同的中断,只要在所谓不同中断所 谓的(某一地址)中放入isr函数地址,相当 于就挂载上去了。
TM
14
14
6.1.2 中断分发与处理
分发完了,处理即中断服务程序要干什么工 作?
保存现场--》关中断--》处理事件--》打开中 断--》恢复现场。
TM
28
28
8.2.1 按位与操作
按位与运算符“&”是把参与运算的两个操作 数所对应的各个二进制位进行按位相与。只 有当对应的两个二进制位全为1时,结果才为 1,否则为0。参与运算的两个操作数以补码 形式出现。
TM
29
29
例如7 & 3,补码分别为0000 0111与0000 0011 按位与运算后结果为0000 0011等于十 进制的3。按位与操作可以实现将特定的位清 零,也可以用于提取出某数的指定位。
TM
15
15
6.1.2 中断分发与处理
为什么要保存现场? 怎么保存现场? 怎么还原现场?
TM
16
16
6.1.2 中断分发与处理
中断只不过处理一下紧急任务而已; 原来的事情还是要做的 所以原来的状态寄存器、关键信息要保存的 等中断返回时在还原回去
TM
17
17
6.1.2 中断分发与处理
其他的诸如r0-r8等,你用到哪个需要保存哪 个
需要保存到r13_irq(sp)空间中,stmfd sp!, {r0-r2,lr};
TM
19
19
6.1.2 中断分发与处理
还原现场: ldmfd sp!, {r0-r2, lr} subs pc, lr, #0x4 ; cpsr 怎么恢复的?
TM
等价于:
HandlerIRQ
sub
sp,sp,#4 ; sp = sp - 4
stmቤተ መጻሕፍቲ ባይዱd
sp!, {r0} ; sp = sp – 4; [sp] = r0;
ldr
r0, = HandleIRQ; r0 = HandleIRQ这个标号的地址
ldr
r0,[r0] ; [r0] 的值赋给 r0, [HandleIRQ] 存放的值->r0
第六讲 中断控制器及编程
当有事件来临时,必须中断当前cpu运算 来响应突发事件!
当等待一个事件时,是一直查询还是事 件来了告诉我一声?
中断是MCU的核心,因为几十个中断要 处理,还要做得很好!
TM
1
内容提要
6.1 6.2 6.3
中断的基本概念 中断控制器 中断实例
TM
2
2
6.1 基本概念
ARM中断的入口在哪里?(中断向量表) S3C2440有60个中断源,怎么分发和处理? 当有多个中断同时发生时怎么办?
8.3.1 volatile限制符 8.3.2 地址强制转换与多级指针 8.3.3预处理的使用
TM
41
41
8.3.1 volatile限制符
volatile的本意为 “暂态的”或.“易变的”, 该说明符起到抑制编译器优化的作用。
如果在声明时用“volatile”关键进行修饰, 遇到这个关键字声明的变量,编译器对访问 该变量的代码就不再进行优化,从而可以提 供特殊地址的稳定访问,特别是存储器映像 (memory-mapped)外设端口类型。
若不清中断会发生什么?
TM
22
22
6.2 中断控制器
TM
23
23
8.1.2 命名规则
(1)标识符的名称要简明,能够表达出确切的含义,可 以使用完整的单词或通常可以理解的缩写。
(2)如果在命名中使用特殊约定或缩写,则要进行 注释说明。
(3)对于变量命名,一般不取单个字符 ,例如i、j、 k...
进行闪烁。 修改日志:2008-8-1 by qiutie 将 LED1 的闪烁间隔时间改为 100ms。
**************************************************************/
TM
27
27
8.2 嵌入式C程序设计中的位运算
在嵌入式程序设计中,位操作是最常用的运 算之一,因为在很多情况下要对寄存器中的 某位或某个管脚进行操作,这些都需要用位 操作来完成。
TM
42
42
8.3.2 地址强制转换与多级指针
地址强制转换
在C程序设计中,绝对地址0x0FA00只是被 当成一个整型数,如果要把它当成一个地 址来使用就需要进行地址强制转换。
如定义一个整形指针int *p,然后把绝对地 址0x0FA00转换成一个整形的地址值赋给 这个整形指针,p = (int *)0x0FA00。
TM
32
32
8.2.3 按位异或操作
按位异或运算符“^”是将参与运算的两个操 作数对应的各个二进制位进行相异或,当对 应的两个二进制位相异时,结果位为1,相同 时为0。参与运算的两个操作数均以补码形式 出现。
TM
33
33
例如7 ^ 3,7的补码为0000 0111,3的补码 为0000 0011,结果为0000 0100。
(4)函数名一般以大写字母开头;所有常量名字母 统一用大写。
TM
24
24
8.1.3 注释说明
注释有助于程序员理解程序的整体结构,也便于以后 程序代码的维护与升级。常用的规则如下:
(1)注释语言必须准确、简洁且容易理解; (2)程序代码源文件头部应进行注释说明 ; (3)函数头部应进行注释; (4)程序中所用到的特定含义的常量、变量,在
某一地址我事先定义好,看uart中断在 rINTOFFSET第几位?若是第n位,则等
于 开始地址+n<<2;
TM
13
13
6.1.2 中断分发与处理
已经将isr_uart放到(某一地址)中了
那我只需要当发生uart中断(rINTOFFSET 这一位置位),从这个(某一地址)中取到 isr_uart,跳转到这里便可。
TM
11
11
6.1.2 中断分发与处理
start.s 中的isr_IRQ:
IsrIRQ
sub
sp, sp, #4
stmfd
sp!, {r8-r9}
ldr
r9, =INTOFFSET
ldr
r9, [r9]
ldr
r8, =HandleEINT0
add
r8, r8,r9,lsl #2
;ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)//user add.
相关文档
最新文档