当前位置: 代码迷 >> 综合 >> Arduino ESP8266? 几行代码实现简易多任务框架
  详细解决方案

Arduino ESP8266? 几行代码实现简易多任务框架

热度:87   发布时间:2023-12-15 02:52:39.0

Arduino ESP8266  几行代码实现简易多任务框架。

上层是NONOS,框架基本原理还是切换,只不过不使用delay,可以做到任务之间的穿插执行,实时性提高,但并不能保证强实时性。

#include <ESP8266WiFi.h>
#include "sys_rw.h"#include "rw_ledblink.h"
//#include "rw_1602.h"
//#include "rw_DS1302.h"typedef unsigned long clock_t;
clock_t nowt ;
clock_t oldt;
time_t t;
void setup(){ Serial.begin(115200);Serial.println("setup...");nowt   =   millis(); rw_ledblink_setup(1);//led任务//rw_1602_setup(2);//其他任务//rw_DS1302_setup(3);//其他任务oldt=nowt;     
}void loop(){nowt   =   millis();  int dis=nowt-oldt;rw_run(dis);  oldt=nowt;}

 

 

//===================================================
sys_rw.h

定义个结构体,根据任务数量定义 结构体数组和指针数组的元素个数。如20个。


#ifndef _SYS_RW_H
#define _SYS_RW_H
#include <Arduino.h>typedef void (*loopType)(int );  
typedef struct rwdata
{unsigned char setup_rewu1_ok ;unsigned char en;unsigned int time_rewu;unsigned int time_add;loopType fp;
}  rwdata;extern rwdata rwdata_array[20];//real data
extern rwdata* renwudataall[20];//data point
extern void rw_run(int dis);#endif // _SYS_RW_H


//===================================================
sys_rw.cpp

loop中调用 rw_run()循环调用所有任务的xx_loop(dis)

#include "sys_rw.h"
rwdata rwdata_array[20];//real data
rwdata* renwudataall[20];//data pointvoid rw_run(int dis){for(int i=0;i<20;i++){//cout<<"id="<<i<<endl;rwdata* data_rewuc=renwudataall[i];if(data_rewuc!=NULL){//cout<<(int)(*data_rewuc).en<<endl;if(rwdata_array[i].en)(rwdata_array[i].fp)(dis);}		}
}

 

//任务代码示例

//===================================================
rw_ledblink.h

每个任务要有xx_setup,xx_loop定义。

 

#ifndef _RW_LEDBLINK_H
#define _RW_LEDBLINK_H#include "sys_rw.h"extern int rw_ledblink_state;
extern int rw_ledblink_id;
extern rwdata* rw_ledblink_datp;
extern void rw_ledblink_setup(int rw_id);
extern void rw_ledblink_loop(int rw_time);#endif // _RW_LEDBLINK_H

//===================================================
rw_ledblink.cpp
xx_setup完成任务的初始化

 

xx_loop实现不容时间节点响应不同动作,或者其他任务改变本任务的状态rw_ledblink_state来响应不同动作。


#include "sys_rw.h"
#include "rw_ledblink.h"#define LED LED_BUILTIN
int rw_ledblink_state = 0;
int rw_ledblink_id = 0;
rwdata* rw_ledblink_datp;
void rw_ledblink_setup(int rw_id) {rw_ledblink_id = rw_id;rw_ledblink_datp = &(rwdata_array[rw_id]);(*rw_ledblink_datp).en = 1;renwudataall[rw_id] = rw_ledblink_datp;(*rw_ledblink_datp).fp = rw_ledblink_loop;//Set LEDpinMode(LED, OUTPUT);
}
int rw_ledblink_flash = 0;
void rw_ledblink_loop(int rw_time) {int id = rw_ledblink_id;//cout<<"loop rw_ledblink "<< rw_time<<endl;rwdata_array[id].time_add += rw_time;if (rwdata_array[id].time_add >= rwdata_array[id].time_rewu) {//cout<<"loop rw_ledblink running"<<endl;//delay(100);rwdata_array[id].time_rewu=100;if (rw_ledblink_state == 0) {//cout<<" rw_ledblink state  0 ,delay 1000"<<endl;//Serial.println(" rw_ledblink state  0  ,delay 1000");digitalWrite(LED, LOW);rwdata_array[id].time_rewu = 1000;} else if (rw_ledblink_state == 1) {//cout<<" rw_ledblink state  1 ,delay 200"<<endl;//Serial.println(" rw_ledblink state  1 ,delay 200");rwdata_array[id].time_rewu = 200;digitalWrite(LED, rw_ledblink_flash % 2);rw_ledblink_flash++;}rwdata_array[id].time_add = 0;}
}