当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 将Arduino代码分解为函数会占用更多空间/资源吗?

来源:互联网 收集:自由互联 发布时间:2021-06-22
假设我有以下代码: 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或堆栈操作(忘了哪个).

网友评论