记一次瑞萨RH850程序跑飞问题调查

文章讲述了在OTA开发中集成瑞萨FlashDriver时遇到的问题,涉及到赋值代码导致程序异常,经过调试发现可能是地址未对齐或变量地址被修改,最终通过初始化全局变量解决了问题。作者计划后续深入调查原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在OTA开发时需要集成瑞萨提供的切面代码包RFD28F,也就是瑞萨的Flash Driver,其中有切面的Demo。理论上按照流程,初始化、鉴权后执行切面函数就行,但是实际调试发现遇到一处下面这样的赋值代码时就会直接跑飞:

#define ADDR            0xFFFFFFFF
#define BASE_ADDR0      (*(volatile struct a_strcut *)ADDR0)

uint8 Abc;

void Func()
{
    Abc = BASE_ADDR0;
}

void Func2()
{
    uint8 localVar;
    localVar = BASE_ADDR0.AN_ELEMENT;
}

这个赋值是获取基址,从而读取寄存器值来切换Flash总线模式。

开始以为是flash总线保护打开了导致的,但是发现关闭后还是不行:

 咨询FAE让查看错误:

 测试时断点打到代码赋值这一行,单步运行就会跑飞,停住后发现PC指到0x10处,此处没有任何代码,看到FEIC值为0x13:

 查阅硬件手册发现是SYSERR:

 由于错误是稳定复现的,因此认为应该不是这些问题,后经人提示,要调试汇编代码。

发现取寄存器值的指令如下:

mov

sld.w

ld.hu

单步调试后发现最先出现的错误是0xC0,也就是MAE,但是全速运行后再停住则成了SYSERR,因此之前越过了实际错误。

由此问题找到,就是获取总线基址时赋值语句没生效,从而取值时CheckException (MAE)出错。

开始猜测这个未对齐的地址应该就是全局变量的默认地址,但是看map文件发现是对齐的,因此遗留问题:

1、是哪个地方将该变量地址给修改了?

2、为啥获取基址时的赋值语句无效?

是因为在获取基址之前全局变量地址改变到未对齐状态,所以赋不上吗?

应该不是,否则在获取基址时的st.w就会MAE;

由于着急发版本,未详细调查该问题,通过给全局变量初始化基址后切面成功。

后续有时间详细调试下补充上来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值