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的用法基本相同。

  • 客户端:
    1. FreeRTOS_socket -> FreeRTOS_setsockopt-> FreeRTOS_bind -> FreeRTOS_connect
    2. FreeRTOS_send <=> FreeRTOS_recv
    3. FreeRTOS_shutdown -> FreeRTOS_closesocket
  • 服务端:
    1. FreeRTOS_socket -> FreeRTOS_setsockopt -> FreeRTOS_bind -> FreeRTOS_listen -> FreeRTOS_accept
    2. FreeRTOS_recv <=> FreeRTOS_send
    3. 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行为的常量
  • 提供支持目标板的常量

移植

QEMU示例