这几天在移植uIP做东西,里面有一段代码是这样的:
handle_connection(struct httpd_state *s) { handle_input(s); if(s->state == STATE_OUTPUT) { handle_output(s); }
跳转到handle_input(s);这个函数去查看:
static PT_THREAD(handle_input(struct httpd_state *s)) { PSOCK_BEGIN(&s->sin); PSOCK_READTO(&s->sin, ISO_space); if(strncmp(s->inputbuf, http_get, 4) != 0) { //±È½Ï"GET " PSOCK_CLOSE_EXIT(&s->sin); } PSOCK_READTO(&s->sin, ISO_space); if(s->inputbuf[0] != ISO_slash) { //ÊÇ·ñÊÇ/ PSOCK_CLOSE_EXIT(&s->sin); } if(s->inputbuf[1] == ISO_space) { strncpy(s->filename, http_index_html, sizeof(s->filename)); } else { s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); } /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ s->state = STATE_OUTPUT; while(1) { PSOCK_READTO(&s->sin, ISO_nl); if(strncmp(s->inputbuf, http_referer, 8) == 0) { s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; /* httpd_log(&s->inputbuf[9]);*/ } } PSOCK_END(&s->sin); }
看看函数名是static
PT_THREAD(handle_input(struct httpd_state *s))
继续跳转过去查看:
#define PT_THREAD(name_args) char name_args
以前还没见过这种编程方式,就百度查了一下PT_THEAD,之后看到了一篇博文,其中就写了这样一段:
有段时间用MSP430F449,flash只有60k,RAM只有2k,还要做一些数据采集,资源非常紧张,想给它移植uC/OS II是得不偿失的。(到5438就好了些, 256KB Flash, 16KB RAM)所以非常需要节省资源又能实现实时多任务的系统,于是找到了Protothread。严格说,这个不算操作系统,只是一个编程框架,全是用宏来实现的。感觉很有意思,打算以后研究一下它的代码。 原来在用RTOS时感觉特别方便的就是任务函数中可以调用系统提供的延时,等待等函数,切换到其它任务上执行,这样写程序又简单而且又能充分利用硬件资源,但这样做在切换任务时浪费了很多的系统时间及占用很多RAM,而且对于8位或16位小内存的 单片机也不太适合。最近几天在看开源网络协议UIP1.0,居然在DHCP应用实例中看到了一种以很简单的方法实现类似多任务功能的编程方法,只需占用只个字节的RAM资源,而且非常的容易使用。
突然对这个Protothread有了兴趣,有谁使用过这个编程框架呀,传授一下经验哟!!!