|
本帖最后由 来俩不甜的 于 2018-6-6 10:16 编辑
场景:使用stm32f407ve, cpu本身有192KB RAM,无外接ram。现象:jpeg显示大图可以,但拉窗现象严重。小图直接不显示。
分析:粗浅的见解,有不对的地方恳请大佬指出。
- // 使用存储设备发现不显示图片
- // 猜测是内存不足,分析如下:
- /*
- * jpeg解码本身就需要约33KB,还要再加上图片的 x大小 * 80bytes
- * 那么此处horse.jpg解码需要的ram = 33 + 160 * 80 / 1024 = 45.5KB
- * 这45.5KB会在GUI_JPEG_Draw()函数用到
- * horse.jpg : 160 * 128 25821bytes(25.2KB)
- * GUIConf.c中为emwin分配的内存是100KB
- * 那么读出这幅jpg图片要用25.2KB
- * 然后创建存储设备 xsize * ysize * bpp / 8 = 160 * 128 * 16 / 8 = 40KB
- * 这两步就使用了65.5KB,再加上emwin本身消耗的内存(不知道,可参考安富莱v6教程31页)
- * 剩余内存可认为是30KB < 45.5KB,会导致解码失败,因此图片不会显示
- * 前面定义的sd卡路径中,大图为什么显示?
- * 因为这里的存储设备分配失败,有足够的内存来解码jpeg,因此显示,但刷新速度肉眼可见,
- * 使用体验非常差
- */
- void MyDemo(void)
- {
- FRESULT res;
- UINT br;
-
- char *_acBuffer;
- GUI_HMEM hMem;
- GUI_MEMDEV_Handle hMemJPEG;
- GUI_JPEG_INFO JpegInfo;
-
- res = f_open(&file, g_strJpgPath2, FA_OPEN_EXISTING | FA_READ);
- if (res != FR_OK)
- {
- printf("Can't open %s\n", g_strBmpPath);
- return;
- }
-
- // 申请一块内存空间,并将其清零
- hMem = GUI_ALLOC_AllocZero(file.obj.objsize); // 消耗25.2KB
- if (!hMem)
- {
- printf("GUI_ALLOC_AllocZero error\n");
- return;
- }
-
- // 将申请到的内存的句柄转为指针类型
- _acBuffer = GUI_ALLOC_h2p(hMem);
-
- res = f_read(&file, _acBuffer, file.obj.objsize, &br);
- if (res != FR_OK)
- {
- printf("Read file error!\n");
- GUI_ALLOC_Free(hMem);
- return;
- }
-
- GUI_JPEG_GetInfo(_acBuffer, file.obj.objsize, &JpegInfo);
-
- hMemJPEG = GUI_MEMDEV_CreateEx(0, 0, JpegInfo.XSize, JpegInfo.YSize, GUI_MEMDEV_HASTRANS); // 消耗40KB
- printf("hMemJPEG = %d\n", hMemJPEG);
- GUI_MEMDEV_Select(hMemJPEG);
- GUI_JPEG_Draw(_acBuffer, file.obj.objsize, 0, 0); // 内存不足,解码失败
- GUI_MEMDEV_Select(0);
-
- GUI_ALLOC_Free(hMem);
-
- f_close(&file);
-
- GUI_MEMDEV_WriteAt(hMemJPEG, 0, 0);
-
- GUI_MEMDEV_Delete(hMemJPEG);
- }
复制代码
|
|