OpenEdv-开源电子网

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

基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程

  [复制链接]

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
跳转到指定楼层
楼主
发表于 2016-8-27 18:19:09 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 taoking_opendev 于 2022-1-5 16:54 编辑

主要实现功能:
1 tcp server并发(主要涉及文件app_lwip.c、app_tcp_server.c)
2 网线热插拔(主要涉及文件app_lwip.c、app_tcp_server.c)
3 不重启修改ip地址(主要涉及文件app_lwip.c、app_tcp_server.c、app_key.c(按键修改ip地址))
4 将lwip的数据接收从中断方式改成单独的接收任务方式(主要涉及文件app_lwip.c)
5 usb串口信息打印(115200波特率)
6 注意:使用的stm32的HAL库而不是标准库

附件是我的基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发解决例程
说明如下:
1 ucos-iii版本是直接从ucos官网下载的基于stm32f407的15年中旬的版本
2 lwip移植的操作系统模拟层sys_sem_t和sys_mbox_t定义成普通变量而不是指针,其空间是在任务堆栈中而不用在动态堆中申请
3 为了充分利用CCM空间,我把所有静态申请的TCB空间和栈空间都放到bsp_ccm.c文件中,具体设置如图1,CCM空间是从0x1000 0000 开始的共64K(0x10000)大小的空间,在图中将其前面的多选框选中
同样,探索者开发板还有1M的外部sram,从0x6800 0000开始的0x10 0000大小的空间
4 由于有内部ram、ccm、外部sram三个ram空间,keil可以让我们选择每个.c文件下申请的静态空间放到哪个ram空间中,我们可以在.\Objects\OS3.sct中进行设置,如下例子
  1. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  2.   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }
  7.   RW_RAM1 0x68000000 0x00100000  {  ; RW data
  8.    mem.o (+RW +ZI)
  9.    memp.o (+RW +ZI)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00020000  {
  12.    .ANY (+RW +ZI)
  13.   }
  14.   CCM_IRAM 0x10000000 0x00010000  {
  15.    bsp_ccm.o (+RW +ZI)  
  16.    os_prio.o (+RW +ZI)
  17.    os_var.o (+RW +ZI)
  18.    os_cpu_c.o (+RW +ZI)
  19.    os_cfg_app.o (+RW +ZI)

  20.   }
  21. }
复制代码
------------------------------------------------------------------------------
   上例子中,bsp_ccm.o、os_prio.o 、os_var.o 、os_cpu_c.o、os_cfg_app.o中申请的静态空间就会被分配到CCM空间中,为了使用自己的这个文件而不是keil默认的.crt文件,进行如图2的设置,即把Use Memory Layout from Target Dialog前面的勾取消
5 在原子malloc动态内存管理修改,具体看附件中的malloc.h和malloc.c,主要是修改内存堆的起始地址,以便空出内存的前一半位置用来静态分配,而后一半内存用作动态内存申请。
这样修改的目的是,在原子的历程中lwip的内存堆和内存池空间,f407的mac描述符和缓冲区空间都是用mymalloc()函数申请的,而正常情况下,这些内存是不会被释放掉的,如果其他地方需要动态申请内存的时候,由于原子的malloc分配策略是用的首次拟合,每次申请都会从堆末尾往前寻找可用空间,而堆末尾因为这些早申请而不释放的空间占据,所以每次申请空间时都会进行一些不必要的找寻,所以最好的方法是:将那些申请之后不会释放的空间直接用静态申请;而那些动态申请空间用完后释放的内存才使用malloc分配
6 tcp server并发程序涉及的主要文件是app_tcp_server.c,主要思路如下:
  a, 创建一个任务作为server主任务监听请求,等有连接要求时创建一个新的子任务专门负责新的连接通信
  b,如果子任务连接断开,调用OSTaskDel()删除自己,之后子任务结束而不会从OSTaskDel()返回
  c,由于每个子任务用到的TCB和任务堆栈都是malloc动态申请的,需要释放,但是在子任务在删除自己前还会用到这些空间,因此这些空间只能被其他任务在子任务del删除之后释放
  d,基于以上原因,子任务在删除自己之前向server主任务发送一个消息,消息内容就是要删除的空间首地址,server主任务调用非阻塞的OSTaskQPend()等待接收这个消息
  e,为什么要非阻塞等待呢?因为主任务的主要职责是监听连接然后创建子任务通信,因此主任务的阻塞只能是由netconn_accept()来完成。而netconn_accept()也不是真正的阻塞,而是每隔conn->recv_timeout 醒来一次,醒来之后就可以非阻塞调用OSTaskQPend(),看是否有释放子任务TCB和任务堆栈空间的要求。如果有则完成释放,如果没有则继续阻塞在netconn_accept()等待新的连接。周而复始。
  f, OSTaskDel()删除自身后不会返回,所以此函数返回的OS_ERR  *p_err变量不能是子任务内的局部变量而应该是全局变量,这里是tcp_server_delete_ChildTask,在server任务释放空间时需要检查此变量是否正确
