我已经编写了以下函数,并使用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的时间来执行所有指令(端口读取,屏蔽,开关盒)。

这意味着,切换案例至少无需花费1uS的时间即可执行。
据我所知,夹心案例开始将代码的顶部与底部的代码一一比较。 (这意味着开关盒有更多时间在代码底部返回值。)但是,对于PORTC的任何值,此代码仅获得4uS。
请解释switch case如何在Arduino / C ++中工作。

最佳答案

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

关于c++ - 开关案例声明如何在Arduino/C++中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58642484/

10-11 23:12