字库缓冲

做一个项目,很多页面显示的汉字大同小异。字库存在外部flash,stm32 ram很大用不完,本着反正闲着也是闲着,做了一个缓冲区减少读取字库次数,效果有点,原来拉窗明显,现在几乎没有。算法很粗糙。

#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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值