我正在尝试处理内核中断 cortex-A9 处理器,freeRTOS 操作系统
我尝试使用以下结构捕获此中断:
void __attribute__ ((interrupt ("IRQInterrupt")))
我还尝试覆盖标准处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)test_hendler,(void *) 0);
我通过将值写入不存在的地址来发起中断
我的任务是完全控制系统并能够处理所有中断,使程序不会进入死循环
zynq 7020.vitis 2020.2
ARMv7 处理器中有多种类型的中断(参见 ARMv7 类型的异常)
在您的情况下,您只将处理程序注册到IRQ中断,但您尝试通过生成错误的内存访问来触发它,这将导致数据中止而不是IRQ。
使用单个自定义处理程序完全控制所有中断是可能的,但有很多限制,因为可能很难或不可能检测发生了什么异常。在 ARMv7 上,每种异常类型都有自己特定的寄存器映射和其他机制。单个处理程序无法决定每种类型中断的操作。例如,Data Abort 的处理程序通常使用两个特定寄存器:DFSR 和 DFAR。
除此之外,FreeRTOS还依赖于通过IRQ(或者可能是FIQ)的定时器中断。如果您在第一个异常间接级别注册自定义处理程序(在向量表中,就像您在此处所做的那样),则必须确保它将调用系统期望的处理程序来工作。对于 FreeRTOS/ZYNQ,它通常应该是 GIC IRQ 处理程序。
顺便说一句,您尝试触发它并提到避免无限循环,看起来您确实可能有一个项目有时会触发数据中止,并且您希望避免仅包含断言的默认处理程序,从而导致无限while (1)。这个默认处理程序是为了让您只需插入 JTAG 探针和 GDB 即可轻松查看导致错误内存访问的地址。但通常希望自定义处理程序报告数据错误并最终执行操作(例如终止错误任务)。
如果这就是您正在寻找的内容,我鼓励您了解有关 ARMv7 上的数据中止处理的更多信息,并阅读 ARMv7 TRM 有关异常处理的内容。