繁体   English   中英

Arduino 模块化编程与全局设置

[英]Arduino modular programming vs global&setup

我有一个为 Arduino 编写的复杂程序,我不想使用避免使用全局变量,因为这不是一种好的编程风格

请参阅下面的两个基本示例,它们之间有区别吗? loop() function 结束后系统级别是否发生了什么?

常见的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();
    }
}

更新:

在 bolov 的回答和 Arduino main.cpp之后,我更新了模块化示例

您不应阻塞 Arduino 中的loop function。 如果您查看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;
}

如果您使用while (true)阻止第一个循环调用,则您不会有机会调用serialEventRun 据我所知,它用于处理串行事件。

所以是的,确实应该避免使用全局变量。 然而,由于 Arduino 草图是如何为小程序设计的,我可以说你应该坚持推荐的 Arduino 全局变量+ setup + loop样式。

你可以做些什么来缓解这个问题,将你的代码组织成抽象你的 model 的类。 例如,如果您控制电机而不是:

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

我为我的电机 controller 创建了一个 class。 这是它的使用方式:

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

暂无
暂无

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

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