ESP8266http工作队列的实现方法

>   有一次在做开发的过程中,发现8266的三个任务已经尽数用完了o(╯□╰)o。没办法,串口驱动也要用一个呢。后来干脆想,把HTTP的任务加在队列里,定时扫描队列出对执行就好了,然后就开始构想代码。于是就是下面两片代码。

    app_net_work.c为上层提供app_net_work_init()、http_set_work(http_work_t job),这两个函数,顾名思义就是初始化队列和入队。

    然后app_http.c是再下一层,作用是描述具体任务,主要是将工作号和任务对应起来,这里用到了函数指针数组,这样可以方便自由地增删新的函数,不过注意在接收函数末了加入判断是否将GlobalHttp.info.isworking置0,以使该工作是否从队列中删除。
/*
 * app_net_work.h
 *
 *  Created on: 2017年5月25日
 *      Author: Administrator
 */

#ifndef APP_INCLUDE_APP_NET_WORK_H_
#define APP_INCLUDE_APP_NET_WORK_H_

#include "jobs_of_net_work.h"

#define HTTP_TASK_SIZE  8

ETSTimer net_work_timer;

typedef struct{
    http_work_t     task_sequence[HTTP_TASK_SIZE];
    struct {
        uint8_t         active:4;
        uint8_t         current:3;
        uint8_t         isworking:1;
    }info;
}http_task_t;

http_task_t GlobalHttp;

int ICACHE_FLASH_ATTR app_net_work_init();
int ICACHE_FLASH_ATTR http_set_work(http_work_t job);

#endif /* APP_INCLUDE_APP_NET_WORK_H_ */
/*
 * app_net_work.c
 *
 *  Created on: 2017年5月25日
 *      Author: Administrator
 */
#include "includes.h"
#include "client.h"
#include "app_net_work.h"
#include "app_http.h"


//把工作加入队列
int ICACHE_FLASH_ATTR http_set_work(http_work_t job){

    if ((GlobalHttp.info.current + 1) % HTTP_TASK_SIZE == GlobalHttp.info.active)
    {
        os_printf("\r\nIn queue error,may be full.\r\n");
        return FALSE;
    } //队满,无法添加
    GlobalHttp.task_sequence[GlobalHttp.info.current] = job;  //插入元素
    GlobalHttp.info.current =  (GlobalHttp.info.current + 1) % HTTP_TASK_SIZE; //队尾指针+1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值