所有关于电路

Arduino最小任务调度程序示例?

djsfantasi

djsfantasi

2010年4月11日加入
7595年
Scheduler_example_blink有很多代码要消化……这里有使用过它的会员吗?

另外,如果你每次都“得到不同的错误”,你不认为告诉我们它们是什么会很有帮助吗?我的水晶球在店里。

如果我们知道您更改了什么以及发生了哪些错误(详细信息),也许我们就有机会提供帮助。
Adamelli

线程启动

Adamelli

2020年9月14日加入
16
另外,如果你每次都“得到不同的错误”,你不认为告诉我们它们是什么会很有帮助吗?
变量。似乎各部分是相互依赖的。
我不确定每一个对应于“方法” "// === # ==========================================" 为每一个号码。

链接中有完整的程序,所以当取出第2-6节或仅取出第6节时,您可以看到错误或“构建失败!”我可以列出每个特定情况下的所有“构建失败”和错误,但我不认为这是有用的。
Adamelli

线程启动

Adamelli

2020年9月14日加入
16
这里有一个错误。我去掉了接近2-6的部分,我假设是void loop下面对应的部分,我去掉了2-6:
代码:
在这个作用域中没有声明tBlink2
这是方法2中的一个变量。所以我把这个方法放回去,它说“构建失败!”我可以通过真正的Arduino IDE运行它,但我想我今天早些时候做过,它只是一个级联错误直到大部分原始程序返回…这就违背了最小化它的目的。我只想找到一个单独的方法。这样我就可以在单独的程序中使用其中的一个方法。
班

2019年1月27日加入
2760年
这里有一个错误。我去掉了接近2-6的部分,我假设是void loop下面对应的部分,我去掉了2-6:
代码:
在这个作用域中没有声明tBlink2
这是方法2中的一个变量。所以我把这个方法放回去,它说“构建失败!”我可以通过真正的Arduino IDE运行它,但我想我今天早些时候做过,它只是一个级联错误直到大部分原始程序返回…这就违背了最小化它的目的。我只想找到一个单独的方法。这样我就可以在单独的程序中使用其中的一个方法。
“货物崇拜”是一种非常糟糕的方法。复制粘贴“工作”的代码位肯定会使您正在编写的程序不稳定。而不是盲目地删除代码,你真的需要深入研究它理解它如何和为什么工作。

我无法告诉你我处理了多少不稳定的意大利面条代码,其中一些是我写的!

注释代码时有一个原则:不要写关于什么代码正在做,代码告诉你,注释为什么你就是这样写代码的。这就叫做善待维护程序员,他们大部分时间都是这样的!

同样,货物崇拜编码意味着未来你将无法理清过去你花了相当多的时间来锯、归档、粘合和粘在一起的那些你甚至不理解的部分的进展。

通过代码示例,当您可以单独使用其中一个方法时,将其添加到您的程序中,注释它,并享受dong the Right Thing®的辉煌。

[编辑]对于那些不熟悉“货物崇拜”及其与编程的关系的人,维基百科有一篇很好的文章:https://en.wikipedia.org/wiki/Cargo_cult_programming
最后的编辑:
djsfantasi

djsfantasi

2010年4月11日加入
7595年
这里有一个错误。我去掉了接近2-6的部分,我假设是void loop下面对应的部分,我去掉了2-6:
代码:
在这个作用域中没有声明tBlink2
这是方法2中的一个变量。所以我把这个方法放回去,它说“构建失败!”我可以通过真正的Arduino IDE运行它,但我想我今天早些时候做过,它只是一个级联错误直到大部分原始程序返回…这就违背了最小化它的目的。我只想找到一个单独的方法。这样我就可以在单独的程序中使用其中的一个方法。
优秀的文章@Yaakov我必须承认,你的反应让我大吃一惊。

我不想低估你。你能描述一下你的编程背景吗?

我觉得你不明白这个例子在做什么。这就会导致错误的假设。

不能在不理解每一行代码以及所有变量的用途、定义和作用域的情况下,从一个较大的程序中截取一段代码。这会导致你发布的错误。而且,如果没有我要求的细节和300条线的草图,就没有办法以一种有意义的方式解决这些问题。所以我才沉默了这么久。

所以,你所有错误的来源是无法理解代码是什么,它的结构和“数据,数据,数据”。后者是我的个人引用,基于我的信念“数据就是代码”。
Adamelli

线程启动

Adamelli

2020年9月14日加入
16
很高兴你想帮忙,但有人看过这个程序吗?(说一些概括性的事情要比深入研究项目本身的肮脏细节容易得多。)而且,我也不是在搞货运邪教。我试图从多例子程序中得到一个最小的例子。这样,我就能理解如何将Task Scheduler库集成到一个不同的程序中(以取代延迟)。

