NXP的S32K118芯片RAM区测试BUG

RAM测试背景说明:
1.安全需求中涉及RAM区的测试,测试时会周期交替的写入0x5555或者0xAAAA数据,然后依次检查写入数据的正确性。
2.RAM区原数据会存储在安全区域中,此安全区域不在RAM检查范围内。同理0x5555或者0xAAAA也是如此。
3.((RAMT_data_T *)save_address)[save_index] = save_pattern;
save_pattern = (RAMT_data_T)~ save_pattern;

测试现象:
往RAM区填充数据时地址为0x200001C0的区域会跟随save_pattern变化。save_address和save_pattern都是section中开辟的特殊区域,理论上不会影响其它代码区。

问题分析:
查看寄存器和汇编代码发现SP寄存器指向为0x200001C0,疑似函数中开辟了此栈。
为什么特定区域的地址赋值操作还需要开辟额外的栈了?
为什么栈地址是0x200001C0?

问题结论:
RAMT_data_T定义成了uint64,但是此芯片基于ARM架构的32位RISC指令集,因此汇编会借用SP寄存器先处理低32位值最后再处理高32位值。
栈地址由os调度此任务时开辟,开辟的地址与map文件映射强相关。

解决方法:
修改RAMT_data_T为32位的uint32,查看汇编代码无需借助SP寄存器从而无需开辟栈。

posted @ 2025-05-19 23:08  日暮_途远  阅读(42)  评论(0)    收藏  举报