11,258
社区成员
发帖
与我相关
我的任务
分享最近在做一些软件标准认证工作,需要对单片机非易失性内存(RAM)做内存测试,使用的方法是IEC 60730-1 H.2.19.7(walkpat memory test)。
基本原理是对每个地址内存写0x00000000,再读取出来,与数据0x00000000,做对比,如果不相等代表内存故障,进入报警模式。
对该地址写入0x00000001,再读取出来,与数据0x00000001,做对比,如果不相等代表内存故障,进入报警模式。
对该地址写入0x00000002,再读取出来,与数据0x00000002,做对比,如果不相等代表内存故障,进入报警模式。
对该地址写入0x00000004,再读取出来,与数据0x00000004,做对比,如果不相等代表内存故障,进入报警模式。
...
对每一位单独写1后,再读取判断,全部完成后,再反过来进行判断,即
对该地址写入0xffffffff,再读取出来,与数据0xffffffff,做对比,如果不相等代表内存故障,进入报警模式。
对该地址写入0xfffffffe,再读取出来,与数据0xfffffffe,做对比,如果不相等代表内存故障,进入报警模式。
对该地址写入0xfffffffd,再读取出来,与数据0xfffffffd,做对比,如果不相等代表内存故障,进入报警模式。
...
每一个32位的内存需要处理66次,考虑到该测试过程中对内存是具有破坏性的,所有把该测试工作放在中断等级最高的函数中执行。该函数的完成由汇编代码实现,这样可以防止使用C语言测试过程对本身内存的破坏(防止程序跑飞)。
汇编函数声明:
ErrorStatus STL_RAM_WALKPAT_32Bit(u32 *);
汇编函数的实现:
STL_RAM_WALKPAT_32Bit PROC
EXPORT STL_RAM_WALKPAT_32Bit
;数据备份保存
LDR R1,[R0]
;
MOV R2, #0x00000000
STR R2,[R0]
LDR R3,[R0]
CMP R2, R3
BNE.W FailSafePOR
MOV R2, #0x00000001
RAMLoopStart1
STR R2,[R0]
LDR R3,[R0]
CMP R2,R3
BNE.W FailSafePOR
LSL R2,#1
CMP R2,#0
BNE RAMLoopStart1
MOV R2, #0xFFFFFFFF
STR R2,[R0]
LDR R3,[R0]
CMP R2, R3
BNE.W FailSafePOR
MOV R2, #0x00000001
RAMLoopStart2
MVN R3,R2
STR R3,[R0]
LDR R3,[R0]
MVN R3,R3
CMP R2,R3
BNE.W FailSafePOR
LSL R2,#1
CMP R2,#0
BNE RAMLoopStart2
;数据恢复
STR R1,[R0]
MOVS R0, #0x1 ; CPUTEST_SUCCESS
BX LR ; return to the caller
ENDP
END
该函数实现对一个32位内存的测试,全部内存测试的实现,需要根据需求自行设计。
以上内容为本人个人对标准的理解,如果有不对的和不足的地方欢迎大家指正。