lwip+ucos+STM32实现HTTP Server
main函数中创建主任务 tApp_MainTask
||
\/
主任务tApp_MainTask中创建LWIP初始化任务uctsk_Init+HTTP server实现任务TCP_Html
int main(void)
{
unsigned char os_err;
InterruptCount = 0; //for test
MailSendCount = 0; //for test
MailRecCount = 0; //for test
SendCount = 0; //for test
CPU_IntDis(); //关闭中断,在初始化进程结束后才打开中断
OSInit();//初始化UCOS
os_err = OSTaskCreateExt( (void (*)(void *)) tApp_MainTask, //创建主任务
(void *) 0,
(OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE -1] , //指定任务堆栈栈顶
(INT8U ) APP_TASK_START_PRIO, //指定任务优先级
(INT16U ) APP_TASK_START_PRIO, //指定任务标识号
(OS_STK *) &App_TaskStartStk[0], //指定任务堆栈栈底
(INT32U ) APP_TASK_START_STK_SIZE, //任务堆栈大小
(void *) 0, //指向附加数据域
(INT16U ) (OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK) //操作选项
);
#if OS_TASK_NAME_EN > 0
OSTaskNameSet(APP_TASK_START_PRIO, (INT8U *)"Start Task", &os_err);
#endif
OSStart(); //开始任务调度 ,该函数内部将会打开中断允许
return(0);
}
static void tApp_MainTask()
{
OS_CPU_SysTickInit();
#if (OS_TASK_STAT_EN > 0)
OSStatInit(); // Determine CPU capacity.
#endif
fApp_SubCreate(); //实现两个子任务的创建
for(;;)
{
OSTimeDlyHMSM(0,1,0,0);
}
}
static void fApp_SubCreate(void)
{
INT8U os_err;
os_err = os_err; /* prevent warning... */
fApp_InitTaskCreate(); //LWIP初始化任务
os_err = OSTaskCreateExt((void (*)(void *)) TCP_Html,
(void * ) 0,
(OS_STK * )&App_TCP_HtmlStk[APP_TCP_HtmlStkSize - 1],
(INT8U ) App_TCP_HtmlPrio,
(INT16U ) App_TCP_HtmlPrio,
(OS_STK * )&App_TCP_HtmlStk[0],
(INT32U ) APP_TCP_HtmlStkSize,
(void * ) 0,
(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));
#if OS_TASK_NAME_EN > 0
OSTaskNameSet(App_TCP_HtmlPrio, "Task_TCP_Html", &os_err);
#endif
}
static void uctsk_Init (void)
{
//NVIC_Configration();
//USART_Configuration();
//TIM_Configuration();
//GPIO_Configuration();
//FSMC_SRAM_Init();
Init_lwIP(); //实现LWIP初始化
OSTaskDel(OS_PRIO_SELF);
}
static void TCP_Html(void)
{
http_init();
while(1)
{
OSTimeDlyHMSM(0,0,0,10);;
}
}
void http_init(void)
{
struct tcp_pcb *pcb;
pcb = tcp_new(); /* 建立通信的TCP 控制块(pcb) */
tcp_bind(pcb,IP_ADDR_ANY,80); /* 绑定本地IP 地址和端口号 */
pcb = tcp_listen(pcb); /* 进入监听状态 */
tcp_accept(pcb,http_accept); /* 设置有连接请求时的回调函数 */
}
static err_t http_accept(void *arg,struct tcp_pcb *pcb,err_t err)
{
tcp_setprio(pcb, TCP_PRIO_MIN); /* 设置回调函数优先级,当 */
/* 存在几个连接时特别重要, */
/* 此函数必须调用*/
tcp_recv(pcb,http_recv); /* 设置TCP 段到时的回调函数 */
err = ERR_OK;
return err;
}
static err_t http_recv(void *arg, struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{
if(p != NULL)
{
tcp_write(pcb,http_html_hdr,sizeof(http_html_hdr),0); /* 发送http 协议头部信息 */
tcp_write(pcb,indexdata,sizeof(indexdata),0); /* 发送http 网页信息 */
pbuf_free(p); /* 释放该TCP 段 */
}
tcp_close(pcb); /* 关闭这个连接 */
err = ERR_OK;
return err;
}
const static INT8U indexdata[]="