新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2021-11-16
- 在线时间
- 6 小时
|
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接口显示屏,播放 ...
|