以下有两段代码和反汇编结果对比:
UINT8 colors[] = {0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10};
// WS2812B发送1Byte数据
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; // 低电平时序比较随意,要求不高
}
}
void main(void)
{
UINT8 i;
SAFE_MOD = 0x55; // 解锁安全模式
SAFE_MOD = 0xAA;
CLOCK_CFG = 0x86; // 系统时钟分频器4分频=24MHz
while (1)
{
mDelayuS(1000); // 延时以便示波器观察信号
for (i = 0; i != 9; ++i) WS_SendByte(colors[i]);
}
}
代码段一反汇编:
代码段二反汇编:
注:两段代码唯一的差别仅仅是一个 static 关键字
实测用示波器检测LED引脚,9次WS_SendByte()循环调用,代码段一比代码段二耗时长5us。
这个结果比较反直觉,毕竟代码段一的汇编指令更短,我查询指令周期表,也没发现DJNZ会比JNZ明显的消耗更多时间。
所以希望WCH官方能给予解答这个疑惑。