硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2208|回复: 5
收起左侧

[emWin] 按照V6-518_STemWin实验_BMP图片显示(裸机)例程多次频繁的读SD卡,显示BMP图片时,经常出现图片显示不出来

[复制链接]

25

主题

136

回帖

211

积分

高级会员

积分
211
发表于 2018-3-7 08:32:30 | 显示全部楼层 |阅读模式
按照V6-518_STemWin实验_BMP图片显示(裸机)例程的方式一显示BMP图片
/* 加载 BMP 图片到内存设备 */
hMemBMP = _ShowBMP2("1.bmp", 0, 0);
/* 用到 BMP 图片的时候,调用此函数即可 */
GUIMEMDEVWriteAt(hMemBMP 0 0);
开始显示时没什么问题,所有图片都能正常显示,但是在进行频繁切换图片后,有些图片就显示不出来了,
调试中看文件打开没问题,就是不显示
回复

使用道具 举报

692

主题

3583

回帖

5684

积分

论坛元老

积分
5684
发表于 2018-3-7 09:49:00 | 显示全部楼层
是不是缓存没有释放啊 ??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-3-7 10:15:44 | 显示全部楼层
多试试。排查下看看是不是内存没释放,emWin有个动态内存剩余判断函数的。
回复

使用道具 举报

25

主题

136

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2018-3-7 16:03:07 | 显示全部楼层
eric2013 发表于 2018-3-7 10:15
多试试。排查下看看是不是内存没释放,emWin有个动态内存剩余判断函数的。

通过GUI_ALLOC_GetNumFreeBytes();查看剩余内存,发现剩余内存在不断减少最后变为0;

为什么程序里已经执行了
/* 释放动态内存hMem */
GUI_ALLOC_Free(hMem);

感觉没什么作用
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2018-3-8 02:45:23 | 显示全部楼层
明天tcx 发表于 2018-3-7 16:03
通过GUI_ALLOC_GetNumFreeBytes();查看剩余内存,发现剩余内存在不断减少最后变为0;

为什么程序里已 ...

发个稍完整的点的程序看下。
回复

使用道具 举报

25

主题

136

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2018-3-8 08:29:23 | 显示全部楼层
eric2013 发表于 2018-3-8 02:45
发个稍完整的点的程序看下。

/*
*********************************************************************************************************
*        函 数 名: _ShowBMP2
*        功能说明: 显示BMP图片
*        形    参: sFilename  要读取的文件名
*                     x  要显示的x轴坐标位置
*                     y  要显示的y轴坐标位置
*        返 回 值: 返回绘制了BMP图片的内存设备句柄。
*********************************************************************************************************
*/
GUI_HMEM _ShowBMP2(const char *sFilename, int x, int y, int xsize, int ysize)
{
        char *_acBuffer;
        char FileName[64];
        int XSize, YSize;
        GUI_HMEM hMem;
        GUI_MEMDEV_Handle hMemBMP;

        /* 打开文件 */               
        result = f_open(&file, FileName, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
        if (result != FR_OK)
        {
                return 0;
        }
         
        /* 申请一块内存空间 并且将其清零 */
        hMem = GUI_ALLOC_AllocZero(file.fsize);
       
        /* 将申请到内存的句柄转换成指针类型 */
        _acBuffer = GUI_ALLOC_h2p(hMem);

        /* 读取文件到动态内存 */
        result = f_read(&file, _acBuffer, file.fsize, &bw);
        if (result != FR_OK)
        {
                return 0;
        }
        if(xsize)
                XSize = xsize;
        else
                XSize = GUI_BMP_GetXSize(_acBuffer);       
        if(ysize)
                YSize = ysize;
        else
                YSize = GUI_BMP_GetYSize(_acBuffer);       

        /* 创建内存设备,并将BMP图片绘制到此内存设备里面,此内存设备要在主程序中用到
           所以退出此函数前,不要释放。
        */
        hMemBMP = GUI_MEMDEV_CreateEx(x, y, XSize, YSize, GUI_MEMDEV_HASTRANS);
        GUI_MEMDEV_Select(hMemBMP);
        GUI_BMP_Draw(_acBuffer, x, y);
        GUI_MEMDEV_Select(0);
       
        /* 释放动态内存hMem */
        GUI_ALLOC_Free(hMem);
       
        /* 关闭文件 */
        f_close(&file);
        return hMemBMP;
}
void LCD_ShowBMP(const char *sFilename, int x, int y, int xsize, int ysize)
{
        GUI_MEMDEV_Handle hMemBMP;       
        /* 加载BMP图片到内存设备 */
        hMemBMP = _ShowBMP2(sFilename, x, y,xsize, ysize);
        /* 用到BMP图片的时候,调用此函数即可 */
        GUI_MEMDEV_WriteAt(hMemBMP, x, y);
}

调用LCD_ShowBMP(const char *sFilename, int x, int y, int xsize, int ysize) 显示每张图片

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-20 00:16 , Processed in 0.039254 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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