<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/Learn8266ForSDK" width="100%"></iframe>
说明
咱先使用一下这个功能,然后再说明使用这个功能的应用场合
写上以下程序
#define os_event_t_buff_len 255 /*消息队列长度;最大255*/ os_event_t os_event_t_buff[os_event_t_buff_len]; //存储消息的数组 #define TaskPrio 2 //任务等级(0,1,2),2是最高等级 os_timer_t os_timer_one;//定义软件定时器结构体变量
//定时器回调函数 void os_timer_one_function(void *parg){ //把消息插入队列(sig=0;par=0) system_os_post(TaskPrio, 0, 0); } /* 系统有空余时间的时候会取出消息队列里面的消息 如果有消息则会调用其回调函数 */ void os_task_t_callback(os_event_t *events){ if(events->sig == 0 && events->par ==0){ os_printf("os_task_t_callback\r\n"); } }
uart_init_2(BIT_RATE_115200,BIT_RATE_115200); //os_task_t_callback:任务回调函数 //TaskPrio:任务等级(0,1,2),2是最高等级 //os_event_t_buff:消息队列记录的数组 //os_event_t_buff_len 消息队列长度 system_os_task(os_task_t_callback, TaskPrio, os_event_t_buff, os_event_t_buff_len); //配置定时器 os_timer_setfn(&os_timer_one,os_timer_one_function,NULL);//os_timer_one:定时器结构体变量 os_timer_one_function:回调函数 yang:传给回调函数的参数 //使能定时器 os_timer_arm(&os_timer_one,1000,1);//os_timer_one:定时器变量 1:1s进一次 1:循环
下载到开发板以后,打开串口调试助手
会看到程序每隔1S打印 os_task_t_callback
关于ESP8266的系统任务
ESP8266内部可以运行消息队列任务.总共可以创建3个消息队列任务
创建任务:
调用创建消息队列任务函数的时候设置好任务的回调函数, 任务的消息等级, 缓存队列消息的数组.
下面是固定的形式哈,就是这样子写.
把消息插入消息队列:
第一个参数 TaskPrio填写的是任务消息等级;
后面的两个参数是 0- 4294967296之间的数
后面是把0,0插入了消息队列.第一个0设置的是消息队列sig值; 第二个0设置的是消息队列par的值.
系统有空的时候就从消息队列里面取出数据,然后调用回调函数:
假设需要在适当的时候发送个通知关闭定时器
system_os_post可以写到任意地方,我下面只是演示,就放到了定时器里面
假设咱设置sig为1;par为1的时候用来关闭定时器
在网络通信的时候,官方也是建议使用系统消息队列的形式关闭网络连接
使用任务代替定时器
定时器只能定时在5ms和100us的级别;而且经过测试,频繁的定时器会影响到网络信号的传输.
如果需要轮训,可以使用下面的方式
轮训一次任务的时间基本上是固定的,可以使用变量累加来执行定时操作
停止轮训