记录一次S32K14X调试进入Harldfault原因

记录一次S32K14X调试进入Harldfault原因


S32DS环境下 S32K14X程序中如果设置 INT_SYS_EnableIRQ(HardFault_IRQn);
则程序debug时候就会跳转到HardFault函数。
在这里插入图片描述

1、定位到库函数INT_SYS_EnableIRQ()内
“ S32_NVIC->ISER[(uint32_t)(irqNumber) >> 5U] = (uint32_t)(1UL << ((uint32_t)(irqNumber) & (uint32_t)0x1FU));”
此语句;
在这里插入图片描述
2、此语句左右部分反汇编均正确,但是当右边赋值给左边时候程序出错进入HardFault
3、进入HardFault后查看HardFault出错信息寄存器[S32_SCB->CFSR]]打印的是"0x8200"
在这里插入图片描述
4、查找《Cortex M3与M4权威指南》可知表明出现的是精确的数据访问错误

在这里插入图片描述
在这里插入图片描述
5、查找S32_SCB->BFAR寄存器存放的是精确的数据访问出错地址,进入HardFault值为0xe0fc,
在这里插入图片描述
表示程序对0xe0fc地址进行了操作,这是不被内核允许的
6、查找程序为何会对0xe0fc进行操作。仔细查看
“ S32_NVIC->ISER[(uint32_t)(irqNumber) >> 5U] = (uint32_t)(1UL << ((uint32_t)(irqNumber) & (uint32_t)0x1FU));”
反汇编并将以上语句拆分两部分进行debug测试如下:
uint32_t abcde = (uint32_t)(1UL << ((uint32_t)(irqNumber) & (uint32_t)0x1FU));
uint32_t abcdef = (uint32_t)(irqNumber) >> 5U;
S32_NVIC->ISER[abcdef] = abcde;
找到问题出现在" S32_NVIC->ISER[abcdef] = abcde;"语句,此语句的对应的反汇编如下:
00002a8e: ldr r2, [pc, #8] ; (0x2a98 )
00002a90: str.w r3, [r2, r0, lsl #2]
在这里插入图片描述
7、调试时候问题出现在 “str 指令将寄存器 r3 中的值存储到地址为 [r2 + (r0 << 2)] 的内存中。”
8、了解对应出错的C语言语句执行的是:abcdef等于irqNumber(-13)右移5位,并将abcde存放在S32_NVIC->ISER[abcdef] 中(此时abcdef = 7FFFFFF)
9、可是反汇编却多执行了“str.w r3, [r2, r0, lsl #2]”这一步,这表明的是存放到 S32_NVIC->ISER[0]这个内存地址的偏移量需要在irqNumber(-13)右移5位基础上
再左移2位(乘于4),(此时abcdef = 1FFFFFFC,也就是需要放入S32_NVIC->ISER内数据的偏移量),
在这里插入图片描述
若加上S32_NVIC->ISER基地址:0xE000E100 + 0x1FFFFFFC = 0x10000E0FC,已溢出,导致产生相关的总线错误
10、为何要乘4 猜测是S32_NVIC->ISER[0]是8位数据八位数据存放,如果是32位数据需要乘4.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值