源头

memAccessCmd是用于SylixOS下对内存/寄存器进行访问和测试的工具。

SylixOS下调测程序,无论是应用、驱动还是内核,如果能查看并操作指定内存/寄存器,将是一个非常有效的手段。作者在多年的SylixOS程序开发中积累了不少自己编写的调测软件工具,其中内存工具算的是上最基础使用频率最高的一个。

博客最后有发文时的最新版源码,使用者可以自行将其编译为app或内核模块来用,直接添加到bsp中也是可以的。本模块也会不定时更新优化,最新版本可从Git仓库拉取。
Git仓库地址:https://github.com/scilogyhunter/mem.git

用法

  • -h 用于显示命令用法
  • -i 用于显示命令参数值 其他选项则都是对内存进行操作,默认是按字节(8位)进行,也可以按指定位数来操作,当前支持8位,16位和32位。
  • -r 用于读取并显示内存内容。
  • -w 用于向目标地址写入目标内容。
  • -s 用于将一段内存设置为目标值,类似PVOID lib_memset (PVOID pvDest, INT iC, size_t stCount)函数。
  • -g 从一个固定地址获取一段内存值,比如从一个FIFO寄存器读取一段数据。
  • -p 向一个固定地址写入一段内存值,比如向一个FIFO寄存器写入一段数据。
  • -c 把一段内存值拷贝到另一段内存。
  • -m 比较两段内存并打印出不相同的部分。
  • -t 对一段内存进行读写访问测试,如果目标内存/寄存器为只读或只写模式,测试就会报错;如果是非法空间或没有进行内存映射的空间则可能触发系统异常。
  • -e 对一段内存进行读写速度测试,输出读写速度。

具体操作实例如下:

