[英]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.