7 另外还实现了网线的热插拔,这里的热插拔是指在没有开上层网络应用的情况下,只要随时插上网线,随时都可以ping通,与板子启动时是否连接网线、断开后又连接无关。添加上层tcp应用之后的热插拔目前还没有实现
8 附件代码是用的source insight软件进行组织的(下载此软件之后打开文件名:STM32F407.PR),此软件是查看代码的利器,建议使用它来编辑代码,由keil来编译
keil源文件在STM32F407_uCOS-III+lwip(20160826)\Micrium_STM3240G-EVAL_OS3\Micrium\Examples\ST\STM3240G-EVAL\OS3这个目录下

如有表述不清的,看不明白的可以给我留言。
如果使用过程中发现有bug,也请在下面留言

图2.jpg (69.58 KB, 下载次数: 811)

图2.jpg

图1.jpg (93.37 KB, 下载次数: 763)

图1.jpg

STM32F407_uCOS-III lwip(20160827).zip

3.52 MB, 下载次数: 16319

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

使用道具 举报

14

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-10-16
在线时间
31 小时
推荐
发表于 2019-5-30 16:19:27 | 只看该作者
曹尼玛的,下载后根本打不开,就是一个快捷方式图标。
回复 支持 0 反对 3

使用道具 举报

2

主题

39

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2239
金钱
2239
注册时间
2016-5-10
在线时间
549 小时
59#
发表于 2023-9-25 13:13:32 | 只看该作者
有例程吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-6-16
在线时间
2 小时
58#
发表于 2022-6-16 23:25:52 | 只看该作者
请问我现在遇到407+83848运行ucosiii系统,不带网线启动会ping不通,用的工程也是原子的tcp服务器ucosiii工程。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-5-30
在线时间
2 小时
57#
发表于 2022-5-16 20:00:02 | 只看该作者
good example!Thanks for sharing
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-5-2
在线时间
1 小时
56#
发表于 2022-5-2 14:14:17 | 只看该作者
感谢分享
回复 支持 反对

使用道具 举报

2

主题

47

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-4-23
在线时间
7 小时
55#
发表于 2022-4-24 21:42:27 | 只看该作者
en hehe hao
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
金钱
398
注册时间
2020-3-12
在线时间
72 小时
54#
发表于 2021-11-11 20:55:17 | 只看该作者
taoking_opendev 发表于 2021-11-11 16:37
这个可能是TCP调试助手的原因,也不排除是开发板程序的原因。因为工作用不到,所以之后也没有再深究这个 ...

谢谢回复,不过我通过这个DEMO测试过,确实是存在回显问题的。
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
53#
 楼主| 发表于 2021-11-11 16:37:44 | 只看该作者
a15370731330 发表于 2021-8-11 13:25
请教一下 长时间运行后 回显时间变慢的问题怎么解决

这个可能是TCP调试助手的原因,也不排除是开发板程序的原因。因为工作用不到,所以之后也没有再深究这个问题了
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
金钱
398
注册时间
2020-3-12
在线时间
72 小时
52#
发表于 2021-8-11 13:25:30 | 只看该作者
请教一下 长时间运行后 回显时间变慢的问题怎么解决
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2021-7-19
在线时间
9 小时
51#
发表于 2021-7-19 16:52:02 | 只看该作者
厉害了
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-6-3
在线时间
4 小时
50#
发表于 2021-7-6 15:53:06 | 只看该作者
sigequan2010 发表于 2021-7-6 13:45
你好,我下载这个例程后,刷进我的板子,板子用的芯片是stm32f407ZGT6,没有外部sram,软件使用的是keil5。 ...

