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

cxg 发表于 2021-1-23 17:51

arduino实现的无阻塞延时库JSTime

我把上次在综合讨论区发的帖子转到技术进阶板块下, 并修复了几个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执行完毕立即销毁。







cxg 发表于 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();
}







cxg 发表于 2021-4-8 10:53

现在放到github上了
https://github.com/chengxg/CxgJSTime
码云:
https://gitee.com/chengxiaogang/CxgJSTime

cxg 发表于 2021-3-16 09:55

再次升级,修复嵌套执行时引发的某些bug

perseverance51 发表于 2021-3-17 11:18

不错,精神可嘉!

cxg 发表于 2021-3-17 14:19

perseverance51 发表于 2021-3-17 11:18
不错,精神可嘉!

这个是异步执行IO的思想, 使用这个应用程序可以完全实现无阻塞执行

perseverance51 发表于 2021-4-18 23:51

无阻塞执行,是不是相当于DMA功能

perseverance51 发表于 2021-4-18 23:52

是调用中断0实现的还是

cxg 发表于 2021-4-19 15:48

perseverance51 发表于 2021-4-18 23:51
无阻塞执行,是不是相当于DMA功能

不是, 是事件循环

cxg 发表于 2021-4-19 15:49

perseverance51 发表于 2021-4-18 23:52
是调用中断0实现的还是

软件定时, loop循环
页: [1] 2
查看完整版本: arduino实现的无阻塞延时库JSTime