OpenEdv-开源电子网

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

SD卡挂文件系统读60K大小的JPG文件读了八分钟,搞不懂为什么会这么慢

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-11-16
在线时间
6 小时
发表于 2021-11-21 16:42:32 | 显示全部楼层 |阅读模式
1金钱
就如标题所述,我并没有打错数字,它真的这么慢我都好奇怎么回事,搞不懂为什么会这样。 用的是正点原子F407探索者开发板,最近搞STemWIN_5.44+μ/COSIII,想试试能不能做出类似手机桌面那种效果,尝试过用位流图的方式显示桌面图像,这会SD卡的读写速度是正常的,700K的文件的读取一下就完成了,但是并没有成功显示,我就换成了JPG试试,魔幻的场面就来了,58.9K的文件读了8分钟有多然后读取失败了,现在就很郁闷。程序是把JPG图像的数据读到分配到外部SRAM的GUI显存里边靠内存设备来刷新图像显示。    我设置的文件系统最小块是512  最大4096下边这函数有个位流图版本的,区别只是调用的GUI库函数不同,读取操作那都是一样的,但是那个版本它读取比这玩意正常多了。说实话这速度折合来算 123字节/秒  实在慢得离谱了。

static char *_acbuffer = NULL;
GUI_MEMDEV_Handle hJPEG;

static WM_HMEM LoadJPEG_UsingMEMDEV(const char *sFilename)
{
        OS_ERR     err;
        WM_HMEM hMem;
        GUI_JPEG_INFO Jpeginfo;
       
        OSSchedLock(&err);
        result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ);
        if ((result != FR_OK)) {
                printf("文件打开失败!\r\n");
                _acbuffer[0]='\0';
        }
       
        hMem = GUI_ALLOC_AllocZero(file.fsize);
        _acbuffer = GUI_ALLOC_h2p(hMem);

        /* 读取图片数据到动态内存中 */
        result = f_read(&file, _acbuffer, file.fsize, &f_num);
        if (result != FR_OK) {
                printf("文件读取失败!\r\n");
        }
        f_close(&file);
        OSSchedUnlock(&err);
       
        GUI_JPEG_GetInfo(_acbuffer, file.fsize, &Jpeginfo);
       
        /* 创建内存设备 */
        hJPEG = GUI_MEMDEV_CreateEx( 0, 0,                /* 起始坐标 */
                                                                 Jpeginfo.XSize,      /* x方向尺寸 */
                                                                 Jpeginfo.YSize,      /* y方向尺寸 */
                                                                 GUI_MEMDEV_HASTRANS);/* 带透明度的内存设备 */
        /* 选择内存设备 */
        GUI_MEMDEV_Select(hJPEG);
        /* 绘制JPEG到内存设备中 */
        GUI_JPEG_Draw(_acbuffer, file.fsize, 0, 0);
        /* 选择内存设备,0表示选中LCD */
        GUI_MEMDEV_Select(0);
        /* 释放内存 */
        GUI_ALLOC_Free(hMem);
       
        return hJPEG;
}



最佳答案

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

奇怪,那就得逐步排查了。 我本猜测是JPG解码比较花费时间,看来还没运行到解码那里,考虑一下是不是内存溢出,OS的话应该要注意任务的堆栈情况,局部变量如果太多也可能会出问题的。 你的单片机是啥型号?图像占用多大内存?解码后是否占用额外更大的内存?可否介绍一下内存的占用情况? 我用过一个开发板是没有用GUI、没有OS,直接裸奔,fatfs用spi接口从SD卡读取文件(相当于一系列BMP图像)直接输出到SPI接口显示屏,播放 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-11-21 16:42:33 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-11-22 15:27 编辑
斯大林重锤 发表于 2021-11-22 15:13
我在debug打断点设在f_read下一句。然后等程序跑,它一直停在这个函数内执行,大概过了8分钟,程序才停到 ...

奇怪,那就得逐步排查了。
我本猜测是JPG解码比较花费时间,看来还没运行到解码那里,考虑一下是不是内存溢出,OS的话应该要注意任务的堆栈情况,局部变量如果太多也可能会出问题的。
你的单片机是啥型号?图像占用多大内存?解码后是否占用额外更大的内存?可否介绍一下内存的占用情况?
我用过一个开发板是没有用GUI、没有OS,直接裸奔,fatfs用spi接口从SD卡读取文件(相当于一系列BMP图像)直接输出到SPI接口显示屏,播放badapple很流畅。

考虑下裸奔吧。

专治疑难杂症
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-11-22 10:48:45 | 显示全部楼层
你测的是LoadJPEG_UsingMEMDEV()的时间?还是f_read()的时间?
专治疑难杂症
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-11-16
在线时间
6 小时
 楼主| 发表于 2021-11-22 15:13:56 | 显示全部楼层
LcwSwust 发表于 2021-11-22 10:48
你测的是LoadJPEG_UsingMEMDEV()的时间?还是f_read()的时间?

我在debug打断点设在f_read下一句。然后等程序跑,它一直停在这个函数内执行,大概过了8分钟,程序才停到我设的断点处。 不知道为什么这么慢了,就很奇怪。即使我不进入debug,直接上电让它跑,它也是会停在这里8分钟左右才到后边去。 在程序里边就俩任务,调用这个函数的任务优先级是最高的,在这里边关了调度,读取完了以后才恢复。另一个任务是LED闪烁的,在这个函数卡完以后LED才会闪。所以很确定它在这卡了
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-11-16
在线时间
6 小时
 楼主| 发表于 2021-11-23 15:07:06 | 显示全部楼层
LcwSwust 发表于 2021-11-22 15:23
奇怪,那就得逐步排查了。
我本猜测是JPG解码比较花费时间,看来还没运行到解码那里,考虑一下是不是内 ...

基于你提出的,我修改过堆栈,换过另一个图像读取。在堆栈调小了就会在开始第一次任务调度的时候直接hard fault。后来换了另一张分辨率更小的图像读取,这个时候SD卡读取的速度快了很多。 我想应该是内存不够用的问题。 我用的这个407开发板接的是1M的外部RAM。 我忽略了这个硬件情况下想要在emWIN上边显示一张铺满屏幕的图像不应该是直接读一张800*480的,而是要用分辨率小的图像进行缩放,直接去搞这样内存会不够用。今天按照这个思路用一张小的图像进行缩放成功显示了。 谢谢
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-11-23 15:23:42 | 显示全部楼层
斯大林重锤 发表于 2021-11-23 15:07
基于你提出的,我修改过堆栈,换过另一个图像读取。在堆栈调小了就会在开始第一次任务调度的时候直接hard ...


专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 15:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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