前言
硬件平台:RT-Thread ART-Pi STM32H750XBH6开发板 H750开发板
开发软件:RT-Thread Studio
相关组件:ulog日志、SPI、SFUD、easyflash、ulog_easyflash
官方资料:ulog日志
实验目的:使用开发板实现各个等级的彩色日志输出。
一、创建基本工程
请移步至《RT-Thread Studio驱动SD卡》教程,参考“ 一、创建基本工程 ”。
二、配置RT-Thread Settings
双击左侧项目资源管理器下所建工程的“RT-Thread Settings”打开可视化配置。
找到“ulog日志”。
左键单击打开并保存,配置会自己生效。
三、瞎捣鼓
莽点,直接编译下载看看效果…有效果就有鬼了!🙄
为什么啥输出都看不到呢?因为并没有调用log的输出函数呀啊😂。fine,我们一起来找朋友,看看我们添加的包在哪。找呀找呀找朋友…找到了。
打开看看我们的“朋友”家都有啥好东西。😍
摆在眼前的有3个文件,而 .h文件通常负责函数的对外声明。而“ulog.h”内正好看到有log输出的功能函数,例子都给出来了简直不要太明显!😃
作为一名有多年写bug经验的Ctrl C/V攻城狮,懂的啦😎。输出个最高级的“hello world!”试试效果,注意要include一下ulog.h不然就真的写bug了。
一切就绪,编译下载整起🧐,很显然已经成功输出日志了。日志输出与普通的串口打印有啥不同?不都是打印字符串到终端嘛。很直观的,log有颜色,而且根据等级的不同会对应不同的颜色。最后一个“LOG_RAW”是无格式输出,仔细看在最后一行呢。
四、深入探究
既然日志已经成功输出了,撤退睡觉去…这个年纪你睡得着啊这个年纪,再深挖一下看看还有什么好东西🧐。单纯地通过串口输出日志的确能方便我们调试设备,但略有不足的是得时时刻刻接着电脑,否则就无法接收数据了。
那么有什么方法能解决这点不足呢?还真有!可以将数据保存到片外flash中,接下来便是具体操作方式。
1、修改ulog配置
继续打开RT-Thread Settings,选中ulog右键选择“详细配置”。
下面是之前使用的默认配置。
为了保证中断与ulog不冲突,使能ISR功能;为了保证系统发送断言故障时日志能正常输出,使能断言检查;同步模式下的中断日志只能输出到控制台后端,而异步模式下中断日志可以输出到所有后端,使能异步输出模式;其他配置自己看着办问题不大,具体配置如下:
看看结果,为毛线时间都是一样的呢?就是因为异步模式,该模式下日志先存储在缓冲区,然后由专门的线程进行输出,因此时间相近的日志打印出来的时间就一样了。
2、添加组件
在软件包中心添加软件包。
RT-Thread相比于其他实时操作系统的一大优势就是有很多的软件包,直接添加即可使用。想将ulog保存到flash中便要使用ulog_easyflash软件包。
添加之后回到RT-Thread Settings却看到有两个软件包,分别是ulog_easyflash和easyflash。其实ulog_easyflash相当于ulog和easyflash的连接纽带,实际实现写入数据到flash的是easyflash。
3、填坑
以我这耿直的性格,配置完保存后肯定得先编译一下。wtf???删库跑路吧,还玩个锤子😓。。。。。。
仔细看一下报的错,都是undefined。如此看来也许还有救,可能是缺少了某个文件而已。
打开报错的文件夹,右键打开“打开资源所在目录”,返回上一层。看到有一个md说明文件,那就点开瞅瞅有啥呗。
其中有一点值得注意的是:docs文件夹内有通用移植说明,这就好办了,进去看看呗。
再打开里面的说明文件,里面介绍有两种驱动:flash抽象层和万能SPI Flash驱动库。
下面以sfud为例,将“ef_sfud_port.c”文件复制到上一层目录的src文件夹下,然后再编译一下工程看看结果。
如图项目资源管理器下会有“ef_sfud_port.c”文件,如果没有就鼠标右键多刷新几次。
重新编译后发现仍有报错,缺少“sfud.h”文件。
再次打开RT-Thread Setting,使能SFUD。
保存后重新编译,0 errors, 0 warnings 完美😎
下载验证一下结果。读不出来???而且连命令都找不到。这坑真的没完没了了!
冷静下来好好想想,三个组件(ulog、ulog_easyflash、easyflash)似乎只配置了ulog,那就再看看另外两个组件有什么需要配置咯。EasyFlash默认配置如下:
LOG选项使能 “在Flash上保存日志” 并配置保存日志区域的大小(255*4096),而我们也可以看到下面的 “ulog_easyflash”选项也已经开启 。
老规矩,保存编译下载再看看效果。ulog_flash read读取flash日志的指令已经成功识别到了,但是什么数据都读不出来。还缺点什么呢?三个组件都配置过了,RT-Thread有自动初始化机制,像前面单独使用ulog时添加完组件就直接可以用了。等等,easyflash有两种配置方式,我们选择的sfud模式是直接复制 “ef_sfud_port.c” 来的,可能还真的需要我们修改配置并手动初始化。
打开我们之前添加进来的文件,这里声明了 spi flash 设备存在但是却没有配置,看来是要我们自己去配置了。
找到easyflash_init()初始化函数,在该函数下需要先做两件事:1、注册SPI设备。2、将SPI挂载到sfud flash上。
根据原理图,确定连接到片外flash(W25Q128)的是SPI1。
注册SPI的时候需要传进的参数是NSS片选管脚。配置完SPI1之后再将SPI1注册到sfud_flash中。
配置SPI前要通过宏来开启,否则编译会报错。
最后在main函数里调用一下
#include "easyflash.h"
easyflash_init();
就大功告成了。
五、效果验证
按下复位后,能看到W25Q初始化成功,SPI初始化成功及打印的不同等级LOG信息。
通过list_device查看到所有挂载了的设备。
重头戏来了,通过ulog_flash read可以读出flash中的数据。
使用ulog_flash clean擦除数据后再读一次,能发现flash中已经没有数据了。
总结
将log数据存储到flash中虽然能脱离电脑实现数据保存,但是在读取数据时还是需要拿电脑连接开发板并且数据传输也需要一定的时间。因此之后将再出一篇将log数据保存到SD卡中的教程。
考虑到本教程细节比较多,因此有需要的可以点击这里下载源码。注:本代码只适用于ART-Pi开发板,其他卡发板虽不适配但有一定参考价值。