首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM 异常处理过程讲解(3)

ARM 异常处理过程讲解(3)

uC/OS-II的官网移植中采用通用异常处理函数的方式实现异常的处理,下面我们来分析其中的部分代码:
首先是处理器部分的移植,包括异常向量、异常的ID号,存储异常处理函数地址的地址等:
/*ARM的异常ID,支持7种类型的异常,每一种异常都存在一个ID*/
#define  OS_CPU_ARM_EXCEPT_RESET        0x00
#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR 0x01
#define  OS_CPU_ARM_EXCEPT_SWI          0x02
#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT 0x03
#define  OS_CPU_ARM_EXCEPT_DATA_ABORT     0x04
#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT     0x05
#define  OS_CPU_ARM_EXCEPT_IRQ               0x06
#define  OS_CPU_ARM_EXCEPT_FIQ               0x07
#define  OS_CPU_ARM_EXCEPT_NBR              0x08
/*异常向量地址*/
#define  OS_CPU_ARM_EXCEPT_RESET_VECT_ADDR              (OS_CPU_ARM_EXCEPT_RESET          * 0x04 + 0x00)           //0x00
#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR        (OS_CPU_ARM_EXCEPT_UNDEF_INSTR    * 0x04 + 0x00)         //0x04
#define  OS_CPU_ARM_EXCEPT_SWI_VECT_ADDR                (OS_CPU_ARM_EXCEPT_SWI            * 0x04 + 0x00)             //0x08
#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR     (OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x00)         //0x0c
#define  OS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR         (OS_CPU_ARM_EXCEPT_DATA_ABORT     * 0x04 + 0x00)                            //0x10
/*这个异常是ARM中不支持的异常*/
#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR         (OS_CPU_ARM_EXCEPT_ADDR_ABORT     * 0x04 + 0x00)                            //0x14
#define  OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR                (OS_CPU_ARM_EXCEPT_IRQ            * 0x04 + 0x00)                           //0x18
#define  OS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR             (OS_CPU_ARM_EXCEPT_FIQ            * 0x04 + 0x00)                       //0x1c
/*存储异常处理函数地址的地址*/
/* ARM exception handlers addresses                  */
#define  OS_CPU_ARM_EXCEPT_RESET_HANDLER_ADDR           (OS_CPU_ARM_EXCEPT_RESET          * 0x04 + 0x20)                            //0x20
#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR     (OS_CPU_ARM_EXCEPT_UNDEF_INSTR    * 0x04 + 0x20)           //0x24
#define  OS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_SWI            * 0x04 + 0x20)        //0x28
#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR  (OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x20)     //0x2c
#define  OS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR      (OS_CPU_ARM_EXCEPT_DATA_ABORT     * 0x04 + 0x20)            //0x30
#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR      (OS_CPU_ARM_EXCEPT_ADDR_ABORT     * 0x04 + 0x20)           //0x34
#define  OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_IRQ            * 0x04 + 0x20)           //0x38
#define  OS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_FIQ            * 0x04 + 0x20)           //0x3c
/*存储在异常向量中的内容,实质上是LDR PC,[PC,#0x18]的机器码*/
#define  OS_CPU_ARM_INSTR_JUMP_TO_SELF              0xEAFFFFFE
/* ARM "Jump To Exception Handler" asm instruction   */
#define  [url=]OS_CPU_ARM_INSTR_JUMP_TO_HANDLER         0xE59FF018[/url]
返回列表