arduino实现的无阻塞延时库JSTime-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5755|回复: 15

arduino实现的无阻塞延时库JSTime

[复制链接]
发表于 2021-1-23 17:51 | 显示全部楼层 |阅读模式
我把上次在综合讨论区发的帖子转到技术进阶板块下, 并修复了几个bug。该库支持arduino uno,stm32,esp32等。

受javascript的 setTimeout 和 setInterval启发 实现的延时定时器,代替delay延时。
适合延时时间比较长, 延时精度要求不高的场合

demo代码:

#include <Arduino.h>
#include "cxg_JSTime.h"

//支持arduino uno, stm32, esp32
static JSTime jsTime;
int timeId = 0;
int i = 0;

void setup() {
  Serial.begin(115200);

  //每隔1s执行一次, 执行三次取消执行
  timeId = jsTime.setInterval([]() {
    Serial.println("setInterval 1000ms");
    i++;
    if(i == 3) {
      //清除延时执行, clearTime 如果不指定timeId,则全部取消
      jsTime.clearTime(timeId);
    }
  },
    1000);

  //无阻塞延时2s
  jsTime.setTimeout([]() {
    Serial.println("setTimeout delay 2000ms");
    //延时嵌套
    jsTime.setTimeout([]() {
      Serial.println("nesting setTimeout delay 1000ms");
    },
      1000);
  },
    2000);
}

void loop() {
  jsTime.refresh();
}




代码无阻塞延时, 也不用声明一些无意义的时间变量来控制代码了。
setInterval每隔一段时间执行一次,非常适合打印监控信息。
setTimeout执行完毕立即销毁。


CxgJSTime.zip (2.99 KB, 下载次数: 18)




 楼主| 发表于 2021-1-28 18:59 | 显示全部楼层
本帖最后由 cxg 于 2021-1-29 09:54 编辑

又升级了一下1.修复其他数个bug
2.新增延时回调函数传参

#include <Arduino.h>
#include "cxg_JSTime.h"

//支持arduino uno, stm32, esp32
static JSTime jsTime;

struct TestStruct {
  int a = 0;
  int b = 0;
};

//测试参数传递
void testTimeoutParams(int p1, void* p2) {
  Serial.println("params test");
  Serial.print("get param1: ");
  Serial.println(p1);
  struct TestStruct* param = ( struct TestStruct* )p2;
  if(param != NULL) {
    Serial.print("get param2 struct p->a:");
    Serial.println(param->a);
    Serial.print("get param2 struct p->b:");
    Serial.println(param->b);

    free(param);
    param = NULL;
  }
}

void setup() {
  Serial.begin(115200);
  jsTime.setTimeout([]() {
    //动态创建一个结构体
    struct TestStruct* param = ( struct TestStruct* )malloc(sizeof(struct TestStruct));
    if(param == NULL) {
      Serial.println("fail create TestStruct");
      return;
    }
    param->a = 123;
    param->b = 456;

    jsTime.setTimeout(testTimeoutParams, 2000, 789, param);
  },
    3000);
}

void loop() {
  jsTime.refresh();
}




CxgJSTime.zip (4.94 KB, 下载次数: 7)


 楼主| 发表于 2021-4-8 10:53 | 显示全部楼层
现在放到github上了
https://github.com/chengxg/CxgJSTime
码云:
https://gitee.com/chengxiaogang/CxgJSTime
 楼主| 发表于 2021-3-16 09:55 | 显示全部楼层
再次升级,  修复嵌套执行时引发的某些bug
CxgJSTime.zip (5.02 KB, 下载次数: 11)
发表于 2021-3-17 11:18 | 显示全部楼层
不错,精神可嘉!
 楼主| 发表于 2021-3-17 14:19 | 显示全部楼层

这个是异步执行IO的思想, 使用这个应用程序可以完全实现无阻塞执行
发表于 2021-4-18 23:51 | 显示全部楼层
无阻塞执行,是不是相当于DMA功能
发表于 2021-4-18 23:52 | 显示全部楼层
是调用中断0实现的还是
 楼主| 发表于 2021-4-19 15:48 | 显示全部楼层
perseverance51 发表于 2021-4-18 23:51
无阻塞执行,是不是相当于DMA功能

不是, 是事件循环
 楼主| 发表于 2021-4-19 15:49 | 显示全部楼层
perseverance51 发表于 2021-4-18 23:52
是调用中断0实现的还是

软件定时, loop循环
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:30 , Processed in 0.180232 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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