S3C2410 中断程序的实现
- 格式:doc
- 大小:49.00 KB
- 文档页数:4
第十四章中断控制器概述S3C2410中断控制器接收56个中断源的中断请求。
中断源由如DMA控制器、UART、IIC等内部外设提供。
这些中断源中,UARTn和EINTn中断是以或逻辑输入到中断控制器的。
当从内部外设和外部中断请求引脚接收到多个中断请求时,经过中断仲裁后,中断控制器向ARM920T请求FIQ或者IRQ中断。
仲裁过程与硬件优先级有关,仲裁结果写入中断请求寄存器。
中断请求寄存器帮助用户确定哪个中断产生。
中断控制器操作程序状态寄存器PSR中的F位和I位如果PSR中的F位被置1,CPU不接收FIQ快速中断,同样如果I位PSR被置1,CPU不接收IRQ中断,因此中断控制器能够通过将PSR的F和I位和相应的INTMSK中的位清零来接收中断。
中断模式ARM920T有两种中断模式:FIQ和IRQ。
在中断请求时所有的中断源决定使用哪个模式。
中断请求寄存器S3C2410有两种中断请求寄存器:源请求寄存器(SRCPND)和中断请求寄存器(INTPND)。
这些请求寄存器揭示了一个中断是否正在请求。
当中断源请求中断服务时SRCPND寄存器中的相应位肯定被置1,然而,中断仲裁之后则只有INTPND寄存器的某1位被自动置1。
即使该中断被屏蔽,SRCPND寄存器中的相应位也会被置1,但是INTPND寄存器将不会改变。
当INTPND寄存器的某位被置1,且I位或者F位清零时中断服务即开始。
SRCPND和INTPND寄存器能够被读和写,因此服务函数必须通过向SRCPND和INTPND中相应位写入“1”来清除中断请求条件。
中断屏蔽寄存器INTMSK通过中断屏蔽寄存器的哪个屏蔽位被置1可以知道哪个中断被禁止。
如果INTMSK的某个屏蔽位为0,此中断将会被正常服务。
如果中断源产生了一个请求,SRCPND中的源请求位被置位,即使相应屏蔽位为1。
中断源下表列出了中断控制器支持的56个中断源中断优先级产生模块其中32个中断请求的优先级逻辑有由个rotation based仲裁位组成:6个一级仲裁位和一个二级位,如图14-2所示。
基于s3c2410的任务切换软中断级服务的实现1.关于软中断指令软件中断指令(SWI)可以产生一个软件中断异常,这为应用程序调用系统例程提供了一种机制。
语法:SWI {} SWI_number SWI执行后的寄存器变化:lr_svc = SWI指令后面的指令地址spsr_svc = cpsr pc = vectors + 0x08cpsr模式= SVC cpsr I = 1(屏蔽IRQ中断)处理器执行SWI指令时,设置程序计数器pc为向量表的0x08偏移处,同事强制切换处理器模式到SVC模式,以便操作系统例程可以在特权模式下被调用。
每个SWI指令有一个关联的SWI号(number),用于表示一个特定的功能调用或特性。
【例子】一个ARM工具箱中用于调试SWI的例子,是一个SWI号为0x123456的SWI 调用。
通常SWI指令是在用户模式下执行的。
SWI执行前:cpsr = nzcVqift_USER pc = 0x00008000 lr = 0x003fffff ;lr = 4 r0 = 0x12执行指令:0x00008000 SWI 0x123456SWI执行后:cpsr = nzcVqIft_SVC spsr = nzcVqift_USER pc = 0x00000008 lr = 0x00008004 r0 = 0x12SWI用于调用操作系统的例程,通常需要传递一些参数,这可以通过寄存器来完成。
在上面的例子中,r0 用于传递参数0x12,返回值也通过寄存器来传递。
处理软件中断调用的代码段称为中断处理程序(SWI Handler)。
中断处理程序通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的。
SWI号由下式决定:SWI_number = AND NOT《0xff000000》其中SWI instruction就是实际处理器执行的32位SWI指令SWI指令编码为:31 - 28 27 - 24 23 - 0 cond 1 1 1 1 immed24指令的二进制代码的bit23-bit0是24bit的立即数,即SWI指令的中断号,通过屏蔽高8bit 即可获得中断号。
S3C2410的中断异常处理机制发表日期:1/12/2007 2:33:44 PM 来源:《电子元器件应用》S3C2410的中断异常处理机制摘要:ARM处理器在嵌入式系统中的地位越来越重要,S3C2410作为ARM9微处理器家族中的一员,应用已十分广泛。
文中简述了ARM处理器的中断异常种类、响应和返回过程;重点讨论了S3C2410中断控制器的结构和处理机制,以及对IRQ中断的具体处理流程,最后给出了详细的参考代码。
关键词:ARM9微处理器;S3C2410;IRQ;中断异常处理王皓平一帆西安电子科技大学通信工程学院引言在ARM微处理器的编程,特别是系统初始化代码的编写中,通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发。
中断处理的编程实现需要深入了解ARM 内核和处理器本身的中断特征,以便设计一种快速简便的中断处理机制。
当异常中断发生时,若系统执行完当前指令,那么将跳转到相应的异常中断处理程序处执行。
而当异常中断处理程序执行完成后,程序将返回到发生中断的指令的下一条指令处执行。
在进入异常中断处理程序时,要保存被中断的程序的执行现场。
而从异常中断处理程序退出时,则要恢复被中断的程序的执行现场。
ARM 体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,可用来指定各异常中断及其处理程序的对应关系。
当一个异常出现以后,ARM 微处理器会执行以下几步操作:(1)保存处理器当前状态、中断屏蔽位以及各条件标志位;(2)设置当前程序状态寄存器CPSR 中相应的位;(3)将寄存器lr_mode设置成返回地址;(4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
在接收到中断请求以后,ARM处理器内核会自动执行以上四步,而程序计数器PC总是跳转到相应的固定地址。
从异常中断处理程序中返回下面的两个基本操作:一是恢复被屏蔽的程序的处理器状态;二是返回到发生异常中断的指令的下一条指令处继续执行。
实验6 S3C2410 PWM定时器中断实验一、实验目的掌握S3C2410 PWM定时器的工作原理和定时时间的计算方法,掌握和PWM定时器有关寄存器的使用方法,会用C语言对PWM定时器进行初始化编程,理解PWM定时器中断的触发过程,熟练掌握和中断相关寄存器的使用以及中断服务函数的编程方法。
二、实验内容UP-NETARM2410实验箱上两个LED数码管的控制地址为0x08000110和0x08000112。
借助于PWM定时计数器可实现简单的计数秒表。
由于只有两位数码管,秒表计到99秒后,从0开始重新计数。
同时三个发光二极管每隔一秒闪烁点亮。
三、PWM定时器相关知识S3C2410A具有5个16位的定时器,其中定时器0~3具有PWM波发生功能,即可以输出PWM波,定时器4没有外部输出。
定时器工作频率为PCLK/(预分频值+1)/分频值,在下面的工程中,将使用定时器1,并设置其工作频率为20 kHz,即为:48MHz/(149+1)/16 = 20 kHz所以定时时间为:0x4E20* 20 kHz=1S定时器1的初始化方法如下:首先,设置TCFG0(定时器配置寄存器0,地址为0x51000000)的值为0x95,即定时器1的预分频值为0x95,十进制数为149。
注意:定时器0和1共用同一个预分频值。
然后,设置TCFG1(定时器配置寄存器1,地址为0x51000004)的值为0x30,即定时器1的分频值为16。
其次,设置TCNTB1(定时器1计数寄存器,地址为0x51000018)和TCMPB1(定时器1比较寄存器,地址为0x5100001C)的值为0x4E20和0x4000。
这里没有用到TCMPB1,当TCNTB1减计数到0后,将触发定时器1中断再次,设置TCON(定时器控制寄存器,地址为0x51000008)的值为0xA00,即刷新TCNB1和TCMPB1的值。
最后,设置TCON的值为0x900,启动定时器1。
ARM Linux中断分析(以s3c2410为例)/space.php?uid=23089249&do=blog&id=34480首先,当然是进入start_kernel,调用setup_arch进行平台体系(处理器芯片)相关的初始化,然后复制中断向量表到内存中并对irq进行初始化/* init/main.c */asmlinkage void __init start_kernel(void){……setup_arch(&command_line);……trap_init();……init_IRQ();……}trap_init复制中断向量表到内存地址CONFIG_VECTORS_BASE/* arch/arm/kernel/traps.c */void __init trap_init(void){unsigned long vectors = CONFIG_VECTORS_BASE;extern char __stubs_start[], __stubs_end[];extern char __vectors_start[], __vectors_end[];extern char __kuser_helper_start[], __kuser_helper_end[];int kuser_sz = __kuser_helper_end - __kuser_helper_start;/** Copy the vectors, stubs and kuser helpers (in entry-armv.S)* into the vector page, mapped at 0xffff0000, and ensure these* are visible to the instruction stream.*/memcpy((void*)vectors, __vectors_start, __vectors_end -__vectors_start);memcpy((void*)vectors + 0x200, __stubs_start, __stubs_end -__stubs_start);memcpy((void*)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);/** Copy signal return handlers into the vector page, and* set sigreturn to be a pointer to these.*/memcpy((void*)KERN_SIGRETURN_CODE, sigreturn_codes,sizeof(sigreturn_codes));flush_icache_range(vectors, vectors + PAGE_SIZE);modify_domain(DOMAIN_USER, DOMAIN_CLIENT);}init_IRQ对irq进行初始化时,又调用了init_arch_irq对于具体平台体系的中断进行初始化。
S3C2410 中断程序的实现
在此要注意的是区别中断向量表和异常向量表。
中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。
以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。
定义中断向量表的物理地址:
代码
将中断处理程序入口地址放入中断向量表:
代码
定义中断处理程序:
代码
定义异常向量表:
代码
定义异常处理函数:
代码
异常处理宏HANDLER的定义:代码
定义IRQ 中断处理宏IRQHandle:
代码
申明IRQ 异常的服务程序为:IsrIRQ,即,发生IRQ 异常时,执行“b HandlerIRQ”即是
运行IsrIRQ代码:
代码
IRQ 异常处理程序:
代码
由上可以知道,当一个IRQ 中断发生时,CPU将从0X18(IRQ 异常入口地址)取指执行,在这一步PC 的跳转是有硬件实现的。
在入口0x18 地址处放的是一条跳转指令,这条指令将跳到IRQ 异常处理程序运行,IRQ 异常处理程序主要是根据中断源查找中断向量表。
获得中断入口地址后,接着CPU 跳转中断处理程序运行。
在嵌入式系统中异常向量表和中断向量表都是存于FLASH起始的一段空间中。
而异常处理和中断处理程序都是运行在RAM中的。