问题解决了,仔细看你1楼的第3、4条重新进行配置,程序可以跑起来
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-6-3
在线时间
4 小时
49#
发表于 2021-7-6 13:45:33 | 只看该作者
你好,我下载这个例程后,刷进我的板子,板子用的芯片是stm32f407ZGT6,没有外部sram,软件使用的是keil5。程序下载后在启动文件startup.s里,只执行到 LDR     R0, =__main
就无法运行了,进入了App_Fault_ISR。查了很久没查出问题。请问这个大概是哪里出了问题?   
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-1-30
在线时间
8 小时
48#
发表于 2020-8-7 14:58:42 | 只看该作者

感谢分享!
回复 支持 反对

使用道具 举报

24

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2011-9-6
在线时间
37 小时
47#
发表于 2020-5-20 14:35:54 | 只看该作者
大神们  有没有client端 网线热插拔那块的处理?小弟求教!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-4-23
在线时间
5 小时
46#
发表于 2020-4-26 14:46:10 | 只看该作者
感谢分享!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-4-23
在线时间
5 小时
45#
发表于 2020-2-6 10:34:27 | 只看该作者
初始化成功后,为什么再拔掉网线检测不到呢?lwipdev.init.ok标志位不变话,应该看哪个标志位。
回复 支持 反对

使用道具 举报

24

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2011-9-6
在线时间
37 小时
44#
发表于 2020-1-10 16:23:24 | 只看该作者
有socket的并发程序吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-9-26
在线时间
5 小时
43#
发表于 2020-1-3 08:58:54 | 只看该作者
不错。
子任务创建时的任务优先级 static uint8_t i=0;
创造任务过多的时候,i会超出范围。
另外,连接断开过快时,任务删除只会删除5个子任务的内存。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-4-25
在线时间
4 小时
42#
发表于 2019-9-28 15:05:50 | 只看该作者
正准备弄个FreeRTos+Lwip的http服务器。正好借鉴借鉴。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-9-3
在线时间
38 小时
41#
发表于 2019-9-10 11:25:35 | 只看该作者
感谢分享,参考一下
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-8-5
在线时间
12 小时
40#
发表于 2019-9-9 11:35:25 | 只看该作者
参考下
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-5-28
在线时间
1 小时
38#
发表于 2019-5-28 15:38:51 | 只看该作者
学习了,楼主。。。
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2013-12-25
在线时间
52 小时
37#
发表于 2019-4-26 17:08:15 | 只看该作者
nice  好文
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2018-5-17
在线时间
8 小时
36#
发表于 2019-3-25 16:34:13 | 只看该作者
mark一下,正要学习
回复 支持 反对

使用道具 举报

2

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2019-1-16
在线时间
101 小时
35#
发表于 2019-3-8 16:02:02 | 只看该作者
mark!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-12-25
在线时间
1 小时
34#
发表于 2018-12-25 17:28:34 | 只看该作者
老可爱 发表于 2018-12-25 17:18
用keil5 直接编译出现68个error?怎么破

..\..\..\STM32CubeF4\Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h(184): error:  #5: cannot open source input file "core_cm4.h": No such file or directory
  #include "core_cm4.h"             /* Cortex-M4 processor and core peripherals */
..\app.c: 0 warnings, 1 error

将STM32F407_uCOS-III+lwip(20160827)\Micrium_STM3240G-EVAL_OS3\Micrium\Examples\ST\STM32CubeF4\Drivers\CMSIS 中的所有。h都添加了 都还没用
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-12-25
在线时间
1 小时
33#
发表于 2018-12-25 17:18:37 | 只看该作者
用keil5 直接编译出现68个error?怎么破
回复 支持 反对

使用道具 举报

18

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2018-6-7
在线时间
104 小时
32#
发表于 2018-6-29 15:22:36 | 只看该作者
万分感谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2017-7-5
在线时间
22 小时
31#
发表于 2018-1-30 22:30:52 | 只看该作者
mark一下,谢谢。
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
30#
发表于 2017-12-24 10:50:32 | 只看该作者
mark1111
回复 支持 反对

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
29#
发表于 2017-12-12 09:00:07 | 只看该作者
mark一下
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
28#
 楼主| 发表于 2017-6-19 16:18:52 | 只看该作者
