代码见
一. 前言前面我们实现了 存储的打印与修改,不适合批量操作。我们现在继续来 移植xmodem,这样可以批量的导入或者到处存储的内容。比如 到处rom,ram,寄存器内容用于调试。也可以批量导入内容到ram和寄存器区域。 二.过程Xmodem实现见 https://mp.weixin.qq.com/s/QSYKxND3DTyQZ0JtnSqkzQ XMODEM协议介绍与高效高可移植非阻塞版本实现 shell_func.c中申明函数 static void rxmemfunc(uint8_t* param); static void sxmemfunc(uint8_t* param); g_shell_cmd_list_ast中添加命令行 { (uint8_t*)"rxmem", rxmemfunc, (uint8_t*)"rxmem addr[hex] len"}, { (uint8_t*)"sxmem", sxmemfunc, (uint8_t*)"sxmem addr[hex] len"}, 实现函数如下 实现io接口 static uint8_t rxtx_buf[1029]; static uint32_t getms(void) { return 0;//get_ticks(); } static uint32_t io_read(uint8_t* buffer, uint32_t len) { return uart_read(1,buffer, len); } static uint32_t io_getrxlen(void) { return uart_getrxlen(1); } static void io_read_flush(void) { uint8_t tmp; while(0 != uart_read(1,&tmp, 1)); } static uint32_t io_write(uint8_t* buffer, uint32_t len) { uart_send(1,buffer, len); return len; } 实现mem操作接口,和传输函数 static uint32_t mem_read(uint32_t addr, uint8_t* buffer, uint32_t len) { memcpy(buffer, (uint8_t*)addr, len); return len; } static uint32_t mem_write(uint32_t addr, uint8_t* buffer, uint32_t len) { memcpy((uint8_t*)addr, buffer, len); return len; } static void rxmemfunc(uint8_t* param) { uint32_t addr; uint32_t len; int res = 0; #if 0 if(2 == sscanf((const char*)param, "%*s %x %d", &addr, &len)) #else char* p =(char*)param; while(1){ /* 跳过%*s部分 */ if((*p > 'z') || (*p < 'a')){ break; }else{ p++; } } long tmp; xatoi(&p, &tmp); addr = tmp; xatoi(&p, &tmp); len = tmp; #endif { xprintf("rxmem to 0x%x %drn",addr,len); xmodem_cfg_st cfg= { .buffer = rxtx_buf, .crccheck = 0, .getms = getms, .io_read = io_read, .io_getrxlen = io_getrxlen, .io_read_flush = io_read_flush, .io_write = io_write, .start_timeout = 60, .packet_timeout = 1000, .ack_timeout = 1000, .mem_write = mem_write, .addr = addr, .totallen = len, }; xmodem_init_rx(&cfg); while((res = xmodem_rx()) == 0); xprintf("res:%drn",res); } } static void sxmemfunc(uint8_t* param) { uint32_t addr; uint32_t len; int res = 0; #if 0 if(2 == sscanf((const char*)param, "%*s %x %d", &addr, &len)) #else char* p =(char*)param; while(1){ /* 跳过%*s部分 */ if((*p > 'z') || (*p < 'a')){ break; }else{ p++; } } long tmp; xatoi(&p, &tmp); addr = tmp; xatoi(&p, &tmp); len = tmp; #endif { xprintf("sxmem to 0x%x %drn",addr,len); xmodem_cfg_st cfg= { .buffer = rxtx_buf, .plen = 1024, .getms = getms, .io_read = io_read, .io_getrxlen = io_getrxlen, .io_read_flush = io_read_flush, .io_write = io_write, .start_timeout = 60, .packet_timeout = 1000, .ack_timeout = 5000, .mem_read = mem_read, .addr = addr, .totallen = len, }; xmodem_init_tx(&cfg); while((res = xmodem_tx()) == 0); xprintf("res:%drn",res); } } 三.测试导出rom的内容 四.总结以上 实现了存储,的导入导出,这样就可以dump代码,ram等内容在pc上进行分析 ,也可批量导入 数据到ram中和配置寄存器,方便调试 。
|