前言
我們之前進(jìn)行了TFT刷屏測試確認(rèn)了基本功能。刷屏速度是決定GUI顯示幀率最根本的一環(huán),只有優(yōu)化到極致的刷屏速度,才能有基礎(chǔ)實(shí)現(xiàn)更好效果的GUI。本篇就進(jìn)行刷屏的優(yōu)化,其實(shí)其思想是通用的,對于其他代碼也可以參考。
1. 減少if條件判斷
if等條件判斷會(huì)導(dǎo)致分支處理,一方面會(huì)增加指令,尤其是跳轉(zhuǎn)指令一般執(zhí)行時(shí)間比一般指令長,另外也會(huì)影響流水線和cache。
if(Data&0x80)
LCD_SDA_SET; //輸出數(shù)據(jù)
else LCD_SDA_CLR;
改為串行操作
#define LCD_SDA_SET_VAL(val) LCD_CTRLB- >BSRR=val;LCD_CTRLB- >BRR=val^LCD_SDA
2. 使用寄存器變量
頻繁操作的局部變量盡量使用寄存器進(jìn)行緩存,避免反復(fù)從內(nèi)存去加載,寄存器直接操作速度快很多。
register unsigned int data;
3. 空間換時(shí)間 8次for循環(huán)改為 直接8次操作
其實(shí)在memcpy等處理中也是類似操作,比如連續(xù)8次讀寫組合一起,再循環(huán)。以減少for判斷次數(shù),也利于內(nèi)部cache流水線處理,有一些cpu還有burst處理,這也是有利的。
inline void SPI_WriteDataF(unsigned char Data)
{
#if 0
unsigned char i=0;
for(i=8;i >0;i--)
{
if(Data&0x80)
LCD_SDA_SET; //輸出數(shù)據(jù)
else LCD_SDA_CLR;
LCD_SCL_CLR;
LCD_SCL_SET;
Data< <=1;
}
#else
//LCD_SDA_LOCK;
register unsigned int data = (Data & 0x80) < < 0;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x40) < < 1;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x20) < < 2;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x10) < < 3;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x08) < < 4;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x04) < < 5;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x02) < < 6;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
data = (Data & 0x01) < < 7;
LCD_SDA_SET_VAL(data);
LCD_SCL_CLR;
LCD_SCL_SET;
//LCD_SDA_UNLOCK;
#endif
}