那个如果移植了shell几条指令就可以测试,就看mcu死给你看没
[C] 纯文本查看 复制代码
[url]https://github.com/cctv180/utils_lib[/url]
#include "utils_lib.h"
// 定义一个宏,用于检查字符是否可打印
#define IS_PRINT(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
// 定义常量字符串,提高可读性和可维护性
#define TXT_OFFSET "| Offset |"
#define TXT_HEX_8 " 00 01 02 03 04 05 06 07 "
#define TXT_HEX_16 " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F "
#define TXT_HEX_32 " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F "
#define TXT_ASCII "| ASCII |"
/**
* 打印十六进制和ASCII表示的数据块。
*
* @param buf 要打印的数据块的指针
* @param size 数据块的大小(以字节为单位)
* @param number 每行打印的字节数(8、16、32等)
*/
void dump_hex(const void *_buf, uint32_t _size, uint32_t _number)
{
uint8_t *buffer = (uint8_t *)_buf;
const char *hex_table = (_number == 32) ? TXT_HEX_32 : ((_number == 8) ? TXT_HEX_8 : (_number = 16, TXT_HEX_16));
printf("\r\n%s%s%s\r\n", TXT_OFFSET, hex_table, TXT_ASCII); // hex table
printf("== base address 0x%08X length %d ==\r\n", (uint32_t)buffer, _size);
for (uint32_t i = 0; i < _size; i += _number)
{
printf("%08X: ", i);
for (uint32_t j = 0; j < _number; j++)
{
if (j % 8 == 0)
{
printf(" ");
}
if (i + j < _size)
{
printf("%02X ", buffer[i + j]);
}
else
{
printf(" ");
}
}
printf(" ");
for (uint32_t j = 0; j < _number; j++)
{
if (i + j < _size)
{
printf("%c", IS_PRINT(buffer[i + j]) ? buffer[i + j] : '.');
}
}
printf("\r\n");
}
}
/**
* 使用指定的值填充内存块。
*
* @param ptr 指向要填充的内存块的指针。
* @param value 要填充的值,可以是8位、16位、32位或64位。
* @param num 要填充值的数量。
* @param size 要填充值多少个字节。
*/
void mem_fill(void *_ptr, uint64_t _value, size_t _num, size_t _size)
{
unsigned char *p = (unsigned char *)_ptr; // 转换指针以便逐字节操作
while (_num-- > 0) // 遍历每个值
{
for (size_t j = 0; j < _size; ++j)
{ // 遍历每个值的每个字节
*p++ = (unsigned char)(_value >> (j * 8)); // 从value中提取字节并填充
}
}
} |