OpenEdv-开源电子网

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

字库缓冲区方法

[复制链接]

49

主题

340

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5246
金钱
5246
注册时间
2012-8-25
在线时间
1024 小时
发表于 2018-8-3 08:41:20 | 显示全部楼层 |阅读模式
本帖最后由 gotofly21 于 2018-8-3 08:47 编辑

做一个项目,很多页面显示的汉字大同小异。字库存在外部flash,stm32 ram很大用不完,本着反正闲着也是闲着,做了一个缓冲区减少读取字库次数,效果有点,原来拉窗明显,现在几乎没有。算法很粗糙。
[mw_shl_code=applescript,true]
#define BYTES_PER_FONT 144   //最大支持32*32的汉字
static uint8_t GUI_FontDataBuf[BYTES_PER_FONT];
//字库缓存 减少字库读取次数
typedef struct
{
    uint8_t GUI_FontDataBuf[BYTES_PER_FONT];
    uint32_t addr;
    uint32_t shiyong_lv;
} ziku_huancun_t;
#define  ziku_huancun_n 50
ziku_huancun_t  ziku_huancun_s[ziku_huancun_n];

uint8_t* ziku_huancun_caxu( uint32_t addr )
{
    ziku_huancun_t* ziku_huancun_p = ziku_huancun_s;
    uint8_t*  data_p;
    data_p = 0;
    uint32_t  i;
    for( i = 0; i < ziku_huancun_n; i++ )
    {
        if( ziku_huancun_p->addr == addr )
        {
            if( ziku_huancun_p->shiyong_lv < 100000000 )
            {
                ziku_huancun_p->shiyong_lv += 1000;
            }
            data_p = ziku_huancun_p->GUI_FontDataBuf;
            // break;
        }
        else if( ziku_huancun_p->shiyong_lv > 1 )
        {
            ziku_huancun_p->shiyong_lv--;
        }
        ziku_huancun_p++;
    }
    return data_p;
}

void ziku_huancun_huancun( uint32_t addr, uint8_t* data_p )
{
    ziku_huancun_t* ziku_huancun_p = ziku_huancun_s;
    uint32_t  i, cun_f, min_shiyong_lv;
    cun_f = 0;
    ziku_huancun_p = ziku_huancun_s;
    min_shiyong_lv = ziku_huancun_p->shiyong_lv;
    ziku_huancun_p++;
    for( i = 1; i < ziku_huancun_n; i++ )
    {
        if( min_shiyong_lv > ziku_huancun_p->shiyong_lv )
        {
            min_shiyong_lv = ziku_huancun_p->shiyong_lv;
            cun_f = i;
        }
        ziku_huancun_p++;
    }
    ziku_huancun_p = ziku_huancun_s + cun_f;
    ziku_huancun_p->addr = addr;
    ziku_huancun_p->shiyong_lv = min_shiyong_lv + 1000;
    memcpy( ziku_huancun_p->GUI_FontDataBuf, data_p, BYTES_PER_FONT );
}


extern   void SST25ReadArray( uint32_t address, char* pData, uint16_t nCount );
uint8_t* GUI_hanzi_datap( uint32_t addr, uint32_t lenth ) //GUIcharP 调用 addr 从字库起始偏移 gui调这个函数,返回点阵地址
{
    uint8_t* data_p = 0;
    addr += 0x10000;
    data_p = ziku_huancun_caxu( addr );
    if( data_p == 0 )
    {
        SST25ReadArray( addr, ( char* )GUI_FontDataBuf, ( uint16_t )lenth );
        ziku_huancun_huancun( addr, GUI_FontDataBuf );
        data_p = GUI_FontDataBuf;
    }
    return data_p;
}[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2015-10-19
在线时间
173 小时
发表于 2018-12-14 15:39:06 | 显示全部楼层
樓主的程式碼若能多加點註釋看起來會更輕鬆點
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-12-14 16:28:56 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2019-1-29
在线时间
4 小时
发表于 2019-2-26 14:49:10 | 显示全部楼层
多谢了!
回复 支持 反对

使用道具 举报

0

主题

36

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-3-19
在线时间
2 小时
发表于 2019-3-22 10:11:16 | 显示全部楼层
多谢楼主!
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-3-26 14:46:05 | 显示全部楼层
谢谢楼主分享!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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