> 有一次在做开发的过程中,发现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,以使该工作是否从队列中删除。
#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_ */
#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