做一个项目,很多页面显示的汉字大同小异。字库存在外部flash,stm32 ram很大用不完,本着反正闲着也是闲着,做了一个缓冲区减少读取字库次数,效果有点,原来拉窗明显,现在几乎没有。算法很粗糙。
#define BYTES_PER_FONT 144 //最大支持32*32的汉字
static uint
8
_t GUI_FontDataBuf[BYTES_PER_FONT];
/
/
字库缓存 减少字库读取次数
typedef struct
{
uint
8
_t GUI_FontDataBuf[BYTES_PER_FONT];
uint
32
_t addr;
uint
32
_t shiyong_lv;
}
ziku_huancun_t;
#define ziku_huancun_n 50
ziku_huancun_t ziku_huancun_s[ziku_huancun_n];
uint
8
_t
*
ziku_huancun_caxu
(
uint
32
_t addr
)
{
ziku_huancun_t
*
ziku_huancun_p
=
ziku_huancun_s;
uint
8
_t
*
data_p;
data_p
=
0
;
uint
32
_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
(
uint
32
_t addr
,
uint
8
_t
*
data_p
)
{
ziku_huancun_t
*
ziku_huancun_p
=
ziku_huancun_s;
uint
32
_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 SST
25
ReadArray
(
uint
32
_t
address
,
char
*
pData
,
uint
16
_t nCount
)
;
uint
8
_t
*
GUI_hanzi_datap
(
uint
32
_t addr
,
uint
32
_t lenth
)
/
/
GUIcharP 调用 addr 从字库起始偏移 gui调这个函数,返回点阵地址
{
uint
8
_t
*
data_p
=
0
;
addr
+
=
0
x
10000
;
data_p
=
ziku_huancun_caxu
(
addr
)
;
if
(
data_p
=
=
0
)
{
SST
25
ReadArray
(
addr
,
(
char
*
)
GUI_FontDataBuf
,
(
uint
16
_t
)
lenth
)
;
ziku_huancun_huancun
(
addr
,
GUI_FontDataBuf
)
;
data_p
=
GUI_FontDataBuf;
}
return
data_p;
}