它的外观和错误消息表明每种方法是链接在一起的。然而,如果我注释掉链接的部分,未定义的引用错误结果:

c++:
/ / = = = 1  ======================================= bool LED_state = false;void blink1CB() {if (tBlink1.isFirstIteration()) {_PP(millis());_PL(": Blink1 - simple flag driven");LED_state = false;} if (LED_state) {LEDOff();LED_state = false;} else {LEDOn();LED_state = true;} //注释掉链接部分,其中tBlink2是方法2://如果(tBlink1.isLastIteration()) {// tBlink2。restartDelayed(2 * TASK_SECOND);/ / LEDOff (); // } }
错误:

代码:
C:\Users\user\AppData\Local\Temp\ cc39Gvct.ltrans0.ltrans。o: In function ' global constructors keyed to 65535_0_21_3_23_taskScheduler.ino.cpp.o。1918: <人工>:(.text.startup + 0 xc0):未定义的引用“blink2CB_ON()的<人工>:(.text.startup + 0 xc4):未定义的引用“blink2CB_ON()的<人工>:(.text.startup + 0 xe0):未定义的引用“blink3CB()的<人工>:(.text.startup + 0 xe4):未定义的引用“blink3CB()的<人工>:(.text.startup + 0 x100):(.text.startup+0x108): undefined reference to ' blink41OE()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128):(.text.startup+0x12c):未定义引用' blink42()' <人工>:(.text.startup+0x158):未定义引用' blink42()' <人工>:(.text.startup+0x138):未定义引用' blink42()' <人工>:(.text.startup+0x158):(.text.startup+0x160): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180):(.text.startup+0x18c):未定义引用' blink52()' <人工>:(.text.startup+0x18c):未定义引用' blink52()' <人工>:(.text.startup+0x190):未定义引用' blink52()' <人工>:(.text.startup+0x1ac):(.text.startup+0x1b4): undefined reference to ' blink6OE()' :(.text.startup+0x1b4): undefined reference to ' blink6OE()' :(.text.startup+0x1b8): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1bc):<人工>:(.text.startup+0x1c0): undefined reference to ' blink6CB()' <人工>:(.text.startup+0x1c0): undefined reference to ' blink6CB()' collect2.exe: error: ld returned 1 exit status exit status 1 board Arduino Uno编译错误。
Adamelli

线程启动

Adamelli

2020年9月14日加入
16
“通过代码示例,以及何时可以单独使用其中一个方法”——这是问题的一部分。这就是我一直想做的。每种方法都与下一种方法相链接。我不知道如何只有一种工作方法。这就是我要问的问题。
班

2019年1月27日加入
2760年
很高兴你想帮忙,但有人看过这个程序吗?(说一些概括性的事情要比深入研究项目本身的肮脏细节容易得多。)而且,我也不是在搞货运邪教。我试图从多例子程序中得到一个最小的例子。这样,我就能理解如何将Task Scheduler库集成到一个不同的程序中(以取代延迟)。

它的外观和错误消息表明每种方法是链接在一起的。然而,如果我注释掉链接的部分,未定义的引用错误结果:

c++:
/ / = = = 1  ======================================= bool LED_state = false;void blink1CB() {if (tBlink1.isFirstIteration()) {_PP(millis());_PL(": Blink1 - simple flag driven");LED_state = false;} if (LED_state) {LEDOff();LED_state = false;} else {LEDOn();LED_state = true;} //注释掉链接部分,其中tBlink2是方法2://如果(tBlink1.isLastIteration()) {// tBlink2。restartDelayed(2 * TASK_SECOND);/ / LEDOff (); // } }
错误:

代码:
C:\Users\user\AppData\Local\Temp\ cc39Gvct.ltrans0.ltrans。o: In function ' global constructors keyed to 65535_0_21_3_23_taskScheduler.ino.cpp.o。1918: <人工>:(.text.startup + 0 xc0):未定义的引用“blink2CB_ON()的<人工>:(.text.startup + 0 xc4):未定义的引用“blink2CB_ON()的<人工>:(.text.startup + 0 xe0):未定义的引用“blink3CB()的<人工>:(.text.startup + 0 xe4):未定义的引用“blink3CB()的<人工>:(.text.startup + 0 x100):(.text.startup+0x108): undefined reference to ' blink41OE()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128): undefined reference to ' blink41()' <人工>:(.text.startup+0x128):(.text.startup+0x12c):未定义引用' blink42()' <人工>:(.text.startup+0x158):未定义引用' blink42()' <人工>:(.text.startup+0x138):未定义引用' blink42()' <人工>:(.text.startup+0x158):(.text.startup+0x160): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180): undefined reference to ' blink51()' <人工>:(.text.startup+0x180):(.text.startup+0x18c):未定义引用' blink52()' <人工>:(.text.startup+0x18c):未定义引用' blink52()' <人工>:(.text.startup+0x190):未定义引用' blink52()' <人工>:(.text.startup+0x1ac):(.text.startup+0x1b4): undefined reference to ' blink6OE()' :(.text.startup+0x1b4): undefined reference to ' blink6OE()' :(.text.startup+0x1b8): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1b0): undefined reference to ' blink6OE()' <人工>:(.text.startup+0x1bc):<人工>:(.text.startup+0x1c0): undefined reference to ' blink6CB()' <人工>:(.text.startup+0x1c0): undefined reference to ' blink6CB()' collect2.exe: error: ld returned 1 exit status exit status 1 board Arduino Uno编译错误。
是的,我看了这个程序。
Adamelli

