【简介】
我们在上一篇介绍了MCM 模块的local memeory 信息获取(【S32K3XX】MCM 获取 CPU Local Memory 信息),MCU的另一个功能特性时FPU异常状态的监测。可以监测的FPU的异常状态如下:

上述的FPU 的异常状态监测寄存器设计上都有对应的状态使能位,软件设置上只要开启对应的功能即可。

软件通过配置该寄存器打开这些功能即可
mcm->ISCR |= MCM_CM7_ISCR_FIDCE_MASK | MCM_CM7_ISCR_FIXCE_MASK | MCM_CM7_ISCR_FUFCE_MASK | MCM_CM7_ISCR_FOFCE_MASK | MCM_CM7_ISCR_FDZCE_MASK | MCM_CM7_ISCR_FIOCE_MASK | MCM_CM7_ISCR_WABE_MASK; /* Interrupt Status and Control */
NVIC 中断控制器端使能MCM 的中断配置。

在中断函数内添加FPU异常状态打印,并添加测试代码触发FPU的除0错误验证FPU异常监测功能。
void MCM_IRQHandler(void)
{
#if defined(CORE0)
MCM_CM7_Type * mcm = IP_MCM_0_CM7;
#elif defined(CORE1)
MCM_CM7_Type * mcm = IP_MCM_1_CM7;
#else
#error "No valid MCM instance defined!"
#endif
uint32_t isr = mcm->ISCR;
LOG_E("MCM error interrupt triggered! ISR: %08lX", isr);
if(mcm->ISCR & MCM_CM7_ISCR_FDZC_MASK)
{
LOG_E("MCM fault: FPU divide-by-zero");
mcm->ISCR &= ~MCM_CM7_ISCR_FDZCE_MASK; /* Disable the fault */
}
}
unsigned int mcm(char argc, char **argv)
{
#if defined(CORE0)
MCM_CM7_Type * mcm = IP_MCM_0_CM7;
#elif defined(CORE1)
MCM_CM7_Type * mcm = IP_MCM_1_CM7;
#else
#error "No valid MCM instance defined!"
#endif
if(argc == 2 && strcmp(argv[1],"fpu") == 0)
{
LOG_I("%f", 1.0f/0.0f );/* Trigger FPU divide-by-zero exception */
}
return 0;
}测试代码运行结果如下,异常事件已经按照预期的被检测到

从手册的描述也可以知道对应的状态寄存器来自于FPU 的FPSCR->DZC状态的清除需要通过FPU来清除。

查看FPSCR->DZC 状态也是被设置状态。

我要赚赏金
