我们在debug的时候,可以使用Trace32自带的一些命令快速地检测目标系统的内存的类型和完整性(是否可读或可写),以便快速排除内存缺陷带来的干扰。
目录
Data.Test: 内存完整性测试 Memory integrity test
Data.TestList :检测内存属性
Data.Test: 内存完整性测试 Memory integrity test
Format:Data.Test <address_range> [ / <option> ]<option> :
- Toggle
- Prime
- RANDOM | PRANDOM
- AddrBus
- Repeat [<count>]
- WriteOnly | ReadOnly
- NoBreak
- Byte | Word | Long | Quad | TByte | PByte | HByte | SByte
使用Data.Test指令需要给它指定一个地址范围: <address_range>,在检测完成后,会将检测结果 fail 或者pass打印出来。并且可以通过使用不同的option,来达到不同的检测效果:
- 内存的读写访问
- 地址线故障检测
- 地址别名(Aliases addresses)(将超出内存容量的地址映射到低地址)错误检测
Data.Test 命令可以随时通过 点击工具栏中的 STOP 按钮来终止,该指令只用来做完整性检测,并不意味着可以检测目标系统已经实现了哪些内存。
Data.Test指令常用的命令行选项:
- Toggle (默认):比特反转,内存中数据一次读取一小块,然后比特反转两次,这样既检测了读写,有没有改变原始内存中的数据。但是地址别名问题不能通过该方式检测出。
- Prime:素数, 指定的地址范围将会被一个测试模板完全填充,随即被验证。需要注意的是,测试模板的长度是素数,而不是数据本身。该范围内的原始数据将会丢失,这种测试方法可以检测地址线故障address line failures,或者内存中存在的镜像分区。同时可以结合WriteOnly 和 ReadOnly选项使用。
- RANDOM:随机,该模板是一个随机序列。
-
PRANDOM:伪随机,伪随机序列,同时可以结合 WriteOnly 和 ReadOnly选项使用。
-
Repeat :设置重复次数,如果没有传入数字作为重复次数,该测试将会一直进行直到手动停止。其他的option:
测试模板的长度为素数:
Data.Test 0x0--0x0ffff /Prime内存测试一直持续,直至手动点击停止按钮:
Data.Test 0x0--0x0ffff /Repeat
内存测试重复三次:
Data.Test 0x0--0x0ffff /Prime /Repeat 3.
Data.Test 命令的测试结果会影响以下两个函数:
- FOUND()
- 如果测试过程中发现了内存错误,将会返回 TRUE
- TRACK.ADDRESS()
- 返回首次出现错误的地址。
Data.Test 0x0++0xffff /Prime
IF Found()
PRINT "Error found at address " TRACK.ADDRESS()
Data.TestList :检测内存属性
Format:Data.TestList [ <address_range> ] [ / <option> …]<option> :64K | 1M
Data.TestList 指令是一个无损的内存测试指令,用于检测目标系统中给定地址范围的内存类型。默认情况下,最小的检测颗粒度为4K。可以通过option,来指定
64K
或 1M,这样地址范围address_range 将会被分成对应大小的小块,并且每次只测试每个小块的前16K内存。
下图是Data.TestList测试结果示例图:
其中:
ok RAM
read only ROM/FLASH
read fail no memory
write fail no memory
需要注意的是, 如果是访问外设的内存,Data.TestList指令有可能会造成 debug port fail。