没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1.
1.
1.
1. 中断服务程序的编译器支持
ARM 编译器提供为编写 FIQ 和 IRQ 中断服务程序而设置的关键字, 它们可以用于 C 函数
前,
所以可以 C 编写整个中断服务程序。下面就是一个在 Keil ARM 编译器环境下的典型例子:
void IRQ_Handler __irq
{
// Clear the source of the interrupt
// Additional statements
// Update the VIC by writing to VIC Vector Address Register
}
通过使用 __irq 关键字,编译器将为上面的函数添加下面的代码
( 1 ) 在函数入口处,工作寄存器(包括 ATPCS 的敏感(易被破坏的)寄存器)被压栈 ;
( 2 ) 在函数返回处,出栈上面保存的寄存器 ;
( 3 ) 使用 SUBS PC,R14,#4 从中断服务程序中返回。这条指令恢复了 PC 和 CPSR 。
注意:使用这个关键字的情况下, SPSR_irq 没有被保存。这就是使用关键字的方法处理中
断不能实现嵌套的一个原因。
2.
2.
2.
2. 使用关键字来处理中断嵌套时出现的问题
两个主要的原因都是跟 LR_irq 和 SPSR_irq 这两个寄存器有关。 如果一个中断服务程序重 新
使能中断, 调用一个子程序, 在子程序中发生了中断, 这时, 子程序的返回地址 (保存在
LR_irq
中)将被破坏。下面我们以一个例子来说明:
void IRQ_Handler __irq
{
//reenable intertupts
......
foo();
// 地址 A
}
当 PC 跳转到 IRQ_Handler 的时候(执行完 0x18 处的指令后) ,从 ISR 返回的地址已经写 入
LR_irq 了。假定它已经压栈 (SP_irq) 了。现在, foo ()函数被调用, LR_irq 的值被 foo 调 用
处的下一条指令的地址所覆盖。再进一步假设,在 foo 函数中运行的时候,一个更高优先 级
的中断发生了。 这时, LR_irq 又被返回到 foo 函数被中断的地方的地址所覆盖, 所以这就 破
坏了返回到 IRQ_Handler 的地址(即上面的函数中的 " 地址 A":
译者注) 。
( 当用 BL 指令调
用子函数的时候,进人子函数的时候没有保存 l r ,从子函数退出使用的是 mov pc lr 这样的
方法, 如果用这种方法调用子函数, 并且在子函数中发生了中断, 那么子函数的返回地址 就
被中断的返回地址覆盖了)还有,使用编译器关键字的时候, SPSR_irq 也不会被保存。一
个可重入的中断服务程序必须保存 IRQ 模式的状态信息,切换处理器模式,在转入嵌套 C
函数之前保存这个新处理器模式(从 IRQ 模式切换后的模式,即后面推荐使用的系统模式
:
译者注)的状态信息。 ARM 推荐编写可重入中断处理程序的时候选择转入系统模式。转入
系统模式的原因在于,一旦在系统模式中,活动的链接寄存器 就是 LR_sys ,这个寄存器将
在调用新的子函数之前被压栈。如果真的有更高优先级的中断打断了这个子函数,那么
LR_irq 的值将被改变(新的中断的返回地址:译者注) ,但是子函数的返回地址在 LR_sys
中安然无恙。
资源评论
- youyouyike2012-04-23分值偏高啊,百度文库里有
shelllink110
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功