lwip+ucos+STM32实现HTTP Server

lwip+ucos+STM32实现HTTP Server

硬件环境:STM32

软件环境:ucosii+LWIP+keil

前期任务:已完成移植LWIP到UCOSII上

实现方法:TCP通讯

实现流程

                                                            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);
}


}

fApp_SubCreate

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
}

LWIP初始化任务uctsk_Init

static void uctsk_Init  (void)
{
//NVIC_Configration();
//USART_Configuration();
//TIM_Configuration();
//GPIO_Configuration();
//FSMC_SRAM_Init();
Init_lwIP();                    //实现LWIP初始化
OSTaskDel(OS_PRIO_SELF);
}

HTTP server任务实现代码

static void TCP_Html(void)
{
  http_init(); 
  while(1) 
  { 
    OSTimeDlyHMSM(0,0,0,10);; 
  }  
}

http_init

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);                                /*  设置有连接请求时的回调函数   */ 
}

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; 
}

http_recv

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; 
}

HTTP协议头和WEB页面HTML内容

const static INT8U indexdata[]="test pagehere is the test page";
const static INT8U http_html_hdr[]="HTTP/1.1  200 OK\r\nContent-type: text/html\r\n\r\n";

你可能感兴趣的:(HTML,UC/OSII)