OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6068|回复: 11

407写数据到txt卡太慢问题大伙遇到过吗?

[复制链接]

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
发表于 2022-10-3 17:03:24 | 显示全部楼层 |阅读模式
1金钱
目前项目有需求是用F407ZGT每10ms使用外部中断捕获然后将捕获到的几个数据写进txt,debug发现具体的函数花的时间有时候会超过10ms,是f_printf函数太耗时了吗?

最佳答案

查看完整内容[请看2#楼]

根据以往的经验,文件系统适合批量操作,也就是你写入5字节与写入500字节耗费时间可能是差不多的。 建议先将数据存入队列,等数据量比较多了再整体写入。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4132 小时
发表于 2022-10-3 17:03:25 | 显示全部楼层
根据以往的经验,文件系统适合批量操作,也就是你写入5字节与写入500字节耗费时间可能是差不多的。
建议先将数据存入队列,等数据量比较多了再整体写入。
专治疑难杂症
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-3 19:47:02 | 显示全部楼层
LcwSwust 发表于 2022-10-3 19:12
根据以往的经验,文件系统适合批量操作,也就是你写入5字节与写入500字节耗费时间可能是差不多的。
建议先 ...

txt文件有点大,20M的大小,六十万行的数据,好像没有这么大的数组或者队列,而且我们这边采的数据不能停,漏了结果不一样
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-3 19:47:32 | 显示全部楼层
有没有必要我把f_printf换成f_puts或者f_write试试
回复

使用道具 举报

12

主题

3397

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8669
金钱
8669
注册时间
2020-5-11
在线时间
4132 小时
发表于 2022-10-3 20:35:46 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-10-3 20:38 编辑
59A 发表于 2022-10-3 19:47
txt文件有点大,20M的大小,六十万行的数据,好像没有这么大的数组或者队列,而且我们这边采的数据不能停 ...

不是让你弄整个文件那么大的缓冲区,比如,你每10ms采集一次,可以把10次采集的数据存到一个数组里,也就是每100ms保存一次到文件。把你的代码弄上来瞧瞧。

专治疑难杂症
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2022-10-4 10:41:15 | 显示全部楼层
59A 发表于 2022-10-3 19:47
txt文件有点大,20M的大小,六十万行的数据,好像没有这么大的数组或者队列,而且我们这边采的数据不能停 ...

分文件写啊,一本电子小说,可能也没20M  

楼上说的意思是,聚满了4096 或者N个字节后,再统一写到txt里,4k的buff总能拿出来吧
学无止境
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-6 21:35:39 | 显示全部楼层
这两天仔细看了一下程序,是已经用了两个数组轮流换的,用的定时器,时间到了就换数组2存数据同时把数组1的内容f_printf到txt或者dat文件里面
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-6 21:40:44 | 显示全部楼层
这两天仔细看了下程序,是用了两个数组的,定时器10ms时间到了就切换数组2来存数据,同时把数组1的数据用f_printf打印到txt或者dat文件里面,时间到了再继续切换
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-6 22:01:32 | 显示全部楼层
  1. void SD_Printf(void)
  2. {  
  3.        
  4.                 //UINT br, bw;
  5.                 uint16_t i,j,count[4]={0},index;
  6.                



  7.                 index = CogWheelbuffer.currentindex;
  8.                
  9.                         for(j=0;j<WHEEL_COUNT;j++){
  10.                                         count[j]=CogWheelbuffer.count[index][j];
  11.                                         CogWheelbuffer.count[index][j]=0;
  12.                                  }               
  13.          

  14.                

  15.                 for(j=0;j<WHEEL_COUNT;j++)
  16.                 {
  17.                         res = f_printf(&fdst, "%d\t",count[j]);    //先写入数据个数
  18.                         for(i=0;i<count[j];i++){                
  19.                                 res = f_printf(&fdst, "%d\t",CogWheelbuffer.buffer[index][j][i]);         
  20.                         }
  21.                         res = f_printf(&fdst,"\n");       
  22.                 }

  23. }
复制代码



主while函数基本是在重复这个函数,不断地把全局变量数组赋给函数里的临时变量数组,然后在把临时变量的数组不断f_printf打印出来
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-7 09:44:21 | 显示全部楼层
现在有个问题是我把打印函数里用RTS计算ms都打印出来看了, f_printf函数在一个循环里用多两三次好像就会卡在某个地方卡100ms左右,但是这时中断还能进来,数据就一直近,下次一次循环那个数组就突然多了两三倍数据
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-7 09:46:33 | 显示全部楼层
昨晚发帖没发出来,先把昨晚的说了。
首先这两天仔细看了一下程序,是用了两个数组的,定时器时间到了就切换数组2存数据同时把数组1的数据打印到txt文件,下一次定时器时间到了就继续切换数组存数据,另一个数组就打印到TXT文件
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-8-3
在线时间
21 小时
 楼主| 发表于 2022-10-7 09:50:23 | 显示全部楼层
  1. void SD_Printf(void)
  2. {  
  3.        
  4.                 //UINT br, bw;
  5.                 uint16_t i,j,count[4]={0},index;
  6.                

  7.                 index = CogWheelbuffer.currentindex;
  8.                
  9.                         for(j=0;j<WHEEL_COUNT;j++){
  10.                                         count[j]=CogWheelbuffer.count[index][j];
  11.                                         CogWheelbuffer.count[index][j]=0;
  12.                                  }               
  13.          

  14.                 for(j=0;j<WHEEL_COUNT;j++)
  15.                 {
  16.                         res = f_printf(&fdst, "%d\t",count[j]);    //先写入数据个数
  17.                         for(i=0;i<count[j];i++){                
  18.                                 res = f_printf(&fdst, "%d\t",CogWheelbuffer.buffer[index][j][i]);//        FIL* fp,        const TCHAR* fmt,        ...                         
  19.                         }
  20.                         res = f_printf(&fdst,"\n");       
  21.                 }

  22. }
复制代码



主函数里基本是这个代码,把数据的全局变量赋值给临时变量count,然后再分别f_printf打印到txt文件
昨把后面的for循环屏蔽了减少了用f_printf的次数之后打印出来再看毫秒打印时间就没有了偶尔卡在 循环里100ms不动的情况
不知道为啥,目前这里体现出来的现象就是 f_printf一次循环里连续用多几次之后就会久不久在循环里卡个100ms不动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表