FreeRTOS+TCP介绍
概述
FreeRTOS+TCP实现了可扩展、开源和线程安全的TCP/IP协议栈。它的特性如下:
- Berkeley 套接字API
- 可选支持TCP滑动窗口
- API完全可重入和线程安全
- 包括 ARP, DHCP, DNS, LLMNR, NBNS等协议
- 免费ARP(Gratuitous ARP)
- 静态、DHCP和Auto-IP地址分配
- 可以被用作 UDP only stack
- 可选的回调接口
- 可选的输出包分段
详细资料请参看官方文档 。
架构
网络接口层位于IP协议栈和硬件驱动层之间:
注意: FreeRTOS+TCP协议栈的实现是依赖于FreeRTOS 内核的,这与FreeRTOS Core不同。
注意:在FreeRTOS+TCP的所有函数中,FreeRTOS_IPInit API必须首先被调用,它会生成FreeRTOS+TCP任务,该任务会初始化网络接口,并根据配置回调 * vIPNetworkEventHook*函数。
用法
FreeRTOS Socket的用法和通常的Berkeley Socket的用法基本相同。
- 客户端:
- FreeRTOS_socket -> FreeRTOS_setsockopt-> FreeRTOS_bind -> FreeRTOS_connect
- FreeRTOS_send <=> FreeRTOS_recv
- FreeRTOS_shutdown -> FreeRTOS_closesocket
- 服务端:
- FreeRTOS_socket -> FreeRTOS_setsockopt -> FreeRTOS_bind -> FreeRTOS_listen -> FreeRTOS_accept
- FreeRTOS_recv <=> FreeRTOS_send
- FreeRTOS_shutdown -> FreeRTOS_closesocket
服务端可以采用多线程并发模式,为每个客户端连接新建一个任务,由该任务负责后续服务。
注意:在调用FreeRTOS_closesocket前,需调用FreeRTOS_shutdown API,然后调用FreeRTOS_recv循环等待,直到返回**-pdFREERTOS_ERRNO_EINVAL,表明socket连接已经断开。从安全的角度讲,socket的不正常关闭很可能造成服务器的资源泄漏,而引发崩溃或者拒绝服务。
提示: UDP的用法与TCP的用户大都相同,UDP的发送可以采用零拷贝(zero-copying)技术**。
网络数据缓存(Network data buffer)
BufferAllocation_1.c
BufferAllocation_2.c
配置文件
FreeRTOSIPConfig.h的主要配置项:
- 影响TCP/IP栈任务行为的常量
- 调试、跟踪和日志设置
- 针对硬件和驱动的设置
- 针对TCP的设置
- 针对UDP的设置
- 影响Socket行为的常量
- 影响ARP行为的常量
- 影响DHCP和名字服务的常量
- 影响IP和ICMP行为的常量
- 提供支持目标板的常量