6600|6

1944

帖子

32

TA的资源

纯净的硅(高级)

楼主
 

请教一个LWIP的NETCONN UDP协议的问题 [复制链接]

有一个需求,想采用LWIP协议栈实现PC和STM32F429主控板通讯,拟采用UDP协议。PC上发送控制指令,主控板接收到控制指令后,处理接收到的指令,并根据指令执行的情况

返回响应的结果。
由于指令的执行需要一定的时间,所以想采用Netconn API将UDP接收和UDP发送分成两个任务,
接收到PC指令后,发消息给应用任务(执行指令);应用任务执行后,发消息给UDP发送任务,
发送执行结果给PC。

如果UDP接收和发送在同一任务的时候,指令执行的时候任务处于阻塞状态,可能无法接收到
PC发来的新的指令。

忘了说了,采用的是Freertos操作系统。无法创建两个任务,哪一个任务先创建,
那个任务就能成功创建。但是另外一个任务就没有创建。(在两个任务中加上打印,只能打印一个)

现在的问题是,基于Netconn API的UDP可以分成收发两个任务进行处理吗?如果不行,那有什么办法
在执行PC发送的控制指令的这段时间又不妨碍UDP正常接收下一条指令?
此帖出自stm32/stm8论坛

最新回复

LWIP的任务数量是有设置的, 超过了设置的数量, 任务不能创建. 这个可以打开LWIP相应的调试输出, 可以查看输出信息. 接收阻塞时, 发送数据是可以的. 如果采用广播方式应答, 比较简单; 如果向发送数据的IP应答, 需要使用receive_from和send_to函数. receive_from函数, 可以得到发送方的IP及端口, send_to可以向指定的IP和端口发送数据. 这些内容可以百度. 我做这些是使用的socket API, 和Netconn API有多大差别不清楚, 请自己区分. 希望有所帮助.  详情 回复 发表于 2018-1-13 10:23
点赞 关注
 

回复
举报

18

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
据我所知,可以分成两个任务,不过需要保证两个任务读写网卡芯片有先有后不会冲突。
创建两个任务的时候,选择适当的优先级,执行指令的任务和接收UDP的任务可以同时进行的,FreeRTOS是分时执行不同任务的。阻塞最好能用FreeRTOS的Take一类的API实现,不占用CPU,提高效率。
此帖出自stm32/stm8论坛

点评

我是用消息队列的,接收到PC的控制指令,执行后才会有返回。因为执行的时间相对较长,所以想把它分成两个任务。UDP 的RX任务优先级比TX任务优先级高,这样避免漏接PC发出的控制指令。  详情 回复 发表于 2018-1-14 01:50
 
 

回复

88

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
LWIP的任务数量是有设置的, 超过了设置的数量, 任务不能创建. 这个可以打开LWIP相应的调试输出, 可以查看输出信息. 接收阻塞时, 发送数据是可以的. 如果采用广播方式应答, 比较简单; 如果向发送数据的IP应答, 需要使用receive_from和send_to函数. receive_from函数, 可以得到发送方的IP及端口, send_to可以向指定的IP和端口发送数据. 这些内容可以百度.

我做这些是使用的socket API, 和Netconn API有多大差别不清楚, 请自己区分. 希望有所帮助.
此帖出自stm32/stm8论坛
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

4
 
非常感谢楼上兄弟的解释,我用的是LWIP2.0版本,官网上查了一下配置宏的API,看到里面有这个:
看样子是说没有开启这个宏,就不支持多线程。不过开启了这个宏,编译的时候出现好几个错误。
(采用CubeMx直接生成工程也是这样)。看样子是API还有些BUG。
此帖出自stm32/stm8论坛
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

5
 
检查了一下错误,发现还需要实现以下几个函数:

/** LWIP_NETCONN_SEM_PER_THREAD==1: Use one (thread-local) semaphore per
* thread calling socket/netconn functions instead of allocating one
* semaphore per netconn (and per select etc.)
* ATTENTION: a thread-local semaphore for API calls is needed:
* - LWIP_NETCONN_THREAD_SEM_GET() returning a sys_sem_t*
* - LWIP_NETCONN_THREAD_SEM_ALLOC() creating the semaphore
* - LWIP_NETCONN_THREAD_SEM_FREE() freeing the semaphore
* The latter 2 can be invoked up by calling netconn_thread_init()/netconn_thread_cleanup().
* Ports may call these for threads created with sys_thread_new().
*/

头大
此帖出自stm32/stm8论坛
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

6
 
axbin 发表于 2018-1-13 02:16
据我所知,可以分成两个任务,不过需要保证两个任务读写网卡芯片有先有后不会冲突。
创建两个任务的时候, ...

我是用消息队列的,接收到PC的控制指令,执行后才会有返回。因为执行的时间相对较长,所以想把它分成两个任务。UDP 的RX任务优先级比TX任务优先级高,这样避免漏接PC发出的控制指令。
此帖出自stm32/stm8论坛
 
 
 

回复

1944

帖子

32

TA的资源

纯净的硅(高级)

7
 
找到原因所在了,犯了很低级的错误,Freertos的configTOTAL_HEAP_SIZE空间不够用,改大了就OK了。
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表