前俩天参加全国电子设计大赛,遇到了很多的问题,之前接触过USO II 也玩过lwip,但是都是作为客户端去主动链接,还没试过去搭建多线程服务器,这一次选择了E题(基于互联网的信号传输系统)需要搭建多线程服务器,但是自己并没试过这种做法,之前用树莓派搭建过多线程服务器,觉得不难,但是当使用F4的时候,发现资料少的可怜,所以在完成后特地把自己做的东西发布出来,希望对大家有所帮助。
硬件开发平台:STM32F4正点原子探索者
网络通信协议:LWIP
操作系统 : USOC II
在正常情况下,实现一个并发服务器,我们的做法是先开一个监听线程,如果有客服端接入则新开一个线程去进行收发。
但是在实际的情况下,我不知道是自己的做法不对还是LWIP设置的问题(希望知道这个答案的朋友指点一下),netconn_accept()每次直接接受一个客户端的请求,当有新的请求接入时,只要上一个不断开就不会接受,必须得是上一个端口后,再请求才能接入。导致无法一个端口接受多个客户端的请求。这是我遇到的第一个坑,在网上寻找的做法都是开俩个端口来给这俩个不同的客户端进行通信。这种做法虽然不够优雅,但是时间紧迫,当时也就只能采用这种方式。
第二个坑是,栈溢出,在开了俩个端口后,发现程序一直卡死,进入调试后发现一直停在HardFault_Handler,初步判断是内存不够,后面查阅了各种资料,发现是启动文件的堆栈设置的太小,后来进入到startup_stm32f40_41xxx.s文件,对其宏定义进行修改,Stack_Size 栈的大小,Heap_Size,堆的大小。之前栈的大小只有200,在改为800后终于可以顺利运行。
第三个坑是一个比较隐蔽的就是LWIP对 net_buif 以及netconn进行了宏定义,分别规定了接受缓冲区的个数以及最大链接个数,需要增加 MEMP_NUM_NETBUF和MEMP_NUM_NETCONN的值才能实现多个链接。
[code]Stack_Size EQU 0x00000800
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00001200
下面附件是我的代码,希望能帮助到别人 |