【问题标题】:How switch case statement works in Arduino/C++switch case 语句在 Arduino/C++ 中的工作原理
【发布时间】: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


【解决方案1】:

micros功能的分辨率为4uS。这就是为什么您会看到相同的值。切换一个引脚并用示波器观察它,您将更好地了解实际时序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多