[root@sylixos:/root]# /apps/mem/mem -h
Usage:
mem  -h display help info.
mem  -i display arg  info.
mem  -r[8/16/32] <saddr> <length>         memory read
mem  -w[8/16/32] <daddr> <d0> [d1] [d2]...memory write
mem  -s[8/16/32] <daddr> <value> <length> memory set
mem  -g[8/16/32] <daddr> <saddr> <length> memory get
mem  -p[8/16/32] <daddr> <saddr> <length> memory put
mem  -c[8/16/32] <daddr> <saddr> <length> memory copy
mem  -m[8/16/32] <daddr> <saddr> <length> memory compare
mem  -t[8/16/32] <daddr> <length>         memory access test
mem  -e[8/16/32] <daddr> <length>         memory speed test
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -i
cOperate = r
uiFormat = 1
uiSaddr  = 00000000
uiDaddr  = 00000000
uiValue  = 00000000
uiLength = 64
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -r 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 1[41765030] 2f 75 73 72 2f 62 69 6e 00 2f 62 69 6e 00 2f 75    /usr/bin`/bin`/u
[41765040] 73 72 2f 70 6b 67 2f 73 62 69 6e 00 2f 73 62 69    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -r8 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 1[41765030] 2f 75 73 72 2f 62 69 6e 00 2f 62 69 6e 00 2f 75    /usr/bin`/bin`/u
[41765040] 73 72 2f 70 6b 67 2f 73 62 69 6e 00 2f 73 62 69    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -r16 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 2[41765030] 2f75 7372 2f62 696e 002f 6269 6e00 2f75    /usr/bin`/bin`/u
[41765040] 7372 2f70 6b67 2f73 6269 6e00 2f73 6269    sr/pkg/sbin`/sbi
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 2f757372 2f62696e 002f6269 6e002f75    /usr/bin`/bin`/u
[41765040] 73722f70 6b672f73 62696e00 2f736269    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -w 0x41765030 1 2 3 4
memory write.
uiDaddr = 41765030, uiLength = 00000004, uiFormat = 1[41765030] 01 02 03 04                                        ````
[root@sylixos:/root]# /apps/mem/mem -r 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 1[41765030] 01 02 03 04 2f 62 69 6e 00 2f 62 69 6e 00 2f 75    ````/bin`/bin`/u
[41765040] 73 72 2f 70 6b 67 2f 73 62 69 6e 00 2f 73 62 69    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -w16 0x41765030 1 2 3 4
memory write.
uiDaddr = 41765030, uiLength = 00000004, uiFormat = 2[41765030] 0001 0002 0003 0004                        `````````/bin`/u
[root@sylixos:/root]# /apps/mem/mem -r16 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 2[41765030] 0001 0002 0003 0004 002f 6269 6e00 2f75    `````````/bin`/u
[41765040] 7372 2f70 6b67 2f73 6269 6e00 2f73 6269    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -w32 0x41765030 1 2 3 4
memory write.
uiDaddr = 41765030, uiLength = 00000004, uiFormat = 4[41765030] 00000001 00000002 00000003 00000004    ````````````````
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 00000001 00000002 00000003 00000004    ````````````````
[41765040] 73722f70 6b672f73 62696e00 2f736269    sr/pkg/sbin`/sbi
[root@sylixos:/root]#
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -s 0x41765030 0x55 16
memory set.
uiAddr = 41765030, uiValue = 00000055, uiLength = 00000010, uiFormat = 1
[root@sylixos:/root]# /apps/mem/mem -r 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 1[41765030] 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55    UUUUUUUUUUUUUUUU
[41765040] 73 72 2f 70 6b 67 2f 73 62 69 6e 00 2f 73 62 69    sr/pkg/sbin`/sbi
[root@sylixos:/root]# /apps/mem/mem -s16 0x41765030 0x66 16
memory set.
uiAddr = 41765030, uiValue = 00000066, uiLength = 00000010, uiFormat = 2
[root@sylixos:/root]# /apps/mem/mem -r16 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 2[41765030] 0066 0066 0066 0066 0066 0066 0066 0066    `f`f`f`f`f`f`f`f
[41765040] 7372 2f70 6b67 2f73 6269 6e00 2f73 6269    sr/pkg/sbin`/sbi
[root@sylixos:/root]# /apps/mem/mem -s32 0x41765030 0x12345678 16
memory set.
uiAddr = 41765030, uiValue = 12345678, uiLength = 00000010, uiFormat = 4
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 73722f70 6b672f73 62696e00 2f736269    sr/pkg/sbin`/sbi
[root@sylixos:/root]# ``````bash
[root@sylixos:/root]# /apps/mem/mem -g 0x41765040 0x41765030 16
memory get.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 1
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 12121212 12121212 12121212 12121212    ````````````````
[root@sylixos:/root]# /apps/mem/mem -g16 0x41765040 0x41765030 16
memory get.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 2
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 12341234 12341234 12341234 12341234    `4`4`4`4`4`4`4`4
[root@sylixos:/root]# /apps/mem/mem -g32 0x41765040 0x41765030 16
memory get.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 4
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -p 0x41765040 0x41765030 16
memory put.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 1
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 78345678 12345678 12345678 12345678    x4Vx`4Vx`4Vx`4Vx
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]# /apps/mem/mem -p16 0x41765040 0x41765030 16
memory put.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 2
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 56785678 12345678 12345678 12345678    VxVx`4Vx`4Vx`4Vx
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]# /apps/mem/mem -p32 0x41765040 0x41765030 16
memory put.
uiDaddr = 41765040, uiSaddr = 41765030, uiLength = 00000010, uiFormat = 4
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 5a5a5a5a 5a5a5a5a 5a5a5a5a 5a5a5a5a    ZZZZZZZZZZZZZZZZ
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -c 0x41765030 0x41765040 16
memory copy.
uiDaddr = 41765030, uiSaddr = 41765040, uiLength = 00000010, uiFormat = 1
[root@sylixos:/root]# /apps/mem/mem -r32 0x41765030 32
memory read.
uiSaddr = 41765030, uiLength = 00000020, uiFormat = 4[41765030] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[41765040] 12345678 12345678 12345678 12345678    `4Vx`4Vx`4Vx`4Vx
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -m 0x41765030 0x41765040 16
memory compare
uiDaddr = 41765030, uiSaddr = 41765040, uiLength = 00000010, uiFormat = 1
different count is 0
[root@sylixos:/root]# /apps/mem/mem -w32 0x41765030 0x5a5a5a5a
memory write.
uiDaddr = 41765030, uiLength = 00000001, uiFormat = 4[41765030] 5a5a5a5a                               ZZZZ`4Vx`4Vx`4Vx
[root@sylixos:/root]# /apps/mem/mem -m 0x41765030 0x41765040 16
memory compare
uiDaddr = 41765030, uiSaddr = 41765040, uiLength = 00000010, uiFormat = 1
[41765030 -- 41765040] 5a -- 12
[41765031 -- 41765041] 5a -- 34
[41765032 -- 41765042] 5a -- 56
[41765033 -- 41765043] 5a -- 78
different count is 4
[root@sylixos:/root]# /apps/mem/mem -m16 0x41765030 0x41765040 16
memory compare
uiDaddr = 41765030, uiSaddr = 41765040, uiLength = 00000010, uiFormat = 2
[41765030 -- 41765040] 5a5a -- 1234
[41765032 -- 41765042] 5a5a -- 5678
different count is 2
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -m32 0x41765030 0x41765040 16
memory compare
uiDaddr = 41765030, uiSaddr = 41765040, uiLength = 00000010, uiFormat = 4
[41765030 -- 41765040] 5a5a5a5a -- 12345678
different count is 1
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -t 0x41765030 1024
memory access test
uiDaddr = 41765030, uiLength = 00000400, uiFormat = 1
[root@sylixos:/root]#
[root@sylixos:/root]# /apps/mem/mem -e 0x41765030 1024
memory speed test
uiDaddr = 41765030, uiLength = 00000400, uiFormat = 1
memspeed read        1024 byte by         47 us (  21.79MBps)
memspeed write       1024 byte by         29 us (  35.31MBps)
[root@sylixos:/root]#

