您的位置 首页 芯闻

44B0中止剖析(一)

首先ARM芯片要中断设置要是能中断向量,然后当有IRQ中断来之后,CPU自动的到0x18地址处取指。0x18处的指令呢是CPU根据中断源算好的(比

首要ARM芯片要中止设置要是能中止向量,然后当有IRQ 中止来之后,CPU主动的到0x18地址处取指。0x18处的指令呢是CPU 依据中止源算好的(比方:中止 EINT4567 来了,那么 0x18 处的指令便是跳转到地址 0x30 处)。然后就履行“ldr pc,=HandlerEINT4567”这条指令。这条指令的履行成果便是跳转到 “HandlerEINT4567 HANDLER HandleEINT4567”处履行。这条是宏指令,你可以看一下宏界说。履行成果便是跳转到HandleEINT4567 处履行。

那么 HandleEINT4567 处又是什么指令呢?这就要联络 44b.h 文件的#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74) ) 定 义 看 了。

HandleEINT4567 处的地址便是“_ISR_STARTADDRESS+0x74”。到此还不知道这个地址对应的指令是什么。 这时分就要去看Target.c文件的中止初始化了,其间pISR_EINT4567= (unsigned) OSEINT4567ISR;这条句子就解说了中止去向何处。 OSEINT4567ISR 便是在OS_CPU_A.s 里边界说的中止处理程序了。

一、 关于44B0中止体系

44B0 中止体系中有两张中止搬运表,经过二重搬运才跳到中止处理程序。第一张中止向量表由硬件决议,所在区域为ROM(flash),地址空间从0X00开端,其间0X00-0X1C为反常向量进口地址,0X20-0XC0为中止向量进口地址。另一张中止向量表在RAM 中,可以随意改,其方位在程序衔接后才定。

二、 怎么从第一张中止向量表跳到第二张中止向量表

因为 RAM 放在地址空间的高端(间隔中止向量超过了 32M),故在第一张中止向量表对应方位上写上ldr PC,# interrupt_service 如:ldr PC,=HandlerEINT4567

三、怎么在发动程序中设置反常向量,中止向量表

怎么把 C 语言中的一个中止函数对应到汇编的中止向量表中,示意图及举例如下:

把C语言中的一个中止函数对应到汇编的中止向量表中:pISR_EINT4567 = (int)Eint4567Isr;其实反常向量便是中止向量,ARM7的内核实际上只要8个(1个保存)反常向量,关于很多的中止源,ARM7 的内核是经过 IRQ、FRQ 的软件查询中止状况寄存器的位来取得ISR的开端地址。而44B0为了战胜这种办法所带来的中止推迟,就加入了更多的中止向量表(0x20到0xc0),要运用这种办法,有必要在中止操控寄存器中设置每个中止源的办法为IRQ 办法,且运用向量中止。

S3C44B0X 的中止操控器有30 个中止源。S3C44B0X 支撑新的中止处理方式称为(vectored interrupt mode),在多个中段恳求发生时,由硬件优先级逻辑确认应该有哪个中止得到服务,一起硬件逻辑使中止相量表的跳转指令加载到(0X18或0X1C)方位,在该方位履行跳转指令使程序跳到相应的中止服务线程,因而相对与传统的ARM 的软件办法可以大大削减中止进入延时。有两种类型的中止方式,FIQ (快速中止)和IRQ.一切的中止源在中止恳求时应该确认运用的中止方式。在网络上广为流传的44b0开发板例程中,大部分运用的都是IRQ 中止方式(请查阅寄存器rINTCON)。

一般来讲,运用 44b0 开 发板进行调试时, 无需更改44b.h,44blib.h, def.h, option.h, 44binit.s, 44blib.c, 44blib_a.s, memcfg.s, option.s 等程序,乃至无需看懂,即可编程运用 44b0 开发板。如前所述,硬件逻辑使中止向量表的跳转指令加载到(0X18 或 0X1C)方位,在该方位履行跳转指令使程序跳到相应的中止服务线程,用户只需界说相应的中止服务程序即可。中止向量表的界说如下:

/* ISR */
#define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+
0x0))
#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))
#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))
void __irq Mycat(void);;;

明显,至此可以根本了解 44b0 的中止,是怎么与程序中的中止服务子程序联络起来的了。中止的硬件逻辑,将检测到的中止,以某种办法指向中止服务程序的地址,该地址在头文件中以宏界说的方式呈现。用户在自己的程序中,将中止服务子程序的地址交给该指针,然后将其联络起来。

ARM7TDMI 在矢量方式下,当从 0X18 地址处取指令时分,中止操控器会在数据总线上加载分支指令,这些分支指令使程序计数器可以对应到每一个中止源的向量地址。这些跳转到每一个中止源向量地址的分支指令由中止操控器发生。

例如:假定 EINT0 是 IRQ 中止,EINT0 的向量地址为:0X20(见向量表),那么中止操控器有必要发生0X18—0X20的分支指令。

中止操控器发生的机器码为: 0XEA000000。在各个中止源对应的中止向量地址中,存放着跳转到相应中止服务程序的程序代码。在相应向量地址处分支指令的机器代码如下核算: 矢量中止方式的机器指令代码=0XEA000000+((<方针地址>-<向量地址>-0X8)>>2) ,机器代码一般由反汇编后主动发生。

结合这些,再看看程序中的代码。在无矢量中止方式,经过剖析IISPR/FISPR 寄存器,IRQ/FIQ 处理器将移动PC到相应的ISR。HandleXXX 地址包括每个呼应的ISR程序的开端地址。(见 44binit.S 文件) 编译器它主动有设置的(初始化的伪编译宏), |Image$$RO$$Limit|:表明RO 区末地址后边的地址,即RW数据源的开端地址 |Image$$RW$$Base|:RW 区在 RAM 里的履行区开端地址,也便是编译器选项RW_Base指定的地址 |Image$$ZI$$Base|:ZI 区在RAM 里边的开端地址 |Image$$ZI$$Limit|:ZI 区在RAM 里边的完毕地址后边的一个地址 程序先把 ROM 里|Image$$RO$$Limt|开端的 RW 初始数据拷贝到 RAM 里边|Image$$RW$$Base|开端的地址,当RAM这边的方针地址抵达|Image$$ZI$$Base|后就表明RW区的完毕和ZI区的开端,接下去就对这片ZI区进行清零操作,直到遇到完毕地址|Image$$ZI$$Limit|。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/254267.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部