[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文]
目录
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文]
前提
准备工作
内容
问题也就是注意事项
前提
准备工作
- 创建基于ART-PI开发板(STM32H750)的工程,在RT-Thread Studio中创建工程。
- 搭建文件系统,无论是ROMFS,RAMFS,LFS,FAT都行,不同的文件系统依赖的存储介质不同,比如RAMFS依靠RAM,速度肯定更快,而FAT依赖SD Card 或FLASH,速度相对就慢一些。各个文件系统能够存储文件的大小也各不相同,RAMFS受限于RAM的大小,而FAT受限于FLASH或SD CARD的大小,一般情况下用FAT用的多,因为空间够大.
- 使能YMODEM协议.通过YMODEM协议可以直接把文件下载到文件系统里(ARTPI接受)。也可以把文件系统里的哪些文件保存到本地电脑上(ARTPI发送)
- 安装xshell工具.
内容
在准备工作就绪后,
tab可以显示出ry sy的命令
ls 命令可以看到flash目录下的文件(图中的文件是我自己上传的)
在这里,基于不同的YMODEM的版本,通过源码得知有一个版本是只能下载到根目录下,这个时候要么换最新的YMODEM版本,要么把文件系统挂载到根目录下.另外YMODEM的第一个版本(对应的RT Thread 的库版本是4.1.0)对文件重传处理不是特别好.
命令
ry/sy [文件路径] [传输的设备名]
ry是下载文件进板子,sy是传教文件到本地电脑.
默认会通过控制台输出设备进行传输,而控制台输出设备通常是串口设备.
比如下载文件到/flash目录下,使用串口1去传输命令为:
ry /flash uart1
正常的情况下,应该不需要瞎折腾就能实现文件互传.但在使用控制台使用ry命令下载文件的时候会有一些问题.sy命令下载文件到本地我使用一切良好.下面就是ry指令的一些问题以及解决方法和思路.
问题也就是注意事项
以下都是在默认使用控制台串口时会遇到的:(多开其他的串口来传输文件肯定就没有这个问题)
控制台串口和日志抢占设备的问题?通常也会卡死在这?
首先ymodem协议传输与日志抢占同一个串口设备,日志间接的会去调用rt_kprintf,这里会出现问题,应该在ymodem传输协议时关闭所有日志,或者让控制台的输出设备指向RT_NULL(这样在打印的时候才会什么都不做)
- 关闭使能内核调试
- 关闭所有日志
这很困难,因为RT-Thread不只是有ulog这一个日志,通过实践,哪怕没有开启ulog,依然可以使用LOG_X去打印输出,而RT-Thread庞大的软件包和组件,总不可能一个个去注释.说到这里,当使用FAT文件系统去读写文件时,会自动去访问RTC设备读取时间,若是没有RTC设备,打印 not find a RTC ,若不注释,在使用ry 命令时若输出则直接卡死.还是推荐关闭控制台输出设备.
- 关闭控制台输出设备,让日志输出无效.
/*enable or disable console uart device*/
void DisableConsole(rt_uint8_t flag)
{
static rt_device_t old_device;
if(flag == 1){
if(_console_device != RT_NULL)
{
old_device = _console_device;
}
_console_device = RT_NULL;
}
else
{
_console_device = old_device; //recover
}
}
RTM_EXPORT(DisableConsole);
在组件文件\rt-thread\components\utilities\ymodem\ry_sy.c 的ry函数,在使用控制台的串口设备下载文件前打开,下载后关闭。
- 在FAT文件系统下,若在使用YMODEM协议下载文件时报 not find a RTC,导致卡死,这是因为FAT文件系统在读写操作时会去访问RTC设备读取时间,若没有开启RTC设备则报这个错误,这也是因为rtt在log日志打印上没有一个统一的开关,ulog哪怕关闭使能,LOG_X的函数也能用,这里找到打印这句话的代码注释就行.
传输速度太慢的问题?
这里明确给出在9600波特率下,1k为一个分组下,速度大概是1k/s左右,而在115200下,速度通常能达到6-10k/s的速度.所以高的波特率肯定比低的波特率要快.
xshell下设置分组大小为1K ,相当于提升了一个包的数据大小
使用工具分析YMODEM的数据.
使用Bus Hound 对串口数据进行抓包,判断是否是因为出错把时间花在重传上了.握手倒是没什么需要关注的,重点关心重传:
比如一次PC发送完数据包后回应06 则接收端(ARTPI)正确接受,回应为15则丢包(没有回应)
参考YMODEM协议格式
YModem协议简介_阿卡基YUAN的博客-CSDN博客