Arduino/C++ 中的 switch case 语句是如何工作的

How switch case statement works in Arduino/C++

我已经编写了下面的函数并使用 Arduino MEGA 检查它。这段代码只是读取 PORTC 并过滤它的 4 位,并根据该位值,函数 returns -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 有更多时间到达代码底部的 return 值。)但是,对于 PORTC 的任何值,此代码仅获得 4uS。 请解释 switch case 在 Arduino/C++ 中的工作原理。

micros函数的分辨率为4uS。这就是您看到相同值的原因。切换一个引脚并用示波器观察它,您将更好地了解实际时间。