Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 将Arduino代码分解为函数会占用更多空间/资源吗?_Performance_Arduino_Firmware - Fatal编程技术网

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

Performance 将Arduino代码分解为函数会占用更多空间/资源吗?,performance,arduino,firmware,Performance,Arduino,Firmware,假设我有以下代码: 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); } 移动进行数字写入(led

假设我有以下代码:

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);
}
移动<代码>进行数字写入(led,引脚状态)对其自身功能影响处理时间


当然,单个LED的性能并不重要,但在每个时钟周期计数时(高采样率、循环中的大量数学运算等),性能可能会起作用。

定义为void的函数只会通知编译器/优化器该函数没有预期的返回值

因此,不会生成用于保存或操作任何返回值的代码


这不是特定于Arduino的,它是一种通用的C行为。

您可以设置avr gcc以显示程序集输出。查看它,您可以看到函数的返回类型与代码的大小无关。如果不返回任何值,则不会生成额外的代码。但是,您将收到编译器警告,因此在这种情况下使用
void
是很好的选择

如果使用函数,代码可能会更短,因为不需要在每次需要时都在函数中重复代码(这意味着函数中需要有足够的代码来抵消调用和返回指令-几乎总是这样)。这将使代码稍微慢一些,因为它需要执行调用和返回指令,但是这很可能会被大小的减少和代码维护的改进所抵消


我希望我说得够清楚,这似乎有点复杂:)

是的,你在浪费一点点的时钟周期。当您写入
ledChange(LOW)
时,它被编译为调用类型指令(它告诉程序计数器寄存器跳转到方法的位置)

因此,这将基本编译为:

  • LOW
    放入某个寄存器或堆栈中
  • 跳转到
    ledChange()的位置
  • 从内存中取出
    led
    ,并将其与
    LOW
    放在一起
  • 跳转到
    digitalWrite()
  • 执行
    digitalWrite()中的任何操作
  • 向后跳
  • 向后跳
请注意,
调用
跳转涉及大量的堆栈混乱,并且比常规的
JMP
指令花费的时间要长得多

另一方面,只执行
数字写入(led,低)
即可:

  • 从内存中的某个位置提取
    发光二极管
    低电平
    ,并将其放在可访问的位置
  • 跳转到
    ditigalWrite()
  • 执行
    digitalWrite()中的任何操作
  • 向后跳
我不完全确定参数是如何在相应的编译代码中传递的,这可能是调用的一部分。还请注意,编译器各不相同,有些编译器比其他编译器更智能

您可以看到,您对函数的封装使程序每次运行时占用更多的时钟周期。然而,这并不真正值得优化;我看不出这种封装有多大的能力来减缓Arduino的速度。此外,正如我提到的,一些编译器优化了这些东西



这与函数是
void
无关。如果它是一个
int
函数,它会稍微慢一点,因为在返回之前存储int涉及
MV
或堆栈操作(忘记哪个)。

因此,如果我使用“闪烁”示例,Arduino会完全一样地编译它吗?您必须向编译器开发人员或熟悉特定编译器的人员(Arduino提供IDE,而不是它的底层编译器)询问最终答案,但这是一个非常合理的假设。这并不是一个超越这一点的真正的Arduino问题。编译器不会自动生成简单的函数吗?我原以为在Arduino这样的嵌入式设备上,编译时优化比在其他地方更为重要。@MarkBooth:就像我提到的,有些编译器优化了这些东西。我不确定Arduino编译器是否做到了,它做到了。它是