123liyao 发表于 2018-9-15 17:03:51

子函数能不耽误主函数运行吗

问下看到这问题的大佬,有函数或者别的方法能够使arduino子函数不耽误其他函数运行吗?我有一个程序需要子函数执行相当长的时间,但是如果执行子函数,那么主函数就要等这段时间。执行速度变得巨慢!

shouzama 发表于 2018-9-16 07:39:13

ARDUINO 的程式原本就是逐行執行,
如果你要母程式&子程式同步兼顧的話,
就是要自已改寫程式執行的方式

比方說以 delay() 來講,子程式如果用了
delay() 造成佔用太多執行時間,就改寫成
先讀取 Millis() 毫秒值記錄為起始值,然後
讓程式繼續往下跑,並判斷時間是否已經
過了想要 delay 的值

如果是,切換工作狀態(當成已 delay 完成切
往下一個工作指令),然後一樣是記錄 millis()、
比對經過時間...

你的子程式為何佔用太多時間? :o

123liyao 发表于 2018-9-16 16:11:46

shouzama 发表于 2018-9-16 07:39
ARDUINO 的程式原本就是逐行執行,
如果你要母程式&子程式同步兼顧的話,
就是要自已改寫程式執行的方式


timer1=millis();
    digitalWrite(a1,LOW);
    digitalWrite(a2,HIGH);
    digitalWrite(a3,HIGH);
    digitalWrite(a4,HIGH);
    digitalWrite(a5,HIGH);
    delay(200);
    timer2=millis();
   
    digitalWrite(a1, HIGH);
    digitalWrite(a2, HIGH);
    digitalWrite(a3, HIGH);
    digitalWrite(a4, HIGH);
    digitalWrite(a5, HIGH);

    while(timer2-timer1>2000)
    {
    digitalWrite(a1,LOW);
    digitalWrite(a2,LOW);
    digitalWrite(a3,LOW);
    digitalWrite(a4,LOW);
    digitalWrite(a5,LOW);
    timer2=millis();
    } 这样吗?

Super169 发表于 2018-9-16 20:11:08

避免用 delay,然後同主程式一齊放 loop 入面, 改成 if (millis() - lastTime > 2000) 之類代替 delay(2000).
比如你想每 2 秒轉一次:


void loop() {
:
: 主程式
:

if (millis() - lastTime > 2000) {
    mode = 1 - mode;
    digitalWrite(a1, mode);
    digitalWirte(a2, mode);
    :
    lastTime = millis();
}
}

主程式入面都唔好用 delay().


brucewoo 发表于 2018-9-17 02:35:44

避免用Delay()

pathletboy 发表于 2018-9-17 09:32:02

状态机 或者 protothreads
页: [1]
查看完整版本: 子函数能不耽误主函数运行吗