OpenEdv-开源电子网

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

H743使用Freertos+Fatfs出现的问题!

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-9-29
在线时间
4 小时
发表于 2022-11-3 15:19:18 | 显示全部楼层 |阅读模式
3金钱
先描述一下程序的功能。Freertos安排了2个主要任务:
任务一是通过SPI来获取雷达芯片的数据,获取频率为40Hz,雷达芯片会产生外部中断,在中断里面通过xTaskNotifyGive()告知任务一需要开始获取数据。每获取40次数据,即通过xTaskNotifyGive()通知任务二开始SD卡写入;SPI读写方式为轮询。
任务二是通过SDMMC连接SD卡,通过FATFS文件系统把雷达数据写入SD卡中,每次写入数据量是20482*40=819280byte。每写入60次(即每分钟)则关闭当前文件,换到下一文件继续写入,故单文件大小为20482*40*60=49156800byte。SD卡读写方式为DMA写入。

整个工程均为cubeMX生成,除SPI和SDMMC外还移植了正点原子例程的SDRAM、KEY、LED、MALLOC、DELAY、SYS程序。

问题描述如下:工程一开始可以正常运行,但运行一段时间后(时间不定,随机),SD卡写入报错,f_write函数返回错误类型为1,即FR_DISK_ERR。但当关闭当前文件,开启新文件继续写入后又不会报错。

可能出现问题的地方:通过debug追踪,发现报错的原因可能是不知道在哪个地方使得fp->err置为了1,导致f_write返回错误。

附上一些可能有帮助的图片:

图1.串口输出内容

图2.fp文件结构体err被置一

图3.任务二sd写入

图4.任务一spi读写


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-9-29
在线时间
4 小时
 楼主| 发表于 2022-11-3 16:10:11 | 显示全部楼层
图片没有上传成功,我再上传一下
下载.png
图1.串口输出内容
下载 (1).png
图2.fp文件结构体err被置一
下载 (2).png
图3.任务二sd写入
下载 (3).png
图4.任务一spi读写
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-4 00:58:33 | 显示全部楼层
FATFS有保护没有? 参考我的综合实验,读写到时候要保护,避免OS打断,影响正常工作
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-9-29
在线时间
4 小时
 楼主| 发表于 2022-11-4 10:36:21 | 显示全部楼层
正点原子 发表于 2022-11-4 00:58
FATFS有保护没有? 参考我的综合实验,读写到时候要保护,避免OS打断,影响正常工作

FATFS保护是指添加临界区保护吗?这个可能做不到,因为我有一个40hz的外部中断,而SD卡单次写入时间长达500ms
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-9-29
在线时间
4 小时
 楼主| 发表于 2022-11-4 10:38:09 | 显示全部楼层
由于代码较多,无法全部截图发上来,需要看哪些代码我单独截图发送
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-11-4 17:01:29 | 显示全部楼层
W25 可以上那个叫调度锁还是啥来着的试试
日常敲键--头秃一片
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2022-9-29
在线时间
4 小时
 楼主| 发表于 2022-11-5 12:52:18 | 显示全部楼层
日渐秃兀 发表于 2022-11-4 17:01
W25 可以上那个叫调度锁还是啥来着的试试

W25是指?我这里FATFS管理的是SD卡,您是指管理FLASH吗?
另外调度锁是指vTaskSuspendAll()吗?
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-11-7 09:24:19 | 显示全部楼层
c852050675 发表于 2022-11-5 12:52
W25是指?我这里FATFS管理的是SD卡,您是指管理FLASH吗?
另外调度锁是指vTaskSuspendAll()吗?

你不去搜一下了解了解你怎么知道他这个怎么玩
日常敲键--头秃一片
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-8 00:32:32 | 显示全部楼层
c852050675 发表于 2022-11-4 10:36
FATFS保护是指添加临界区保护吗?这个可能做不到,因为我有一个40hz的外部中断,而SD卡单次写入时间长达5 ...

那你这个问题就不好解决
40Hz也不快,应该问题不大的。临街保护只对的一次数据写入/读取有效,并不是要把所有数据写完/读完。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-8 00:32:43 | 显示全部楼层

  1. vu8 cnt0=0;
  2. vu8 cnt1=0;
  3. OS_CPU_SR cpu_sr=0;
  4. //进入临界区
  5. void ff_enter(FATFS *fs)
  6. {   
  7.         if(cnt0)
  8.         {
  9.                 printf("in shit:%d\r\n",cnt0);
  10.         }
  11.         if(fs->drv!=3)
  12.         {
  13.                 OS_ENTER_CRITICAL();        //进入临界区(无法被中断打断)     
  14.                 cnt0++;
  15.         }else
  16.         {  
  17.                 OSSchedLock();                        //阻止ucos调度
  18.                 cnt1++;
  19.         }  
  20. }
  21. //退出临界区
  22. void ff_leave(FATFS* fs)
  23. {
  24.         if(cnt0)
  25.         {
  26.                 cnt0--;
  27.                 OS_EXIT_CRITICAL();        //退出临界区(可以被中断打断)
  28.         }
  29.         if(cnt1)
  30.         {
  31.                 cnt1--;
  32.                 OSSchedUnlock();        //开启ucos调度        
  33.         }
  34. }  
复制代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 23:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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