ESP8266 SDK开发: 外设篇-系统任务(消息队列,通知)

2021-12-01 15:02:25 浏览数 (1)

说明

咱先使用一下这个功能,然后再说明使用这个功能的应用场合

写上以下程序

代码语言:javascript复制
#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;//定义软件定时器结构体变量
代码语言:javascript复制
//定时器回调函数
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_callbackrn");
    }
}
代码语言:javascript复制
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的级别;而且经过测试,频繁的定时器会影响到网络信号的传输.

如果需要轮训,可以使用下面的方式

轮训一次任务的时间基本上是固定的,可以使用变量累加来执行定时操作

停止轮训

0 人点赞