线程启动

Adamelli

2020年9月14日加入
16
好吧,我明白了。由于某些原因,错误导致使用wokwi网站的程序。如果示例程序是从库中使用的,并且所有其他“方法”都被注释掉了——包括您想要使用的方法中的最后一个If语句——以及声明,那么它就会编译。

方法1的示例:

c++:
/ *每个示例集必须有一个LED闪烁示例,这个想法是拥有尽可能多的方式来闪烁LED,我可以想到。所以,我们走了。测试: -  Arduino nano  -  esp8266  -  esp32  -  stm32 maple mini * / // #define _task_timecritical //启用监视调度overruns #define _task_sleep_on_idle_run //如果在pass #define期间没有调用回调方法,则在任务之间启用1 ms sleep_idle Polydhs_Task_status_Request //使用支持WDT控制点和任务ID // #define _task_lts_pointer // #define _task_lts_pointer //编译任务存储指针// #define _task_priority //支持分层调度优先级// #define _task_micro_res //支持微秒分辨率// #define _task_std_function //支持std :: function(esp8266和esp32)// #define _task_debug//使所有方法和变量公众用于调试目的// #define _task_inline //使所有方法“内联” - 需要支持一些多标签,多文件IMPLEPerations // #define _task_timeout //支持整体任务超时// #define _task_oo_callbacks //支持动态回调方法绑定#include  // debug和test选项#define _debug_ //#define _test_ #ifdef _debug_#define _pp(a)serial.print(a);#define _pl(a)serial.println(a);#else #define _pp(a)#define _pl(a)#endif // led_builtin 13 #ffered(arduino_arch_esp32)#define led_builtin 23 // esp32 dev2套件没有LED #ENDIF // Scheduler调度器TS; /* Approach 1: LED is driven by the boolean variable; false = OFF, true = ON */ #define PERIOD1 500 #define DURATION 10000 void blink1CB(); Task tBlink1 ( PERIOD1 * TASK_MILLISECOND, DURATION / PERIOD1, &blink1CB, &ts, true ); /* Approac 2: two callback methods: one turns ON, another turns OFF */ //#define PERIOD2 400 //void blink2CB_ON(); //void blink2CB_OFF(); //Task tBlink2 ( PERIOD2 * TASK_MILLISECOND, DURATION / PERIOD2, &blink2CB_ON, &ts, false ); // ///* // Approach 3: Use RunCounter //*/ //#define PERIOD3 300 //void blink3CB(); //Task tBlink3 (PERIOD3 * TASK_MILLISECOND, DURATION / PERIOD3, &blink3CB, &ts, false); // ///* // Approach 4: Use status request objects to pass control from one task to the other //*/ //#define PERIOD4 200 //bool blink41OE(); //void blink41(); //void blink42(); //void blink42OD(); //Task tBlink4On ( PERIOD4 * TASK_MILLISECOND, TASK_ONCE, blink41, &ts, false, &blink41OE ); //Task tBlink4Off ( PERIOD4 * TASK_MILLISECOND, TASK_ONCE, blink42, &ts, false, NULL, &blink42OD ); // // ///* // Approach 5: Two interleaving tasks //*/ //#define PERIOD5 600 //bool blink51OE(); //void blink51(); //void blink52(); //void blink52OD(); //Task tBlink5On ( 600 * TASK_MILLISECOND, DURATION / PERIOD5, &blink51, &ts, false, &blink51OE ); //Task tBlink5Off ( 600 * TASK_MILLISECOND, DURATION / PERIOD5, &blink52, &ts, false, NULL, &blink52OD ); // // ///* // Approach 6: RunCounter-based with random intervals //*/ //#define PERIOD6 300 //void blink6CB(); //bool blink6OE(); //void blink6OD(); //Task tBlink6 ( PERIOD6 * TASK_MILLISECOND, DURATION / PERIOD6, &blink6CB, &ts, false, &blink6OE, &blink6OD ); void setup() { // put your setup code here, to run once: #if defined(_DEBUG_) || defined(_TEST_) Serial.begin(115200); delay(TASK_SECOND); _PL("TaskScheduler Blink example"); _PL("Blinking for 10 seconds using various techniques\n"); delay(2 * TASK_SECOND); #endif pinMode(LED_BUILTIN, OUTPUT); } void loop() { ts.execute(); } inline void LEDOn() { digitalWrite( LED_BUILTIN, HIGH ); } inline void LEDOff() { digitalWrite( LED_BUILTIN, LOW ); } // === 1 ======================================= bool LED_state = false; void blink1CB() { if ( tBlink1.isFirstIteration() ) { _PP(millis()); _PL(": Blink1 - simple flag driven"); LED_state = false; } if ( LED_state ) { LEDOff(); LED_state = false; } else { LEDOn(); LED_state = true; } // if ( tBlink1.isLastIteration() ) { // tBlink2.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); // } } //// === 2 ====================================== //void blink2CB_ON() { // if ( tBlink2.isFirstIteration() ) { // _PP(millis()); // _PL(": Blink2 - 2 callback methods"); // } // // LEDOn(); // tBlink2.setCallback( &blink2CB_OFF ); // // if ( tBlink2.isLastIteration() ) { // tBlink3.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); // } //} // // //void blink2CB_OFF() { // // LEDOff(); // tBlink2.setCallback( &blink2CB_ON ); // // if ( tBlink2.isLastIteration() ) { // tBlink3.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); // } //} // // //// === 3 ===================================== //void blink3CB() { // if ( tBlink3.isFirstIteration() ) { // _PP(millis()); // _PL(": Blink3 - Run Counter driven"); // } // // if ( tBlink3.getRunCounter() & 1 ) { // LEDOn(); // } // else { // LEDOff(); // } // // if ( tBlink3.isLastIteration() ) { // tBlink4On.setOnEnable( &blink41OE ); // tBlink4On.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); // } //} // // //// === 4 ============================================= //int counter = 0; //bool blink41OE() { // _PP(millis()); // _PL(": Blink4 - Internal status request based"); // counter = 0; // tBlink4On.setOnEnable( NULL ); // return true; //} // //void blink41() { // // _PP(millis()); // // _PL(": blink41"); // LEDOn(); // StatusRequest* r = tBlink4On.getInternalStatusRequest(); // tBlink4Off.waitForDelayed( r ); // counter++; //} // //void blink42() { // // _PP(millis()); // // _PL(": blink42"); // LEDOff(); // StatusRequest* r = tBlink4Off.getInternalStatusRequest(); // tBlink4On.waitForDelayed( r ); // counter++; //} // // //void blink42OD() { // if ( counter >= DURATION / PERIOD4 ) { // tBlink4On.disable(); // tBlink4Off.disable(); // // tBlink5On.setOnEnable( &blink51OE ); // tBlink5On.restartDelayed( 2 * TASK_SECOND ); // tBlink5Off.restartDelayed( 2 * TASK_SECOND + PERIOD5 / 2 ); // LEDOff(); // } //} // // //// === 5 ========================================== //bool blink51OE() { // _PP(millis()); // _PL(": Blink5 - Two interleaving tasks"); // tBlink5On.setOnEnable( NULL ); // return true; //} //void blink51() { // // _PP(millis()); // // _PL(": blink51"); // LEDOn(); //} //void blink52() { // // _PP(millis()); // // _PL(": blink52"); // LEDOff(); //} //void blink52OD() { // tBlink6.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); //} // // //// === 6 ============================================ //long interval6 = 0; //bool blink6OE() { // _PP(millis()); // _PP(": Blink6 - RunCounter + Random ON interval = "); // interval6 = random( 100, 901 ); // tBlink6.setInterval( interval6 ); // _PL( interval6 ); // tBlink6.delay( 2 * TASK_SECOND ); // // return true; //} // //void blink6CB() { // if ( tBlink6.getRunCounter() & 1 ) { // LEDOn(); // tBlink6.setInterval( interval6 ); // } // else { // LEDOff(); // tBlink6.setInterval( TASK_SECOND - interval6 ); // } //} // //void blink6OD() { // tBlink1.restartDelayed( 2 * TASK_SECOND ); // LEDOff(); //}
谢谢你们的帮助。
最后的编辑: