Fault

来源:互联网 发布:淘宝上怎么购买av种子 编辑:程序博客网 时间:2024/05/21 11:16

Cortex-M3(CM3)和Cortex-M4(CM4)内核Fault:捕获非法的内存方法和非法的编程行为。


Hard Fault:

    内存溢出或者访问越界,堆栈溢出,增加堆栈的大小都属于,如果上面的3类异常没有单独的定义和处理,则都会触发该类异常。出现Hard Fault会在停在 if (CoreDebug->DHCSR & 1) {内的__breakpoint(0)处;__breakpoint()函数是ARM编译器所支持的内部指令,这个函数的作用是在指令流中插入一个断点指令(BKTP)。

Cortex-M内核复位后,非Hard Fault被禁能,包括:

Bus Fault:  在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生Bus Fault。
Memory Management Fault:  访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。
Usage Fault:   检测到未定义指令或在存取内存时有未对齐。如果使能相应控制位,还可以检测出除数为零以及其他未对齐的内存访问,使能: SCB ->CCR |= 0x18; /* enable div-by-0 and unaligned fault*/

通过SCB的寄存器组的寄存器初始化使能:

             SCB ->SHCSR |= 0x00007000;     // enable Usage Fault, Bus Fault, and MMU Fault

设置异常处理程序的优先级:

             SCB->SHP[0]:Memory Management Fault的优先级

             SCB->SHP[1]:Bus Fault 的优先级

             SCB->SHP[2]:Usage Fault 的优先级 


寄存器组的定义在core_cm3.h中:

typedef struct
{
  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */
  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */
  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */
  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register
  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */
  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */
  __IOM uint8_t  SHP[12U];               /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11,
  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */
  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */
  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */
  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */
  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */
  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */
  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */
  __IM  uint32_t PFR[2U];                /*!< Offset: 0x040 (R/ )  Processor Feature Register */
  __IM  uint32_t DFR;                    /*!< Offset: 0x048 (R/ )  Debug Feature Register */
  __IM  uint32_t ADR;                    /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */
  __IM  uint32_t MMFR[4U];               /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */
  __IM  uint32_t ISAR[5U];               /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */
        uint32_t RESERVED0[5U];
  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */
} SCB_Type;




原创粉丝点击