测试友晶DE25-Nano开发板,在U-Boot阶段用md命令读取数据时出现系统挂机,提示如下:

 "Synchronous Abort" handler, esr 0x96000021, far 0x1

ResettingCPU Code: 2a0403f3 17ffffcb 7100129f 54000181 (b94002c3)

### ERROR ### Please RESET the board ###

a2c94569f6ea8d392ff4f674519c489c

从截图可以看到,命令md.b 0x01 1会返回数据,而命令 md.l 0x01 1 会导致系统挂死。

如果是访问一个未定义的地址常量,系统也会挂死:

image

 下发echo md.l $YYYQ 1,系统会打印md.l 1,如下图:image

 所以md.l $YYYQ 1命令执行时,实际是访问了地址0x1。

查看md命令的格式可知:

  • md.b (Byte):按单个字节访问,地址是字节对齐的,所以访问地址 0x01 完全合法,能正常返回数据。
  • md.l (Long):按 4 字节访问,要求 4 字节对齐的地址。因为 4 字节在 32 位系统中构成一个“字”(Word),将其看作一个整体进行读写。访问地址必须能被 4 整除(即地址末两位为 00,如 0x00, 0x04, 0x08...),否则就会产生非对齐访问(Unaligned Access)。

而我们测试地址:0x01:这个地址无法被 4 整除,是一个典型的非对齐地址,因此导致 md.l 命令失败。

 

命令

格式

参数说明

md
(Memory Display)

md[.b, .w, .l] address [# of objects]

.b (byte): 指定数据宽度字节
.w (word): 指定数据宽度字节
.l (long): 指定数据宽度字节 (默认)
 address: 要读的起始内存地址
 # of objects: 显示的数据个数 (十六进制),与宽度配合决定总显示字节数

mw
(Memory Write)

mw[.b, .w, .l] address value [count]

.b / .w / .l : 含义同上
 address: 要写入的起始地址
 value: 要写入的数据值
 [count]: 要写入的个数 (十六进制可选默认值为1)