硬汉嵌入式论坛

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

[emWin] emwin 切换卡死情况

[复制链接]

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 3 天前 | 显示全部楼层 |阅读模式
屏幕800*480的,背景为一个screen,黑色为主,它顶部用一个窗口来做标题栏,高度大概60,显示7-8个小图标还有文字,screen使用了set persistent;
顶部栏下的部分是用其他screen来进行显示,
其中一个screen有5个图标+文字,相当于主界面;
其他几个screen都是listview+按钮等控件来显示,选项或者操作界面;
主界面和其他页面大致示意图如下:

这几个screen来回切换,SDRAM是32M的,其中GUI_NUMBYTES分配了24M;外部加载中文ttf,能够正常显示;使用了大面积的黑色背景,主界面菜单使用较大图片;
能正常启动,显示主界面,点击按钮能进入下一页面(有些页面也不行,但是也是进入了initdialog),但是点击返回的时候就卡死,打印显示进入主界面的初始化initdialog中;
不加载外部中文ttf显示乱码,但是能够返回主界面,切换都没问题,这是分配的空间少了还是,其他问题?
用的appwizard,想问问各位大佬,这种情况应该从哪方面着手去解决?




回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 前天 00:39 | 显示全部楼层
1、emWin有个全局动态内存剩余获取函数,看看还剩余多少。
2、从楼主的描述来看,大概率是TTF导致的,改成使用小字库试试正常不
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 前天 11:31 | 显示全部楼层
使用GUI_ALLOC_GetNumFreeBytes发现还有很大空间,GUI_ALLOC_GetNumUsedBytes比较小
使用GUI_SetDefaultFont设置默认字体,好像不起作用,非得调用TEXT_SetDefaultFont,BUTTON_SetDefaultFont这些来设置下按钮之类的文字才能正常使用创建的ttf字体
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 前天 14:14 | 显示全部楼层

使用GUI_ALLOC_GetNumFreeBytes查询得到的空间还很大,GUI_ALLOC_GetNumUsedBytes使用的空间比较小;
另外有个很奇怪的情况GUI_SetDefaultFont设置加载的ttf字库好像不起作用?需要使用TEXT_SetDefaultFont,BUTTON_SetDefaultFont之类的,按钮和文本才能正常显示中文;
通过appwizard创建字体库的形式,程序能够正常运行,难道是通过加载外部ttf字体库程序出的问题?
大佬们帮忙看看代码:

char *ttffontbuffer = 0;
GUI_TTF_CS ttfcs0;
GUI_TTF_DATA ttfdata;
GUI_FONT fontttf36;

uint8_t createTTF(const char *filename)
{
    FIL fp;
    /* 打开文件 */
    FRESULT res = f_open(&fp, filename, FA_OPEN_EXISTING | FA_READ);
    if (res != FR_OK)
    {
        printf("open %s ttf err\r\n", filename);
        return 0;
    }

    uint32_t fsize = f_size(&fp);
    /* 申请一块动态内存空间 */
    GUI_HMEM hmem = GUI_ALLOC_AllocZero(fsize);
    /* 转换动态内存的句柄为指针 */
    ttffontbuffer = GUI_ALLOC_h2p(hmem);

    uint32_t br = 0;
    /* 读取内容 */
    res = f_read(&fp, ttffontbuffer, fsize, &br);
    if (res != FR_OK)
    {
        printf("read %s ttf err\r\n", filename);
        f_close(&fp);
        GUI_ALLOC_Free(hmem);
        return 0;
    }
    f_close(&fp);
    printf("read font %s size: %d\r\n", filename, fsize);
    /* 链接TTF数据 */
    ttfdata.pData = ttffontbuffer;
    ttfdata.NumBytes = fsize;

    /* 配置字体参数 */
    ttfcs0.pTTF = &ttfdata;
    ttfcs0.PixelHeight = 36;
    ttfcs0.FaceIndex = 0;
    GUI_TTF_CreateFontAA(&fontttf36, &ttfcs0);
    return fsize;
}

在GUI_X_Config分配好内存后调用:
    GUI_SetDefaultFont(&fontttf36);
    TEXT_SetDefaultFont(&fontttf36);
    BUTTON_SetDefaultFont(&fontttf36);
    LISTVIEW_SetDefaultFont(&fontttf36);
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 昨天 11:33 | 显示全部楼层
良心不安 发表于 2026-1-7 14:14
使用GUI_ALLOC_GetNumFreeBytes查询得到的空间还很大,GUI_ALLOC_GetNumUsedBytes使用的空间比较小;
另 ...

使用的那个平台,如果有Cache,注意MPU Cache问题。

然后单独调用TEXT_SetFont是否正常,如果正常是没问题的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-9 16:44 , Processed in 0.070631 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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