S3C2440的中断的那些事儿(一) 汇编的讲解

发布时间:2023-09-05  

1. ARM的中断模式有7种:

                                          1. 用户模式: 用于平时的程序运行

                                          2. 快速中断模式: 用于高速数据传输或者通道处理, 此模式的优先级最高 最容易被触发 32个中断只能有一个快速中断触发

                                          3. 中断模式:用于普通的中断模式

                                          4. 管理模式:操作系统使用的保护模式

                                          5. 数据访问终止模式: 当数据或指令与读取终止时候进入此模式

                                          6. 系统模式: 运行具有特权的操作系统任务

                                          7. 未定义指令终止模式:当未定义的指令执行时进入该模式 可用于支持硬件仿真。

 

2.  首先是看PSR (program status register)

     如果此寄存器的F-bit 设置成1 则arm不会再接受快速中断的请求。另外如果是I-bit 设置成了1 则CPU将会关闭所有的中断。 

 

上面的这个图解释了除了LCD之外的中断的模式:

SRCPND 这个寄存器可以查询到我们 那个地方发生了中断

SUBSRCPND 这个寄存器是用来管理串口等11个次一级重要的中断的

SUBMASK 是用来屏蔽SUBSRCPND所提供的中断

MASK用来屏蔽SRCPND寄存器上面的中断

MODE:设置成1 的时候可以把此寄存器设置成快速中断模式

 

 

Priority 如下图:

 

此图说明优先级是由这六个仲裁器去抉择的。寄存器位ARB_Mode和ARB_SEL的组合可以实现优先级的转换 情形如下所示:

 

 INTPND 寄存器 是记录哪一个中断拥有最高的优先级 且此寄存器只能有一位置位为1

下面来分析一下代码:


 1 @******************************************************************************

 2 @ File:head.S

 3 @ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数

 4 @******************************************************************************       

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 @******************************************************************************       

11 @ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

12 @******************************************************************************       

13     b   Reset

14 

15 @ 0x04: 未定义指令中止模式的向量地址

16 HandleUndef:

17     b   HandleUndef 

18  

19 @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

20 HandleSWI:

21     b   HandleSWI

22 

23 @ 0x0c: 指令预取终止导致的异常的向量地址

24 HandlePrefetchAbort:

25     b   HandlePrefetchAbort

26 

27 @ 0x10: 数据访问终止导致的异常的向量地址

28 HandleDataAbort:

29     b   HandleDataAbort

30 

31 @ 0x14: 保留

32 HandleNotUsed:

33     b   HandleNotUsed

34 

35 @ 0x18: 中断模式的向量地址

36     b   HandleIRQ

37 

38 @ 0x1c: 快中断模式的向量地址

39 HandleFIQ:

40     b   HandleFIQ

41 

42 Reset:                  

43     ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

44     bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

45     

46     msr cpsr_c, #0xd2       @ 进入中断模式

47     ldr sp, =3072           @ 设置中断模式栈指针

48 

49     msr cpsr_c, #0xd3       @ 进入管理模式

50     ldr sp, =4096           @ 设置管理模式栈指针,

51                             @ 其实复位之后,CPU就处于管理模式,

52                             @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略

53 

54     bl  init_led            @ 初始化LED的GPIO管脚

55     bl  init_irq            @ 调用中断初始化函数,在init.c中

56     msr cpsr_c, #0x53       @ 设置I-bit=0,开IRQ中断

57     

58     ldr lr, =halt_loop      @ 设置返回地址

59     ldr pc, =main           @ 调用main函数

60 halt_loop:

61     b   halt_loop

62 

63 HandleIRQ:

64     sub lr, lr, #4                  @ 计算返回地址

65     stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

66                                     @ 注意,此时的sp是中断模式的sp

67                                     @ 初始值是上面设置的3072

68     

69     ldr lr, =int_return             @ 设置调用ISR即EINT_Handle函数后的返回地址  

70     ldr pc, =EINT_Handle            @ 调用中断服务函数,在interrupt.c中

71 int_return:

72     ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr

73     


一些注解:


第46行: 


msr cpsr_c, #0xd2


msr 的意思是把一个立即数存储到一个PSR(program status register)那么这个寄存器是cpsr_c 又被称作寄存器R16是记录状态的寄存器(请参见2440datasheet P72)




这个就是R16寄存器 其中设置中断的时候需要吧第七位和第六位都需要置成1 这样子一开始先关闭中断和快速中断。


后面五位设置成中断模式(参见datasheet P78)


 


第47行:


 ldr sp, =3072           @ 设置中断模式栈指针

这里面的其实就是给中断分配一个内存区 这个数字可以“随意”取只要能让前面的程序有足够的内存就好。

第56行:

  msr cpsr_c, #0x53 : 这里面是开总中断 在管理模式下 


第64行:

 sub lr, lr, #4                  @ 计算返回地址 这里是ARM自己的特定值记住便好

第65行:

stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器 这里面stmdb(stm相当于Push and DB (Decrement Before))Ex: STMFD    sp!, {r0-r5}  ; Push onto a Full Descending Stack

这里的意思是 把R0~R12还有lr(返回值的内容)压入栈

 ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr 第72行:LDM(相当于POP and ia Increment After ) 这句话表示把寄存器还原

Saved Process Status Registers (SPSRs)

Current Program Status Register (CPSR)


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    具有一一对应的关系,因此它继承了机器语言直接、快速、高效的特点,是一种底层语言。但是汇编语言的劣势也十分明显,如对于编写较大的程序需要考虑诸多硬件存储器的分配以及中断程序的处理等非常细节的问题,否则......
    调试按钮 3)打开汇编语言窗口 打开存储器窗口 4)我们观察下中断程序 C语言 汇编语言格式和存储代码对应的空间 5)理解一个概念 单片机程序存储空间就是用硅晶体组成的一个个电路,也就是一组组开关。然后......
    endasm   }   浅谈如何用汇编编写模块化程序   一、主程序的书写      如上图就是结构化编程的截图,里面的.asm即是汇编文件的扩展名,C语言用的是.c 。在汇编语言中,头文......
    寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。再者,汇编语言指令是机器指令的一种符号表示,而不同类型的 CPU 有不同的机器指令系统,也就有不同的汇编语言 ,所以......
    的 data xdata bit sbit一类的,还有一些中断程序写法 void int() interrput 1一类的。 2、单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译......
    中变量名代替寄存器 {     MOV var,x     ADD y,var,x/y } 内联汇编语言中的寄存器名被编译器视为 C 或 C++语言中的变量,所以内联汇编......
    能反映出计算机的实际运行情况。 2.汇编语言编程比高级语言困难。因为汇编语言是面向计算的,程序设计人员必须对计 算机有相当深入的了解,才能使用汇编语言编制程序。 3.汇编语言能直接和存储器及接口电路打交道,也能申请中断......
    以不通的外设电路实现不通的功能需求。单片机的编程可以通过汇编语言和C语言来实现。1汇编编程的特点汇编是一种更接近于硬件底层的低级语言。硬件在编程时总线和地址非常重要,在汇编语言中,一般......
    模块来表达逻辑运算关系。盒子左边是逻辑运算的输入变量,右边是输出变量,信号从左向右流动。5、 指令表:(西门子称为语句表)由若干条指令组成的程序称为指令表。PLC的指令是一种类似于微机汇编语言中......
    仿真,进行一些最基本的练习,熟悉汇编语言,51单片机状态变化,c语言等,验证自己在51单片机架构学习中的一些理解,代码实现的理解。学习到一定的程度还是需要一块51开发板进行开发练习的,毕竟......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>