OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3749|回复: 2

在STM32F4硬件基础上搭建LWIP多线程服务器

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2019-8-9
在线时间
2 小时
发表于 2019-8-11 21:21:20 | 显示全部楼层 |阅读模式
本帖最后由 电子新人小楠 于 2019-8-12 07:41 编辑

     前俩天参加全国电子设计大赛,遇到了很多的问题,之前接触过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
下面附件是我的代码,希望能帮助到别人

带操作系统的TCP 服务器.zip

1.42 MB, 下载次数: 123

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2010
金钱
2010
注册时间
2016-8-7
在线时间
152 小时
发表于 2019-8-12 13:41:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2017-8-16
在线时间
60 小时
发表于 2021-3-19 08:55:53 | 显示全部楼层
牛,没看之前卡了两天:)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 07:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表