Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246493
  • 博文数量: 28
  • 博客积分: 1080
  • 博客等级: 少尉
  • 技术积分: 327
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-28 21:21
文章分类
文章存档

2011年(14)

2010年(14)

我的朋友

分类: 嵌入式

2010-06-01 16:49:59

1.异常处理和中断处理的异同:
  不同点:
  (1)都需要保存现场和恢复现场;
  (2)都包括模式的切换;
  (3)都必须进行相应模式的堆栈SP初始化。
  相同点:
  (1)异常是ARM核的行为,中断处理是SoC的行为。
  (2)中断要设置中断控制器的寄存器,异常不用关心。
  (3)中断要设置CPSR的I位为允许,异常不用管。
  (4)中断处理程序中,ISR需要对PND寄存器进行清除操作,为了不重复响应中断,异常不用管。
  (5)中断需要设置中断源的工作模式,异常不用管。
  (6)SWI异常跳转到0x8,IRQ中断跳转到0x18。
  (7)中断asm_handler中,需要对lr寄存器进行 减4 操作。swi异常处理没有。
2.中断处理的初始化工作包括哪些?
  (0)在汇编中,需要初始化堆栈。(包括SVC模式和IRQ模式)
  (1)设置中断源的中断方式(下降沿还是上升沿触发中断?EXTINT0)
  (2)设置中断源的请求为 使能(有效)(IRQ enable -- GPIO控制器)
  (3)设置中断源的中断模式为 IRQ 还是 FIQ (INTMOD 中断模式寄存器)
  (4)设置中断屏蔽寄存器,设置屏蔽位(INTMSK 中断屏蔽寄存器)
  (5)设置PND寄存器,所有bit位清0 (PND寄存器)。
  (6)打开CPSR寄存器的I位,ARM内核允许中断。
  (7)在0x18处设置好相应的跳转指令,以便中断发生后能进入正确的handler入口。(C语言在前面要加_irq,如_irq void handler(void)。)

3.akae2440板子的GPIO中断驱动有何特殊之处?
  (1)首先设置GPIO的控制器,设置相关位为输入输出。(把GPB8、GPB9设置为输出)
  (2)其次设置GPB8=0,GPB9=1;
  (3)再次设置为下降沿(1到0跳变)触发中断;
  (4)最后使能外部中断,External INT0。
4.s3c2440中断控制器中的PND寄存器有何特殊之处?
  (1)PND寄存器和3个寄存器相关,SRCPND,INTPND,INTMSK;
  (2)如果有1个中断到来,SRCPND相应位被置1,通过判断INTMSK屏蔽寄存器相应的位有没有被位置,1表示屏蔽,0表示允许能过。如果被屏蔽,则INTPND不被置位,SRCPND相应位仍被置1,如果没有屏蔽,则INTPND被置1。
  (3)PND寄存器属于状态类的寄存器,但它又是可以写入的,所以它的操作原则和其它寄存器不一样,表现为“写1清0”,其他操作无影响。
  (4)SRCPND要先清除,然后清除INTPND,这是因为SRCPND是根,INTPND是草,清除的时候,表现为要“斩草除根”,要先除根SRCPND。
  (5)如果2个PND不清除,则重复不断响应中断,如果不及时清除,则会可能丢失处理过程中发生的同类中断。如果不按顺序清除,则表现为多1次中断。
阅读(1645) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~