【ThreadX全家桶】STM32CubeMX+NetX Duo(一)


前言

本教程基于STM32CubeMX生成的HAL库,开发NetX Duo驱动程序。
NetX Duo驱动中关于ETH的使用,主要有7个方面:
1、ETH控制器初始化
2、TX描述符初始化
3、数据发送
4、数据发送后,NetX的有关后续处理
5、RX描述符初始化
6、中断接收
7、中断接收后,NetX的有关后续处理


提示:以下是本篇文章正文内容,下面案例可供参考

一、HAL与NetX发送逻辑对比

1、HAL库TX初始化及发送

①初始化:将TX描述符首尾链接起来,形成链表。
②初始化:每一个节点挂接一个BUFF,长度固定为ETH_TX_BUF_SIZE。(注:TX_BUFF是一个连续的大BUFF)
③发送:在TX_BUFF起始地址填充长度为length的帧内容。
④发送:根据length/ETH_TX_BUF_SIZE计算需要占用几个描述符,进行相应的设置。
⑤发送:将使用的描述符的所有权设为DMA所有,等待DMA发送完成后会自动将描述符所有权归还给CPU。
在这里插入图片描述

2、NetX的TX初始化及发送

NETX协议栈产出的帧并不是放在一个buff中,而是存储在NX_PACK链表中。因为NX_PACK结构体含有其他信息,所以不能直接将NX_PACK链表放到HAL的TX_BUFF中。
①初始化:将TX描述符首尾链接起来,形成链表(初始化时不挂接BUFF)。
在这里插入图片描述

②发送:将NX_PACK链表中每个节点指向的包指针赋值给相应描述符的Buffer1Addr。
③发送:根据NX_PACK链表节点数量计算需要占用几个描述符,进行相应的设置,并且最后一个描述符设置“完成时中断”标志。
④发送:将使用的描述符的所有权设为DMA所有,等待DMA发送完成后会自动将描述符所有权归还给CPU,并产生一次中断。
在这里插入图片描述

3、NetX的TX发送完成后包释放

①HAL中没有关于数据发送完成后的后续处理。
②NETX在帧发送完成后,需要释放存储帧的NX_PACK链表到包池中。

二、HAL与NetX接收逻辑对比

1、HAL库RX初始化及接收

①RX初始化与TX初始化类似,但是在初始化时将所有的RX描述符所有权设置为DMA所有。
②当ETH收到数据时,设置相应的RX描述符状态,将其所有权归还给CPU,并产生中断。
③中断接收函数分析描述符状态,在ETH控制字中保存该帧的头部描述符、结尾描述符、帧长度、帧起始地址(即头部描述符的Buffer1Addr),以供后续处理。

2、NetX的RX初始化及发送

①初始化:将RX描述符首尾链接起来,形成链表。
②初始化:使用nx_packet_pool_create函数,从包池中申请一个NX_PACK,将该结构体中的包地址、包长度赋值给RX描述符,并将描述符的所有权设置为DMA所有。
③初始化:重复申请,直至为所有描述符都分配到NX_PACK。此时所有NX_PACK 的 nx_packet_next都指向NX_NULL。
④接收:当ETH收到数据时,设置相应的RX描述符状态,将其所有权归还给CPU,并产生中断。
⑤接收:中断接收函数分析描述符状态,在ETH控制字中保存该帧的头部描述符、结尾描述符、帧长度、帧起始地址(即头部描述符的Buffer1Addr)。
在这里插入图片描述

3、NetX的RX发送完成后包释放

HAL没有关于帧接收完成后的后续处理,不做过多讨论。下面主要讲述NetX接收完成后的后续处理。
①头部描述符对应的NX_PACK_01 的 nx_pack_next指向下一个描述符对应的NX_PACK地址,即NX_PACK_02地址。
②重复步骤1,直至到结尾描述符对应的NX_PACK。此时形成了一条NX_PACK链表,该链表中保存这接收到的帧。
在这里插入图片描述
③因为保存着帧数据的NX_PACK链表需要传递给NetX协议栈处理,不能继续接收数据。所以需要给其对应的描述符分配新的NX_PACK,操作过程与“NetX的RX初始化及发送”小结的步骤②③相同。分配完成后如下图所示,此时保存帧的NX_PACK链表已经独立。
在这里插入图片描述
④将NX_PACK根据类型,出入相应的NetX API即可,NetX处理完成后会自动释放该链表。


总结

HAL提供的API,其TX与RX的缓存区为一段连续的buff,以参数length计算出发送需要使用多少个TX描述符,接收时需要从RX_BUFF中读取多长的数据。
NetX Duo将帧数据保存在NX_PACK链表中,以 NX_PACK 的 nx_pack_next 指向 NX_NULL 作为结尾包。其帧参数特性与HAL完全不同,所以需要针对HAL中关于帧拆包/组包的逻辑进行重构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值