异步执行语句
支持芯片: SHMICTRL系列芯片 ESP32-S3系列void async_run(int n);
//n: 语句组编号
在异步通信过程中,比如WIFI通信中,大量使用异步方式完成操作;在异步操作中,如果需要串联调用多个异步通信指令,就会需要在执行完成的完成事件中继续使用异步命令调用,这样相当于在一个没有结束的线程中直接启用另一个线程,在单片机这种内存极其紧张的环境中就会导致RAM内存不够,减少系统的稳定性;
因此我们增加了异步执行语句,在需要启动新语句的时候,不在完成事件中启动,而是通过async_run语句在主进程的消息循环中启动新的WIFI通信语句;
async_run语句执行后不停留,直接回继续执行async_run语句后面的语句;
调用没有结束的时候就调用灵异
示例
void app.onASYNC(int m){
if (m==1){
wifi_sntp("ntp.tencent.com","CST-8");
}
if (m==2){
getuser();//获取用户
}
}
void app.onWIFI32(int m){
//本事件函数中请不要书写wifi启动语句
int size;
int code;
if (m==2){
//wifi_connect
code=wifi_getinfo(8);
if (code==3){
//连接成功
async_run(1);
}
}
if (m==5){
//sntp 完成
async_run(2);
}
};
wifi_connect("ssid","passwd");
start();
在以上的代码中,按下步骤执行:
- 第一步:页面在start()启动界面UI刷新前执行wifi_connet
- 第二步:wifi连接成功后,调用app.onWIFI32(int m)事件,判断标志后,执行了async_run(1);然后退掉app.onWIFI32函数,此时wifi_connet整个线程已经被退出,内存释放;
- 第三步:主界面UI消息循环中,在执行完页面刷新后,调用app.onASYNC(int m),在此函数中启动wifi_sntp获取网络时间;
- 第四步:获取网络时间后,wifi线程调用app.onWIFI32,然后调用async_run(2);并且退出当前wifi线程
- 第五步:在主消息循环中,调用下一个wifi调用,getuser是通过httpget调用api接口完成用户登录;
注意
- 详细见: