简体   繁体   English

如何在微控制器按钮上使这个 while 循环更快?

[英]How can I make this while loop faster on a microcontroller button?

I am working with a micro controller that has a button A. When I press this button and hold it for 2 seconds, its value becomes 0 and the color turns either blue or green, when I release, its value goes back to 1 but the color stays the same unless it was clicked again and the color changes.我正在使用带有按钮 A 的微型 controller。当我按下此按钮并按住 2 秒钟时,它的值变为 0,颜色变为蓝色或绿色,当我松开时,它的值又回到 1,但颜色保持不变,除非再次单击它并且颜色发生变化。 The problem is, it shouldn't take someone 2 whole seconds to have to change the led light.问题是,更换 LED 灯不应该花 2 秒钟的时间。 What can I do to make the value (either 0 or 1) be read faster?我该怎么做才能更快地读取值(0或1)?

Here is a snippet of the code in the while loop.这是while循环中的代码片段。


// 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);
        }
    }
}



I tried to put GetValue() in several parts of the code to see if it could maybe get a value faster but it did not work.我尝试将 GetValue() 放在代码的几个部分中,以查看它是否可以更快地获得值,但它不起作用。 How can I move from here?我怎么能从这里搬走? I hope I shared enough code to understand the problem.我希望我分享了足够的代码来理解这个问题。 Thank you.谢谢你。

Upon further inspection, I found these:经过进一步检查,我发现了这些: 在此处输入图像描述

The above picture is linked from here , it is the spec sheet for your microcontroller.上图是从这里链接的,它是您的微控制器的规格表。

You want to look at the "Board Pin Map section" from this link to match it with the spec sheet of the chip itself您想查看此链接中的“Board Pin Map 部分”,以将其与芯片本身的规格表相匹配

Looks like your code reads the button which is fast, and then immediately sets outputs and sleeps 1 second, sets an output and sleeps another second before going up to check if the button is pressed again.看起来您的代码读取了快速的按钮,然后立即设置输出并休眠 1 秒,设置 output 并再休眠一秒钟,然后再上去检查是否再次按下按钮。

You should restructure the code to check the state of the button more frequently where you're going to sleep now.您应该重组代码以更频繁地检查您现在要睡觉的按钮的 state。

Sleep for shorter periods and check to see if the button is pressed in a loop until your total sleep time has been met or the button state changes.睡眠较短的时间并检查按钮是否被循环按下,直到达到您的总睡眠时间或按钮 state 发生变化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM