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-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();
}
现在放到github上了
https://github.com/chengxg/CxgJSTime
码云:
https://gitee.com/chengxiaogang/CxgJSTime 再次升级,修复嵌套执行时引发的某些bug
不错,精神可嘉! perseverance51 发表于 2021-3-17 11:18
不错,精神可嘉!
这个是异步执行IO的思想, 使用这个应用程序可以完全实现无阻塞执行 无阻塞执行,是不是相当于DMA功能 是调用中断0实现的还是
perseverance51 发表于 2021-4-18 23:51
无阻塞执行,是不是相当于DMA功能
不是, 是事件循环 perseverance51 发表于 2021-4-18 23:52
是调用中断0实现的还是
软件定时, loop循环
页:
[1]
2