【发布时间】:2020-02-26 18:17:56
【问题描述】:
我写了下面的函数并使用 Arduino MEGA 检查它。这段代码只是读取 PORTC 并过滤它的 4 位,根据该位值,函数返回 -2 到 13。
#define PDL_1_BRN 37 //PC0
#define PDL_2_GRN 36 //PC1
#define PDL_3_WHT 35 //PC2
#define PDL_4_YEL 34 //PC3
void setup() {
Serial.begin(9600);
pinMode(PDL_1_BRN, INPUT); //use external pullup
pinMode(PDL_2_GRN, INPUT);
pinMode(PDL_3_WHT, INPUT);
pinMode(PDL_4_YEL, INPUT);
}
uint32_t t = 0;
void loop() {
t = micros();
getPedalState();
Serial.println(micros() - t);
}
int8_t getPedalState() {
uint8_t val = 0;
val = PINC & 0x0F;
switch (val) {
case 0x0F:
return 0;
break;
case 0x0B:
return 1;
break;
case 0x09:
return 2;
break;
case 0x01:
return 3;
break;
case 0x05:
return 4;
break;
case 0x0D:
return 5;
break;
case 0x0C:
return 6;
break;
case 0x04:
return 7;
break;
case 0x00:
return 8;
break;
case 0x08:
return 9;
break;
case 0x0A:
return 10;
break;
case 0x02:
return 11;
break;
case 0x06:
return 12;
break;
case 0x0E:
return 13;
break;
case 0x07:
return -1;
break;
case 0x03:
return -2;
break;
}
}
使用单独的代码,我使用micros() 测量了 PORTC 读取执行时间。我测量需要 4uS。
此代码还读取了 PORTC,然后使用switch case 来识别端口值。
但是,整个函数也只需要 4uS 来执行所有指令(端口读取、屏蔽、开关情况)。
这意味着,switch case 至少不需要 1uS 来执行。
据我所知,swich case 开始将代码的顶部与代码的底部一一进行比较。 (这意味着 switch case 有更多时间在代码底部返回值。)但是,对于 PORTC 的任何值,此代码仅获得 4uS。
请解释switch case 在 Arduino/C++ 中的工作原理。
【问题讨论】:
-
返回后无需中断。
-
使用一个数组,只需在索引中查找返回值——比 switch 语句快得多。
-
看看生成的代码。两种最可能的实现是跳转表或查找表。两者都有可能,因为案件数量相对较少。两者的执行速度都非常快。
-
swich case 开始逐一比较代码顶部和底部代码
if就是这样工作的,但switch经常使用跳表。 -
兜售?你是说踏板吗?
标签: c++ arduino conditional-statements port