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