在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;
由于着急发版本,未详细调查该问题,通过给全局变量初始化基址后切面成功。
后续有时间详细调试下补充上来。