极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17489|回复: 5

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

[复制链接]
发表于 2018-9-15 17:03:51 | 显示全部楼层 |阅读模式
问下看到这问题的大佬,有函数或者别的方法能够使arduino子函数不耽误其他函数运行吗?我有一个程序需要子函数执行相当长的时间,但是如果执行子函数,那么主函数就要等这段时间。执行速度变得巨慢!
回复

使用道具 举报

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

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

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

你的子程式為何佔用太多時間?
回复 支持 反对

使用道具 举报

 楼主| 发表于 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();
    } 这样吗?
回复 支持 反对

使用道具 举报

发表于 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().


回复 支持 反对

使用道具 举报

发表于 2018-9-17 02:35:44 | 显示全部楼层
避免用Delay()
回复 支持 反对

使用道具 举报

发表于 2018-9-17 09:32:02 | 显示全部楼层
状态机 或者 protothreads
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 03:11 , Processed in 0.042147 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表