假设我有以下代码: int led = 13;void setup() { pinMode(led, OUTPUT); }void loop() { ledChange(HIGH); delay(1000); ledChange(LOW); delay(1000);}void ledChange(int pinState) { digitalWrite(led, pinState);} 移动digitalWrite(led,pinS
int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { ledChange(HIGH); delay(1000); ledChange(LOW); delay(1000); } void ledChange(int pinState) { digitalWrite(led, pinState); }
移动digitalWrite(led,pinState);它自己的功能影响处理时间?
当然,单个LED的性能并不重要,但是每个时钟周期都很重要(高采样率,循环中的大量数学运算等).
是的,你浪费了数十个时钟周期.当您编写ledChange(LOW)时,它被编译为CALL类型指令(它告诉程序计数器寄存器跳转到方法的位置).所以,这基本上会编译为:
>将LOW置于某个寄存器或堆栈中
>跳转到ledChange()的位置
>从内存中取出,并将其与LOW一起放在一起
>跳转到digitalWrite()
>做dataWrite中的任何事情()
>跳回来
>跳回来
请注意,CALL跳转涉及大量混乱堆栈,并且比常规JMP指令花费更长的时间.
另一方面,只做digitalWrite(led,LOW)会:
>从内存中的某处获取led,LOW并将它们放在可访问的位置
>跳转到ditigalWrite()
>做dataWrite中的任何事情()
>跳回来
我不完全确定如何在相应的编译代码中传递参数,它可能是调用的一部分.另请注意,编译器各不相同,有些比其他更聪明.
您可以看到,对函数的封装使程序在每次运行时都占用了更多的时钟周期.但是,这并不值得优化;我没有看到这种封装能够减慢Arduino的速度.此外,正如我所提到的,一些编译器会优化这些东西.
这与虚函数无关.如果它是一个int函数,它将会稍微慢一点,因为在返回之前存储int涉及MV或堆栈操作(忘了哪个).