Модульное программирование Arduino против глобального и настройки - PullRequest
0 голосов
/ 19 июня 2020

У меня есть сложная программа, которую я пишу для Arduino, и я не хочу избегать использования глобальных переменных, так как это не лучший стиль программирования .

см. Два основных c примеры ниже, есть ли между ними разница? Что-то происходит на системном уровне после завершения функции l oop ()?

общий проект Arduino:

int a;

void setup() {
   a=0;
}

void loop() {
   int b = f(a);
   ++a;
   ...
}

Модульное, более последовательное программирование:

//no globals!!!
void setup() {}//do not use it

void loop() {
    int a=0;
    for(;;)
    {
       //main aruduino loop
        int b = f(a);
       ++a;
       ...
       if (serialEventRun) serialEventRun();
    }
}

ОБНОВЛЕНИЕ:

после ответа Болова и Arduino main. cpp, Я обновил модульный пример

1 Ответ

1 голос
/ 19 июня 2020

Вы не должны блокировать функцию loop в Arduino. Если вы посмотрите, как определяется main (<arduino_install_dir>\hardware\arduino\avr\cores\arduino\main.cpp), вы увидите:


int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    return 0;
}

Если вы заблокируете первый вызов l oop с помощью while (true), вы не получите serialEventRun шанс быть названным. Насколько я могу судить, он используется для обработки последовательных событий.

Так что да, глобальных переменных, как правило, следует избегать. Однако из-за того, что скетч Arduino разработан для небольших программ, я могу сказать, что вам следует придерживаться рекомендуемого стиля глобальных переменных Arduino + setup + loop.

Что вы можете сделать, чтобы облегчить это, - это организовать свои код в классы, которые абстрагируют вашу модель. Например, если вы управляете двигателем вместо:

#define DRIVER_EN   5
#define DRIVER_DIR  6
#define DRIVER_PUL  7

int motor_microstepping;
int motor_gear_ratio;

void setup()
{
    motor_microstepping = 8;
    motor_gear_ratio = 2;

    pinMode(DRIVER_EN, OUTPUT);
    pinMode(DRIVER_DIR, OUTPUT);
    pinMode(DRIVER_PUL, OUTPUT);

    digitalWrite(DRIVER_EN, LOW);
}

, я создал класс для своего контроллера двигателя. Вот как это используется:

using namespace em::physics::literals;

em::motor::TB6600 slider_motor{
    5,       // EN
    6,       // DIR
    7,       //  PUL
    1.8_deg, // pulse_angle
    8,       // microstepping
    1,       // gear ratio
};

void setup()
{

    slider_motor.setup();
}

void loop()
{
    // ...
    slider_motor.enable();
    slider_motor.set_direction_low();
    //...
}
...