我正在使用FreeRTOS启动一个新的嵌入式系统设计。我最后一个使用eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统。简而言之,它的工作方式是每个页面都是一个类似CGI的C函数,在HTTP守护程序需要时调用它。具体来说,你会写形式的函数:线程中的C或C++ HTTP守护进程?
int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
其中page
是URL的网页部分,params
是任何形式的参数(只得到了支持,而不是帖子,这阻止文件上传,从而制成燃烧闪痛),uData
是当你注册的功能设置通过一个道理,所以你可以有同样的功能服务于多个URL或用不同的数据范围和resp
是你写的HTTP响应文件句柄(头和全部)。
然后你注册的函数:
CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
其中CYG_HTTPD_TABLE_ENTRY
是一个宏观的,其中第一个参数是一个变量名,第二个是页面URL(该*
通配符是允许的;因此page
获得通过,以MyWebPage()
),第三个是函数指针,最后一个是uData
值。
所以一个简单的例子:
int HelloWorldPage(FILE* resp, const char*, const char* params, void*)
{
fprintf("Content-Type: text/html;\n\n");
fprintf("<html><head><title>Hello World!</title></head>\n");
fprintf("<body>\n");
fprintf("<h1>Hello, World!</h1>\n");
fprintf("<p>You passed in: %s</p>\n", params);
fprintf("</body></html>\n");
}
CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0);
(实际上,params
会通过函数传递逃脱魔术HTML字符,我会用另一对夫妇的功能分裂PARAMS,并作出<ul>
出来这一点,但是我离开是出于对清晰度。)
本身只是跑了作为一个任务(即线程),并在方式没有得到,只要它比关键任务的优先级较低的服务器。
不用说,有这个证明是非常宝贵的测试和调试。 (内嵌工作的一个问题是,你一般不能折腾一个xterm作为日志使用。)所以,当最高法院程序员本能地指责我的东西不工作(阻力最小的路径,我猜),我能拉起网页,并显示他给我发送了糟糕的参数。在整合过程中节省了很多调试时间。
所以无论如何...我在想,是否有这样的东西可以作为一个独立的图书馆?我可以链接的东西,注册我的回调,产生一个线程,并让它做魔术?或者我需要开始自己的?我更喜欢C++,但也可以使用C库。
编辑:由于我把一个赏金就可以了,我需要澄清的是,库将需要在开放源代码许可证。
FreeRTOS不提供自己的IP堆栈,但它确实支持LwIP和uIP。基本上,我会很好的支持类似套接字API的库,或者如果库需要我编写一些“发送这些字节”和“接收这些字节”的函数。 – 2010-02-26 19:30:06