以下有兩段代碼和反匯編結(jié)果對(duì)比:
UINT8 colors[] = {0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10};
// WS2812B發(fā)送1Byte數(shù)據(jù)
void WS_SendByte(UINT8 buffer)
{
UINT8 i; // 代碼段一
//static UINT8 i; // 代碼段二
for(i=8;i;--i)
{
if (buffer & 0x80)
{
LED = 1;
++SAFE_MOD;
++SAFE_MOD;
++SAFE_MOD;
}
else LED = 1;
++SAFE_MOD;
++SAFE_MOD;
LED = 0;
buffer <<= 1; // 低電平時(shí)序比較隨意,要求不高
}
}
void main(void)
{
UINT8 i;
SAFE_MOD = 0x55; // 解鎖安全模式
SAFE_MOD = 0xAA;
CLOCK_CFG = 0x86; // 系統(tǒng)時(shí)鐘分頻器4分頻=24MHz
while (1)
{
mDelayuS(1000); // 延時(shí)以便示波器觀察信號(hào)
for (i = 0; i != 9; ++i) WS_SendByte(colors[i]);
}
}
代碼段一反匯編:
代碼段二反匯編:
注:兩段代碼唯一的差別僅僅是一個(gè) static 關(guān)鍵字
實(shí)測(cè)用示波器檢測(cè)LED引腳,9次WS_SendByte()循環(huán)調(diào)用,代碼段一比代碼段二耗時(shí)長(zhǎng)5us。
這個(gè)結(jié)果比較反直覺,畢竟代碼段一的匯編指令更短,我查詢指令周期表,也沒發(fā)現(xiàn)DJNZ會(huì)比JNZ明顯的消耗更多時(shí)間。
所以希望WCH官方能給予解答這個(gè)疑惑。