源码

/*********************************************************************************************************
**
**                                    中国软件开源组织
**
**                                   嵌入式实时操作系统
**
**                                       SylixOS(TM)
**
**                               Copyright  All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: mem.c
**
** 创   建   人: Hou.JinYu (侯进宇)
**
** 文件创建日期: 2017 年 10 月 17 日
**
** 描        述: 通用系统内存访问命令,可以直接读取或修改内存值,用于调试
*********************************************************************************************************/
#include "SylixOS.h"                                                    /*  操作系统                    */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
/*********************************************************************************************************宏定义
*********************************************************************************************************/
#define   BUF_SIZE              (256)                                   /*  缓冲区大小                  */
/*********************************************************************************************************PRINT 打印宏函数
*********************************************************************************************************/
#define PRINT_INFO(fmt, ...)    do {printf(fmt, ##__VA_ARGS__);} while (0)
/*********************************************************************************************************读写宏函数
*********************************************************************************************************/
#if !defined(read8) && !defined(write8)
#define read8(a)                (*(volatile UINT8  *)(a))
#define read16(a)               (*(volatile UINT16 *)(a))
#define read32(a)               (*(volatile UINT32 *)(a))
#define read64(a)               (*(volatile UINT64 *)(a))#define write8(d, a)            (*(volatile UINT8  *)(a) = (d))
#define write16(d, a)           (*(volatile UINT16 *)(a) = (d))
#define write32(d, a)           (*(volatile UINT32 *)(a) = (d))
#define write64(d, a)           (*(volatile UINT64 *)(a) = (d))
#endif
/*********************************************************************************************************操作宏
*********************************************************************************************************/
#define MEMTEST(xx)                                                                               \t[0] = getTimeUs();                                                                           \for (i = 0; i < uiCount; i++) {                                                               \read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);                      \read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);                      \read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);                      \read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);read##xx(ulAddr);                      \}                                                                                             \t[1] = getTimeUs();                                                                           \time[0] = t[1] - t[0];                                                                        \v = read##xx(ulAddr);                                                                         \t[0] = getTimeUs();                                                                           \for (i = 0; i < uiCount; i++) {                                                               \write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);      \write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);      \write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);      \write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);write##xx(v, ulAddr);      \}                                                                                             \t[1] = getTimeUs();                                                                           \time[1] = t[1] - t[0];
/*********************************************************************************************************参数结构体
*********************************************************************************************************/
typedef struct {CHAR         cOperate;                                              /*  操作类型r w s c t           */UINT32       uiFormat;                                              /*  1:u8 2:u16 4:u32            */UINT32       uiSaddr;                                               /*  源地址                      */UINT32       uiDaddr;                                               /*  目的地址                    */UINT32       uiValue;                                               /*  数值                        */UINT32       uiLength;                                              /*  数据长度                    */UINT32       uiBuf[BUF_SIZE];                                       /*  缓冲区                      */
} ARG_ST;
/*********************************************************************************************************
** 函数名称: getTimeUs
** 功能描述: 获取系统运行时间,单位微秒
** 输    入: 无
** 输    出: 系统运行时间
*********************************************************************************************************/
static UINT64  getTimeUs (VOID)
{struct timespec  tv;lib_clock_gettime(CLOCK_MONOTONIC, &tv);return  (tv.tv_sec * 1000000 + tv.tv_nsec / 1000);
}
/*********************************************************************************************************
** 函数名称: memoryHelp
** 功能描述: 帮助信息
** 输   入: NONE
** 输    出: NONE
*********************************************************************************************************/
static VOID  memoryHelp (VOID)
{PRINT_INFO("Usage:  \n""mem  -h display help info.\n""mem  -i display arg  info.\n""mem  -r[8/16/32] <saddr> <length>         memory read\n""mem  -w[8/16/32] <daddr> <d0> [d1] [d2]...memory write\n""mem  -s[8/16/32] <daddr> <value> <length> memory set\n""mem  -g[8/16/32] <daddr> <saddr> <length> memory get\n""mem  -p[8/16/32] <daddr> <saddr> <length> memory put\n""mem  -c[8/16/32] <daddr> <saddr> <length> memory copy\n""mem  -m[8/16/32] <daddr> <saddr> <length> memory compare\n""mem  -t[8/16/32] <daddr> <length>         memory access test\n""mem  -e[8/16/32] <daddr> <length>         memory speed test\n");
}
/*********************************************************************************************************
** 函数名称: memoryInfo
** 功能描述: 参数信息
** 输   入: pArg  参数
** 输    出: NONE
*********************************************************************************************************/
static VOID  memoryInfo (ARG_ST  *pArg)
{UINT32   i;PRINT_INFO("cOperate = %c\n",   pArg->cOperate);PRINT_INFO("uiFormat = %d\n",   pArg->uiFormat);PRINT_INFO("uiSaddr  = %08x\n", pArg->uiSaddr);PRINT_INFO("uiDaddr  = %08x\n", pArg->uiDaddr);PRINT_INFO("uiValue  = %08x\n", pArg->uiValue);PRINT_INFO("uiLength = %d\n",   pArg->uiLength);if (pArg->uiLength && (pArg->cOperate == 'w')) {for (i = 0; i < pArg->uiLength; i++) {if ((i % 16) == 0) {PRINT_INFO("\n[%08x] ", i);}PRINT_INFO(" %02x", pArg->uiBuf[i]);}PRINT_INFO("\n");}
}
/*********************************************************************************************************
** 函数名称: memoryParseArg
** 功能描述: 参数解析
** 输 入  : pArg  参数
**           iArgC
**           ppcArgV
** 输 出  : ERROR_CODE
*********************************************************************************************************/
static INT  memoryParseArg (ARG_ST  *pArg, INT  iArgC, PCHAR  ppcArgV[])
{UINT32  i;if (iArgC < 2) {return  (PX_ERROR);}if (ppcArgV[1][0] != '-') {return  (PX_ERROR);}pArg->cOperate = ppcArgV[1][1];if (strlen(ppcArgV[1]) > 2) {pArg->uiFormat = strtoul(&ppcArgV[1][2], NULL, 10) / 8;} else {pArg->uiFormat = 1;}if (pArg->cOperate == 'r') {if (iArgC < 4) {return  (PX_ERROR);}pArg->uiSaddr  = strtoul(ppcArgV[2], NULL, 0);pArg->uiLength = strtoul(ppcArgV[3], NULL, 0);} else if (pArg->cOperate == 'w') {if (iArgC < 4) {return  (PX_ERROR);}pArg->uiDaddr = strtoul(ppcArgV[2], NULL, 0);pArg->uiLength = ((iArgC - 3) < BUF_SIZE) ? (iArgC - 3) : BUF_SIZE;for (i = 0; i < pArg->uiLength; i++) {pArg->uiBuf[i] = strtoul(ppcArgV[3 + i], NULL, 0);}} else if (pArg->cOperate == 's') {if (iArgC < 5) {return  (PX_ERROR);}pArg->uiDaddr  = strtoul(ppcArgV[2], NULL, 0);pArg->uiValue  = strtoul(ppcArgV[3], NULL, 0);pArg->uiLength = strtoul(ppcArgV[4], NULL, 0);} else if ((pArg->cOperate == 'g') || (pArg->cOperate == 'p') || (pArg->cOperate == 'c') ||(pArg->cOperate == 'm')) {if (iArgC < 5) {return  (PX_ERROR);}pArg->uiDaddr  = strtoul(ppcArgV[2], NULL, 0);pArg->uiSaddr  = strtoul(ppcArgV[3], NULL, 0);pArg->uiLength = strtoul(ppcArgV[4], NULL, 0);} else if ((pArg->cOperate == 't') || (pArg->cOperate == 'e')) {if (iArgC < 4) {return  (PX_ERROR);}pArg->uiDaddr  = strtoul(ppcArgV[2], NULL, 0);pArg->uiLength = strtoul(ppcArgV[3], NULL, 0);} else {return  (PX_ERROR);}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memRead
** 功能描述: 读取并打印内存
** 输    入: uiSaddr        源地址
**           uiLength       长度
**           uiFormat       格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memRead (UINT32  uiSaddr, UINT32  uiLength, UINT32  uiFormat)
{CHAR     c;UINT32   i;UINT32   j;UINT32   n;UINT32   l;UINT32   uiCount;volatile  UINT8  *pData08;volatile  UINT16 *pData16;volatile  UINT32 *pData32;if (uiFormat == 1) {uiCount = uiLength;pData08 = (UINT8  *)uiSaddr;for (i = 0; i < uiCount; i+= 16) {if ((i % 16) == 0) {PRINT_INFO("\n[%08x]", i * uiFormat + uiSaddr);}n = i;if ((uiCount - n) >= 16) {l = 16;} else {l = uiCount - n;}for (j = 0; j < l; j++) {PRINT_INFO(" %02x", pData08[n + j]);}for (; j < 16; j++) {PRINT_INFO("   ");}PRINT_INFO("    ");for (j = 0; j < l; j++) {c = pData08[n + j];if (isprint(c)) {PRINT_INFO("%c", c);} else {PRINT_INFO("`");}}for (; j < 16; j++) {PRINT_INFO(" ");}}} else if (uiFormat == 2) {uiCount = (uiLength + 1) / 2;pData08 = (UINT8  *)uiSaddr;pData16 = (UINT16 *)uiSaddr;for (i = 0; i < uiCount; i+= 8) {if ((i % 8) == 0) {PRINT_INFO("\n[%08x]", i * uiFormat + uiSaddr);}n = i;if ((uiCount - n) >= 8) {l = 8;} else {l = uiCount - n;}for (j = 0; j < l; j++) {PRINT_INFO(" %04x", pData16[n + j]);}for (; j < 8; j++) {PRINT_INFO("     ");}PRINT_INFO("    ");for (j = 0; j < 16; j++) {c = pData08[n * 2 + j];if (isprint(c)) {PRINT_INFO("%c", c);} else {PRINT_INFO("`");}}for (; j < 16; j++) {PRINT_INFO(" ");}}} else if (uiFormat == 4) {uiCount = (uiLength + 3) / 4;pData08 = (UINT8  *)uiSaddr;pData32 = (UINT32 *)uiSaddr;for (i = 0; i < uiCount; i+= 4) {if ((i % 4) == 0) {PRINT_INFO("\n[%08x]", i * uiFormat + uiSaddr);}n = i;if ((uiCount - n) >= 4) {l = 4;} else {l = uiCount - n;}for (j = 0; j < l; j++) {PRINT_INFO(" %08x", pData32[n + j]);}for (; j < 4; j++) {PRINT_INFO("         ");}PRINT_INFO("    ");for (j = 0; j < 16; j++) {c = pData08[n * 4 + j];if (isprint(c)) {PRINT_INFO("%c", c);} else {PRINT_INFO("`");}}for (; j < 16; j++) {PRINT_INFO(" ");}}} else {memoryHelp();}PRINT_INFO("\n");return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memWrite
** 功能描述: 写内存
** 输    入: uiDaddr      目的地址
**           uiLength     长度
**           uiBuf        缓存
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memWrite (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiBuf[], UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pData08;volatile  UINT16 *pData16;volatile  UINT32 *pData32;uiCount = uiLength;if (uiFormat == 1) {pData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {pData08[i] = uiBuf[i];}} else if (uiFormat == 2) {pData16 = (UINT16 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData16[i] = uiBuf[i];}} else if (uiFormat == 4) {pData32 = (UINT32 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData32[i] = uiBuf[i];}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memSet
** 功能描述: 设置内存
** 输    入: uiDaddr      目的地址
**           uiLength     长度
**           uiValue      值
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memSet (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiValue, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pData08;volatile  UINT16 *pData16;volatile  UINT32 *pData32;if (uiFormat == 1) {uiCount = uiLength;pData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {pData08[i] = uiValue;}} else if (uiFormat == 2) {uiCount = uiLength / 2;pData16 = (UINT16 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData16[i] = uiValue;}} else if (uiFormat == 4) {uiCount = uiLength / 4;pData32 = (UINT32 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData32[i] = uiValue;}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memGet
** 功能描述: 设置内存,从一个固定地址读并设置目标内存段
** 输    入: uiDaddr      目的地址
**           uiLength     长度
**           uiSaddr      源地址
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memGet (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiSaddr, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pData08;volatile  UINT16 *pData16;volatile  UINT32 *pData32;if (uiFormat == 1) {uiCount = uiLength;pData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {pData08[i] = *(volatile  UINT8  *)uiSaddr;}} else if (uiFormat == 2) {uiCount = uiLength / 2;pData16 = (UINT16 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData16[i] = *(volatile  UINT16  *)uiSaddr;}} else if (uiFormat == 4) {uiCount = uiLength / 4;pData32 = (UINT32 *)uiDaddr;for (i = 0; i < uiCount; i++) {pData32[i] = *(volatile  UINT32  *)uiSaddr;}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memPut
** 功能描述: 设置内存,从一段内存向一个固定地址设置数据
** 输    入: uiDaddr      目的地址
**           uiLength     长度
**           uiSaddr      源地址
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memPut (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiSaddr, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pData08;volatile  UINT16 *pData16;volatile  UINT32 *pData32;if (uiFormat == 1) {uiCount = uiLength;pData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {*(volatile  UINT8  *)uiSaddr = pData08[i];}} else if (uiFormat == 2) {uiCount = uiLength / 2;pData16 = (UINT16 *)uiDaddr;for (i = 0; i < uiCount; i++) {*(volatile  UINT16  *)uiSaddr = pData16[i];}} else if (uiFormat == 4) {uiCount = uiLength / 4;pData32 = (UINT32 *)uiDaddr;for (i = 0; i < uiCount; i++) {*(volatile  UINT32  *)uiSaddr = pData32[i];}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memCopy
** 功能描述: 内存拷贝
** 输    入: uiDaddr      目的地址
**           uiSaddr      源地址
**           uiLength     长度
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memCopy (UINT32  uiDaddr, UINT32  uiSaddr, UINT32  uiLength, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pSrcData08;volatile  UINT16 *pSrcData16;volatile  UINT32 *pSrcData32;volatile  UINT8  *pDstData08;volatile  UINT16 *pDstData16;volatile  UINT32 *pDstData32;if (uiFormat == 1) {uiCount = uiLength;pSrcData08 = (UINT8  *)uiSaddr;pDstData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData08[i] = pSrcData08[i];}} else if (uiFormat == 2) {uiCount = uiLength / 2;pSrcData16 = (UINT16  *)uiSaddr;pDstData16 = (UINT16  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData16[i] = pSrcData16[i];}} else if (uiFormat == 4) {uiCount = uiLength / 4;pSrcData32 = (UINT32  *)uiSaddr;pDstData32 = (UINT32  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData32[i] = pSrcData32[i];}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memCompare
** 功能描述: 内存比较
** 输    入: uiDaddr      目的地址
**           uiSaddr      源地址
**           uiLength     长度
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memCompare (UINT32  uiDaddr, UINT32  uiSaddr, UINT32  uiLength, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;UINT32   uiCountDif = 0;volatile  UINT8  *pSrcData08;volatile  UINT16 *pSrcData16;volatile  UINT32 *pSrcData32;volatile  UINT8  *pDstData08;volatile  UINT16 *pDstData16;volatile  UINT32 *pDstData32;if (uiFormat == 1) {uiCount = uiLength;pSrcData08 = (UINT8  *)uiSaddr;pDstData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {if (pDstData08[i] != pSrcData08[i]) {uiCountDif++;PRINT_INFO("[%08x -- %08x] %02x -- %02x\n",(UINT)&pDstData08[i], (UINT)&pSrcData08[i], pDstData08[i], pSrcData08[i]);}}PRINT_INFO("different count is %u\n", uiCountDif);} else if (uiFormat == 2) {uiCount = uiLength / 2;pSrcData16 = (UINT16  *)uiSaddr;pDstData16 = (UINT16  *)uiDaddr;for (i = 0; i < uiCount; i++) {if (pDstData16[i] != pSrcData16[i]) {uiCountDif++;PRINT_INFO("[%08x -- %08x] %04x -- %04x\n",(UINT)&pDstData16[i], (UINT)&pSrcData16[i], pDstData16[i], pSrcData16[i]);}}PRINT_INFO("different count is %u\n", uiCountDif);} else if (uiFormat == 4) {uiCount = uiLength / 4;pSrcData32 = (UINT32  *)uiSaddr;pDstData32 = (UINT32  *)uiDaddr;for (i = 0; i < uiCount; i++) {if (pDstData32[i] != pSrcData32[i]) {uiCountDif++;PRINT_INFO("[%08x -- %08x] %08x -- %08x\n",(UINT)&pDstData32[i], (UINT)&pSrcData32[i], pDstData32[i], pSrcData32[i]);}}PRINT_INFO("different count is %u\n", uiCountDif);} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memTest
** 功能描述: 内存可读写测试
** 输    入: uiDaddr      目的地址
**           uiLength     长度
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static INT  memTest (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiFormat)
{UINT32   i;UINT32   uiCount;volatile  UINT8  *pDstData08;volatile  UINT16 *pDstData16;volatile  UINT32 *pDstData32;if (uiFormat == 1) {uiCount = uiLength;pDstData08 = (UINT8  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData08[i] = 0;if (pDstData08[i] != 0) {PRINT_INFO("test write 0x00 fault at %08x\n", (UINT)&pDstData08[i]);}pDstData08[i] = 0xff;if (pDstData08[i] != 0xff) {PRINT_INFO("test write 0xff fault at %08x\n", (UINT)&pDstData08[i]);}}} else if (uiFormat == 2) {uiCount = uiLength / 2;pDstData16 = (UINT16  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData16[i] = 0;if (pDstData16[i] != 0) {PRINT_INFO("test write 0x0000 fault at %08x\n", (UINT)&pDstData16[i]);}pDstData16[i] = 0xffff;if (pDstData16[i] != 0xffff) {PRINT_INFO("test write 0xffff fault at %08x\n", (UINT)&pDstData16[i]);}}} else if (uiFormat == 4) {uiCount = uiLength / 4;pDstData32 = (UINT32  *)uiDaddr;for (i = 0; i < uiCount; i++) {pDstData32[i] = 0;if (pDstData32[i] != 0) {PRINT_INFO("test write 0x00000000 fault at %08x\n", (UINT)&pDstData32[i]);}pDstData32[i] = 0xffffffff;if (pDstData32[i] != 0xffffffff) {PRINT_INFO("test write 0xffffffff fault at %08x\n", (UINT)&pDstData32[i]);}}} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memSpeed
** 功能描述: 内存读写速度测试
** 输    入: uiDaddr      目的地址
**           uiSaddr      源地址
**           uiLength     长度
**           uiFormat     格式
** 输    出: ERROR_CODE
*********************************************************************************************************/
static  INT  memSpeed (UINT32  uiDaddr, UINT32  uiLength, UINT32  uiFormat)
{addr_t   ulAddr;UINT32   i;UINT32   v;UINT32   uiCount;UINT64   t[2];UINT32   time[2];ulAddr  = uiDaddr;if (uiFormat == 1) {uiCount = uiLength / (16 * 1);MEMTEST(8);} else if (uiFormat == 2) {uiCount = uiLength / (16 * 2);MEMTEST(16);} else if (uiFormat == 4) {uiCount = uiLength / (16 * 4);MEMTEST(32);} else {memoryHelp();return  (PX_ERROR);}printf("memspeed read  %10d byte by %10u us (%7.2fMBps)\r\n",uiLength, time[0], uiLength * 1.0 / time[0]);printf("memspeed write %10d byte by %10u us (%7.2fMBps)\r\n",uiLength, time[1], uiLength * 1.0 / time[1]);return  (ERROR_NONE);
}
/*********************************************************************************************************
** 函数名称: memAccessCmd
** 功能描述: 内存访问命令
** 输    入: iArgC
**           ppcArgV
** 输    出: ERROR_CODE
*********************************************************************************************************/
INT  memAccessCmd (INT  iArgC, PCHAR  ppcArgV[])
{static ARG_ST  _S_args = {.cOperate  = 'r',.uiFormat  = 1,.uiSaddr   = 0,.uiDaddr   = 0,.uiValue   = 0,.uiLength  = 64,};ARG_ST  *pArg = &_S_args;if (strcmp(ppcArgV[1], "-i") == 0) {memoryInfo(pArg);return  (ERROR_NONE);}if (ERROR_NONE != memoryParseArg(pArg, iArgC, ppcArgV)) {memoryHelp();return  (PX_ERROR);}if (pArg->cOperate == 'r') {PRINT_INFO("memory read.\n");PRINT_INFO("uiSaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);memRead (pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);} else if (pArg->cOperate == 'w') {PRINT_INFO("memory write.\n");PRINT_INFO("uiDaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiLength, pArg->uiFormat);memWrite(pArg->uiDaddr, pArg->uiLength, pArg->uiBuf, pArg->uiFormat);memRead (pArg->uiDaddr, pArg->uiLength * pArg->uiFormat, pArg->uiFormat);} else if (pArg->cOperate == 's') {PRINT_INFO("memory set.\n");PRINT_INFO("uiAddr = %08x, uiValue = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiValue, pArg->uiLength, pArg->uiFormat);memSet(pArg->uiDaddr, pArg->uiLength, pArg->uiValue, pArg->uiFormat);} else if (pArg->cOperate == 'g') {PRINT_INFO("memory get.\n");PRINT_INFO("uiDaddr = %08x, uiSaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);memGet(pArg->uiDaddr, pArg->uiLength, pArg->uiSaddr, pArg->uiFormat);} else if (pArg->cOperate == 'p') {PRINT_INFO("memory put.\n");PRINT_INFO("uiDaddr = %08x, uiSaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);memPut(pArg->uiDaddr, pArg->uiLength, pArg->uiSaddr, pArg->uiFormat);} else if (pArg->cOperate == 'c') {PRINT_INFO("memory copy.\n");PRINT_INFO("uiDaddr = %08x, uiSaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);memCopy(pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);} else if (pArg->cOperate == 'm') {PRINT_INFO("memory compare\n");PRINT_INFO("uiDaddr = %08x, uiSaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);memCompare(pArg->uiDaddr, pArg->uiSaddr, pArg->uiLength, pArg->uiFormat);} else if (pArg->cOperate == 't') {PRINT_INFO("memory access test\n");PRINT_INFO("uiDaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiLength, pArg->uiFormat);memTest(pArg->uiDaddr,pArg->uiLength, pArg->uiFormat);} else if (pArg->cOperate == 'e') {PRINT_INFO("memory speed test\n");PRINT_INFO("uiDaddr = %08x, uiLength = %08x, uiFormat = %d\n",pArg->uiDaddr, pArg->uiLength, pArg->uiFormat);memSpeed(pArg->uiDaddr,pArg->uiLength, pArg->uiFormat);} else {memoryHelp();}return  (ERROR_NONE);
}
/*********************************************************************************************************END
*********************************************************************************************************/

SylixOS命令行下内存操作/测试工具相关推荐

  1. linux 的一些实用工具,linux 命令行下的一些实用工具

    linux 命令行下的一些实用工具 命令行下的一些常用应用: awesome                        适合geek的桌面管理器VM mc                     ...

  2. linux 网络冲浪,命令行下的网络冲浪工具命令行浏览器介绍

    Linux命令行是强大的工具,命令行是我们的日常工作,命令行更是我们日常生活.之前虫虫给大家写过一些命令的的介绍,命令行的工具,命令行下的开发.实际上命令行也是我们不可或缺的生活.本文我们来介绍一下命 ...

  3. [Shell学习笔记] 命令行下的高级网络工具cURL命令

    原文: http://www.1987.name/365.html Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯 ...

  4. Linux下内存压力测试工具memtest(使用心得)

    这里写目录标题 前言 1. 下载memtest 2. 安装 3. 交叉编译 4. 执行测试 5. 如何确认物理地址? 6. 关于uboot重定位 前言 关于memtest的介绍,网上内容很多很多.感兴 ...

  5. 推荐几个Linux命令行下性能监控小工具

    原文链接 在Linux中,CPU,内存等系统状态可以通过top命令查看,或者用图形界面的工具,如gnome-system-monitor.但是,有时候,想知道更详细的信息,比如说进程树之类的,网络具体 ...

  6. 秒杀迅雷的linux命令行下载文件以及常用工具:wget、Prozilla、MyGet、Linuxdown、Curl、Axel

    本文介绍常用的几种命令行式的下载工具:wget.Prozilla.MyGet.Linuxdown.Curl.Axel 下面就为大家详细介绍一下这些工具 1. Wget Wget是一个十分常用命令行下载 ...

  7. cmd命令行下怎么切换目录 命令行改变目录

    cmd是windows下一个非常常用的工具,但是它默认的地址却是不变的.有时候,我们想进行别的盘符,别的目录下面的操作,那么我们该怎么办呢?今天,小编就来教大家cmd命令行下怎么切换目录 工具/原料 ...

  8. linux抓包命令tcptrace,每天学习一个命令:tcpdump 命令行下抓包

    tcpdump 是一个运行在命令行下的抓包工具,如果想知道网络中有什么在流通,那么 tcpdump 就是一个很好的工具.它允许用户拦截和显示发送或收到过程中网络连接到该计算机的 TCP/IP 和其他数 ...

  9. mysql 在cmd命令行下操作遇到的转义字符

    今天在cmd命令行下,用mysqldump来进行备份数据库,遇到了这个一个问题, 先看命令如下,  mysqldump -uyaner -pyaner&123 -h 192.168.0.5 t ...

最新文章

  1. 【Java】 剑指offer(40) 最小的k个数
  2. 前端定时器 setInterval 和 setTimeout
  3. java月份列表_java – 如何获取两个日期之间的月份和年份列表
  4. Cookie实现用户登录记住密码,实现自动登录
  5. [翻译]asp.net ajax xml-script教程(二)
  6. python学习06
  7. Python:numpy数组转换为json格式
  8. PHP生成海报 文字描边,如何使用css text-stroke属性来制作文字描边?(源代码)...
  9. tensorflow Keras的搭建训练步骤
  10. 3d建模和计算机专业对口吗,学3d建模有学历门槛吗
  11. Python笔记:集合的概念和使用
  12. 如何面对软件工程师考试?
  13. android水波纹教程,Android实现简单水波纹效果
  14. Anomaly Detection with partially Observed Anomalies论文笔记
  15. LineRenderer画虚线
  16. 校园网WiFi免认证软件监控
  17. 百度飞桨携手精诺数据打造智慧熔炼,AI让年轻人一秒变身“老师傅”
  18. OpenCV进阶--图像颜色空间
  19. 传统的冒泡排序(一)
  20. 用户登录之SHA1加密

热门文章

  1. FPS能重塑英雄联盟的辉煌吗?Valorant公测半年有什么优势和不足?
  2. 未知USB设备(设备描述符请求失败)
  3. 微信小店二次开发_微信小店二次开发功能套餐列表
  4. wpsa4排版_WPS如何快速排版
  5. ppt模板目录页如何排版设计?
  6. 010 editor如何复制16进制
  7. 介绍一下xgb_xgboost实战,一篇就好
  8. win32Day06:控件
  9. php开发工具PhpStorm新版本V2022.1 新增功能亮点介绍
  10. 和block循环引用说再见