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()中的任何操作
- 向后跳
这与函数是
void
无关。如果它是一个int
函数,它会稍微慢一点,因为在返回之前存储int涉及MV
或堆栈操作(忘记哪个)。因此,如果我使用“闪烁”示例,Arduino会完全一样地编译它吗?您必须向编译器开发人员或熟悉特定编译器的人员(Arduino提供IDE,而不是它的底层编译器)询问最终答案,但这是一个非常合理的假设。这并不是一个超越这一点的真正的Arduino问题。编译器不会自动生成简单的函数吗?我原以为在Arduino这样的嵌入式设备上,编译时优化比在其他地方更为重要。@MarkBooth:就像我提到的,有些编译器优化了这些东西。我不确定Arduino编译器是否做到了,它做到了。它是