嵌入式技术william hill官网
直播中

郑成枝

7年用户 1340经验值
私信 关注
[问答]

ulog保存日志文件如何在掉电时把缓存区内容保存起来

ulog保存日志文件,如何在掉电时把缓存区内容保存起来?

原因

打印ULOG日志文件时发现,有些日志文件被截断

分析发现可能为掉电时,有部分数据还是缓冲区内,缓冲区没满不会把当前缓冲区内容保存至文件中。

这就导致掉电时的数据不正常或者被截断。

正常运行时,使用“cat”命令查看文件

发现文件末尾的日志缺失的,原因和上述一样。缓冲区没满,没有把当前数据保存起来

如何解决

1.如何判断掉电?

ULOG组件有这部分功能吗?

没有的话,如何判断掉电?RTT有相关驱动吗?

2.掉电的时候,时间足够保存文件吗?

硬件上是否要加入电容?

缓冲区改小点?

回帖(3)

张国厚

2022-11-24 11:46:03
用的什么文件系统?fatfs是不支持掉电保护的,littlefs是支持掉电保护的。

ulog是没有掉电保护的,可以使用 STM32 的 PVD 机制来进行掉电检测,检测到电压低于一定值的时候就刷缓冲区把日志写入到文件系统中。如果使用 PVD 机制进行掉电检测硬件上最好加一个大电容(超级电容),这样掉电的过程会慢一些,检测到掉电之后可以做的事情多一些。

可以测试一下 PVD 的功能,看看不加电容时能做多少事情。
1.jpg
2.jpg
比如设置等级为 3.1V,电源电压低于 3.1V 时会产生一个中断,在中断里面就把系统调度关了,只执行保存缓冲区日志的工作。



举报

郑成枝

2022-11-24 11:46:15
我尝试直接在PVD中断中刷新缓冲区,即存入数据到FLASH中。
这样的操作会直接断言失败,不可在中断中使用互斥量。
然后我尝试单独开个0优先级线程阻塞等待PVD中断发出信号
在线程内进行刷新缓冲区
这样测得150us左右线程开始运行。
但是没办法完成整个数据的保存 1.jpg
刷新缓冲区的操作测得最慢需要200ms时间。

我想问一下


PVD中断发送信号量,在外部开启线程触发这种模式是否合理?我这保存需要200ms的话,大电容需要多少?这个威廉希尔官方网站 如何实现?实现这个威廉希尔官方网站 后是否在开机时也会延时上电?

举报

张国厚

2022-11-24 11:46:26
1 我觉得可以直接在 PVD 的中断处理函数里面操作,反正已经检测到掉电了,那就是到了处理紧急事情的情况了,就不要发送信号量然后由其他线程来处理了,这样会浪费一点时间。直接在中断处理函数中把调度器关了,就执行你的紧急处理代码就行。
2 大电容我也不清楚要多大,不是专门做硬件的,威廉希尔官方网站 大概就是直接并联在VCC和GND之间就行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分