hi我歌月徘徊 发表于 2017-5-24 11:14
编译一下,少了好几个头文件 都在探索者的例程里复制过去了,最后还有一个文件找不到
#include  "../../.. ...

a/b.h是指的相对路径,这样的话,你只需要在头文件路径中加入a的路径就可以了
回复 支持 反对

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
27#
发表于 2017-5-24 11:14:03 | 只看该作者
编译一下,少了好几个头文件 都在探索者的例程里复制过去了,最后还有一个文件找不到
#include  "../../../../Source/os.h"   这怎么搞?
还有个问题 有些头文件的写法为何加 a/b.h  为啥加“/”呢?
谢楼主
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-5-10
在线时间
6 小时
26#
发表于 2017-5-10 20:24:16 | 只看该作者
mark     s
回复 支持 反对

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
25#
发表于 2017-4-26 00:17:39 | 只看该作者
马克一下,多谢楼主
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2016-8-30
在线时间
7 小时
24#
发表于 2017-3-17 11:59:33 | 只看该作者
回复 支持 反对

使用道具 举报

ludq 该用户已被删除
23#
发表于 2017-3-16 16:06:13 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
22#
发表于 2017-3-10 18:31:52 | 只看该作者
帅   领了
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2012-8-27
在线时间
77 小时
21#
发表于 2017-3-10 17:20:15 | 只看该作者
谢谢分享,学习下
回复 支持 反对

使用道具 举报

0

主题

125

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2728
金钱
2728
注册时间
2015-10-29
在线时间
428 小时
20#
发表于 2017-2-8 13:16:24 | 只看该作者
谢谢楼主好资 料
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-7-28
在线时间
7 小时
19#
发表于 2016-12-27 22:56:06 | 只看该作者
正在琢磨战舰板的并发问题,先标注一下,看是否可用到战舰板中
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3776
金钱
3776
注册时间
2015-4-26
在线时间
766 小时
18#
发表于 2016-9-27 17:26:49 | 只看该作者
mark,f4+ucosiii+lwip
我有故事,你有酒吗
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-14
在线时间
44 小时
17#
发表于 2016-9-7 23:00:26 | 只看该作者
本帖最后由 aimjoe 于 2016-9-7 23:40 编辑
taoking_opendev 发表于 2016-9-7 17:28
如果还是不明白,你可以结合bsp_int.c和startup.s,看看两个文件中的中断向量函数是个怎样的关系。另外你 ...

你好,感谢你的回复。
1、关于第一个问题,我将你的例程在原子的STMF407开发板上跑通了(没有改代码,直接下载)以后,我发现你的例程里面中断向量表不是HAL自带的,因此我将你的例程移植到我的STMF439开发板上,利用STM官方的HAL库+UCOSIII,使用HAL库自带的startup_stm32f439xx.s启动文件。而这个启动文件中函数 ETH_IRQHandler(void)  是中断向量函数。经过以上移植,在UCOSIII下自己建立了五个任务,运行正常。
2、在 HAL库+UCOSIII 移植正常以后,我基于你的例程移植LWIP,但是没有使用你的例程中startup.s中的中断向量函数,使用的是 startup_stm32f439xx.s 自带的向量表。


我修改的地方:
我看你在 void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) 函数中
使用了 下面这三个函数
        /* set priority of ETH*/  
        //void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
        BSP_IntPrioSet (BSP_INT_ID_ETH, APP_CFG_INTERRUPT_ETH_PRIO);

        /* configurate ISR of ETH*/
        BSP_IntVectSet(BSP_INT_ID_ETH, LwipBSP_STM32_ETH_IntHandler);

        /* enable NVIC interupt  of ETH*/
        //void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
        BSP_IntEn(BSP_INT_ID_ETH);

由于这三个函数是设置网络中断服务函数的,因此我就是用下面这两个函数


        /* set priority of ETH*/  
        HAL_NVIC_SetPriority(ETH_IRQn,0,0);         //网络中断优先级应该高一点

        /* enable NVIC interupt  of ETH*/        
        HAL_NVIC_EnableIRQ(ETH_IRQn);

代替,然后将你所使用的网络中断服务函数:

void LwipBSP_STM32_ETH_IntHandler(void)
{

        HAL_ETH_IRQHandler(D_HandleStructure);

}


修改为

