Как я могу сделать это при l oop быстрее на кнопке микроконтроллера? - PullRequest
2 голосов
/ 29 мая 2020

Я работаю с микроконтроллером, у которого есть кнопка A. Когда я нажимаю эту кнопку и удерживаю ее в течение 2 секунд, ее значение становится 0, а цвет становится синим или зеленым, когда я отпускаю, его значение возвращается к 1, но цвет остается прежним, если по нему не щелкнуть еще раз и цвет не изменится. Проблема в том, что замена светодиода не должна занимать целых 2 секунды. Что я могу сделать, чтобы значение (0 или 1) читалось быстрее?

Вот фрагмент кода в while l oop.


// here are the states for reference. Everything is either a 0 or a 1
const int BUTTON_PRESSED = 0;
const int BUTTON_UNPRESSED = 1;

const int GREEN_LED = 0;
const int BLUE_LED = 1;

    const struct timespec sleepTime = { 1, 0 };

    while (true) {
        Value_Type value;
        // this function get the input of button a when pressed
        GetValue(button_A_fd, &value);
        Log_Debug(
           "Button value (%d)\n", value);

        // Processing the button.

        //Turns LED ON; Button not pressed down
        if (value == BUTTON_UNPRESSED) {
            last_button_state = BUTTON_UNPRESSED;
        } else {

            // if last button state is 1 then now it is being pressed
            if (last_button_state == BUTTON_UNPRESSED) {
                // Flip LEDs
                if (active_led == BLUE_LED) {
                    active_led = GREEN_LED;
                }
                else if (active_led == GREEN_LED) {
                    active_led = BLUE_LED;
                }

                last_button_state = BUTTON_PRESSED;
                // sets the pointer to the 0 bit of the file to write
                lseek(fd_storage, 0, SEEK_SET);
                // write current active led to mutable storage and save
                write(fd_storage, &active_led, sizeof(active_led));
            }
        }
        // Blinking the active LED.
        // reading input only when pressed and turn off other led
        if (active_led == GREEN_LED) {
            // turn off blue led, then turn on green
            SetValue(blue_led_fd, Value_High);
            SetValue(green_led_fd, Value_Low);
            nanosleep(&sleepTime, NULL);
            SetValue(green_led_fd, Value_High);
            nanosleep(&sleepTime, NULL);
        }
        else if (active_led == BLUE_LED) {
            // turn off green led, then turn on blue
            SetValue(green_led_fd, Value_High);
            SetValue(blue_led_fd, Value_Low);
            nanosleep(&sleepTime, NULL);
            SetValue(blue_led_fd, Value_High);
            nanosleep(&sleepTime, NULL);
        }
    }
}



Я пробовал поместить GetValue () в несколько частей кода, чтобы увидеть, может ли он получить значение быстрее, но это не сработало. Как мне переехать отсюда? Надеюсь, я поделился достаточным количеством кода, чтобы понять проблему. Спасибо.

Ответы [ 2 ]

1 голос
/ 29 мая 2020
• 1000 следует реструктурировать код, чтобы чаще проверять состояние кнопки там, где вы собираетесь спать.

Спите на более короткие периоды и проверьте, нажата ли кнопка на al oop до полного сна наступило время или состояние кнопки изменилось.

1 голос
/ 29 мая 2020

При дальнейшем осмотре я обнаружил следующее: enter image description here

Приведенное выше изображение связано с здесь , это лист spe c для вашего микроконтроллер.

Вы хотите посмотреть на раздел «Board Pin Map section» по этой ссылке , чтобы сопоставить его с SPE c листом самого чипа

...