Как работает инструкция переключения регистра в Arduino / C ++ - PullRequest
0 голосов
/ 31 октября 2019

Я написал ниже функцию и проверил ее, используя 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;

  }
}

Используя отдельный код, я измерил время выполнения чтения PORTC с помощью micros(). Как я измерил, требуется 4 мкс.

Этот код также считывает PORTC, а затем использует switch case для определения значения порта.

Но эта целая функция также получает только 4 мкс для выполнения всех инструкций(чтение порта, маскирование, регистр коммутатора).

Это означает, что регистру коммутатора не потребовалось по крайней мере 1 мкс для выполнения. Как я знаю, в этом случае начинают сравнивать одну за другой верхнюю часть кода с нижней частью кода. (Это означает, что регистр переключателя получает больше времени для возврата значения в нижней части кода.) Но этот код получает только 4 мкс для любого значения PORTC. Пожалуйста, объясните, как switch case работает в Arduino / C ++.

1 Ответ

2 голосов
/ 01 ноября 2019

Разрешение функции micros составляет 4 мкс. Вот почему вы видите те же ценности. Вместо этого переключите булавку и наблюдайте за ней с помощью осциллографа, и вы получите лучшее представление о реальном времени.

...