void ETH_IRQHandler(void)
{
        HAL_ETH_IRQHandler(D_HandleStructure);        
               
}


实验现象:
我在ETH_IRQHandle函数中设置断点,并在另一台电脑中ping开发板,只能在一开始进入ETH_IRQHandle函数两三次,以后就进不了ETH_IRQHandle中断函数。虽然一开始进入ETH_IRQHandle中断函数,但是另一台电脑始终无法ping通,也无法连接中开发板服务器。附件为移植以后的程序源代码。
谢谢你的回复



Template_UCOSIII_LWIP.zip

2.32 MB, 下载次数: 1196

回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
16#
 楼主| 发表于 2016-9-7 17:28:25 | 只看该作者
aimjoe 发表于 2016-9-6 18:31
你好,我看你在 void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) 函数中
使用了 下面这三个函数
         ...

如果还是不明白,你可以结合bsp_int.c和startup.s,看看两个文件中的中断向量函数是个怎样的关系。另外你把中断优先级设的稍微低一点试试呢
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
15#
 楼主| 发表于 2016-9-7 17:23:04 | 只看该作者
aimjoe 发表于 2016-9-6 18:31
你好,我看你在 void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) 函数中
使用了 下面这三个函数
         ...

void ETH_IRQHandler(void)这个函数是在startup.s中的中断向量函数吗。在ucos中每个中断函数都是有头OSIntEnter();和尾的OSIntExit();,你可以看一下我工程中BSP_IntHandler()这个函数,修改后的伪代码应该是如下
static  void  BSP_IntHandler (CPU_DATA  int_id)
{
    CPU_FNCT_VOID  isr;
    CPU_SR_ALLOC();


    CPU_CRITICAL_ENTER();                                       /* Tell the OS that we are starting an ISR            */
    OSIntEnter();
    CPU_CRITICAL_EXIT();

   LwipBSP_STM32_ETH_IntHandler();

    OSIntExit();                                                /* Tell the OS that we are leaving the ISR            */
}
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-14
在线时间
44 小时
14#
发表于 2016-9-6 18:31:17 | 只看该作者
本帖最后由 aimjoe 于 2016-9-6 18:42 编辑

你好,我看你在 void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) 函数中
使用了 下面这三个函数
        /* set priority of ETH*/  
        //void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
        BSP_IntPrioSet (BSP_INT_ID_ETH, APP_CFG_INTERRUPT_ETH_PRIO);

        /* configurate ISR of ETH*/
        BSP_IntVectSet(BSP_INT_ID_ETH, LwipBSP_STM32_ETH_IntHandler);

        /* enable NVIC interupt  of ETH*/
        //void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
        BSP_IntEn(BSP_INT_ID_ETH);

由于这三个函数是设置网络中断服务函数的,因此我就是用下面这两个函数


        /* set priority of ETH*/  
        HAL_NVIC_SetPriority(ETH_IRQn,0,0);         //网络中断优先级应该高一点

        /* enable NVIC interupt  of ETH*/        
        HAL_NVIC_EnableIRQ(ETH_IRQn);

代替,然后将你所使用的网络中断服务函数:

void LwipBSP_STM32_ETH_IntHandler(void)
{

        HAL_ETH_IRQHandler(D_HandleStructure);

}


修改为

void ETH_IRQHandler(void)
{
        HAL_ETH_IRQHandler(D_HandleStructure);        
               
}

修改后无法用客户端连接,请问如何解决
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165562
金钱
165562
注册时间
2010-12-1
在线时间
2118 小时
13#
发表于 2016-8-29 23:30:53 | 只看该作者
不错啊,cool
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-14
在线时间
44 小时
12#
发表于 2016-8-29 22:50:21 | 只看该作者
taoking_opendev 发表于 2016-8-29 20:57
不好意思,HAL库是趋势,所以我从一开始就是按照HAL库写的

能否做一个本实例的移植教程,这个例子真的太棒了
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
11#
 楼主| 发表于 2016-8-29 20:57:17 | 只看该作者
aimjoe 发表于 2016-8-29 17:01
是否可以提供一份使用stm32标准库的例程,想使用你的例程做一下压力测试。谢谢,祝好!
邮箱是 aim.cured@ ...

不好意思,HAL库是趋势,所以我从一开始就是按照HAL库写的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-9-16 02:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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