写在前面(太感谢原作者了....本人转于:http://blog.csdn.net/liukun321)
作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发,但必须保留作者署名,必须保证全文完整转载,包括完整的版权声明。
由于作者水平有限,因此不能保证文章内容准确无误,请批判阅读。如果你发现任何错误或对文章内容有任何建议,欢迎你与我联系:
Email: caiallen@tom.com
--------------------------------------------------------------------------------
最近因为公司项目忙,好久没更新这里了。也因为项目,才发现原来ARM 的bootloader默认是不支持中断嵌套的,所以必须得自己实现。同时也发现,44b0有向量中断和非向量中断之分,而2410是没有向量中断的。也许这样说并不准确。因为对2410来说,它有:
;44b0的中断向量表
ResetEntry
VECTOR_BRANCH
;*****************************************************************************
;**
;** IsrIRQ
;**
;真正的非向量IRQ中断入口
;*****************************************************************************
IsrIRQ
;=============================================================================
;(1)在中断模式下保护被中断的模式的环境
;1-1 lr-4压栈,lr-4才是被中断的模式的PC返回地址
;=============================================================================
;=============================================================================
;1-2 再压入lr,仅作占位,该值在被中断的模式的lr的寄出器中
;=============================================================================
;=============================================================================
;1-3 保存R0~R12的值。这样在后面的算法里可以使用R0~R12
;=============================================================================
;=============================================================================
;1-4 保存SPSR
;=============================================================================
;=============================================================================
;1-5 恢复IRQ模式下的堆栈指针,指向被中断前的位置
;=============================================================================
;=============================================================================
;(2)切换到SVC模式,利用SVC的堆栈保存现场,并在此模式下处理IRQ中断
;=============================================================================
;=============================================================================
;(3)拷贝现场
;=============================================================================
0
;=============================================================================
;(4) 设置中断入口
;=============================================================================
;=============================================================================
;(5) 中断返回后,在恢复现场前,屏蔽所有IRQ中断
;=============================================================================
;=============================================================================
;(6) 恢复现场
;=============================================================================
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
修改为:
;=============================================================================
;(1)在中断模式下保护被中断的模式的环境
;1-1 lr-4压栈,lr-4才是被中断的模式的PC返回地址
;=============================================================================
;=============================================================================
;1-2 再压入lr,仅作占位,该值在被中断的模式的lr的寄出器中
;=============================================================================
;=============================================================================
;1-3 保存R0~R12的值。这样在后面的算法里可以使用R0~R12
;=============================================================================
;=============================================================================
;1-4 保存SPSR
;=============================================================================
;=============================================================================
;1-5 恢复IRQ模式下的堆栈指针,指向被中断前的位置
;=============================================================================
;=============================================================================
;(2)切换到SVC模式,利用SVC的堆栈保存现场,并在此模式下处理IRQ中断
;=============================================================================
;=============================================================================
;(3)拷贝现场
;=============================================================================
0
;=============================================================================
;(4) 设置中断入口
;=============================================================================
;=============================================================================
;(5) 中断返回后,在恢复现场前,屏蔽所有IRQ中断
;=============================================================================
;=============================================================================
;(6) 恢复现场
;=============================================================================
注意:当使用上面的中断嵌套处理时,C语言中中断服务程序不能再使用__irq关键字,因为上面已经作了现场环境的保护处理,而__irq的作用也是自动作现场环境处理,而且它的处理是不支持中断嵌套的。