创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

rt-thread 优化系列(五)lwip 裁剪

出出 来源:出出 作者:出出 2022-06-23 10:21 次阅读

前言

很久之前就开始整理下面的优化项列表了,但是有很多问题研究不深,一时不敢冒失推出。
前不久,有人在论坛上提问,当时我给的答案比现在少,但是现在列出来的这些也不能保证是全部,以后再做补充吧。

lwip 协议栈、sal socket 抽象层使用了很多全局数组变量当作线程栈,可以修改成从内存堆动态申请的内存。
有些功能和特性在嵌入式设备里是用不到的,可以先去掉。
还有的是可有可无的特性,如果想用,也存在优化空间,可以自己实现。

以下说明不限于 lwip ,sal 部分也有涉及。

裁剪详解

sal 可裁剪优化项

1. `SAL_INTERNET_CHECK`: 网络检测,使用到了 workqueue 。检测原理就是尝试连接 "link.rt-thread.org::8101",发送检测数据。
这个或者可以去掉检测,或者换成自家服务器。
2. `#define SAL_SOCKETS_NUM 4`: 这个可能是支持创建 socket 的最大数量。
3. `RT_USING_NETDEV`: 网络接口设备,没有终端操作的情况下可以优化掉。其中,`NETDEV_USING_IFCONFIG` `NETDEV_USING_PING` `NETDEV_USING_NETSTAT` `NETDEV_USING_AUTO_DEFAULT` 分别可以单独增删。
4. `NETDEV_IPV6`: 目前支持还不普及的吧,可以关掉,如果需要才开启。

lwip 可裁剪优化项

1. `RT_LWIP_IGMP` 组播需要用到的,不用组播可能可以去掉
2. `RT_LWIP_ICMP` ping 命令使用的协议,没有 ping 也不需要这个协议。
3. `RT_LWIP_DNS` 局域网不需要这个,或者说,直接使用 ip 地址进行连接而不是使用 url 链接地址,可以不使用 dns。
4. `RT_LWIP_TCP_WND` tcp 接收窗口,这个应该是申请内存大小。可以适当减小。不定义就是 1460 x 2 字节
5. `RT_LWIP_TCP_SND_BUF` tcp 发送缓存,同上,不定义就是 1460 x 2 字节
6. `LWIP_NO_TX_THREAD` 和 `LWIP_NO_RX_THREAD` eth 线程,发送一个,接收一个。以下是几个相关宏定义,如果不定义堆栈大小,默认使用 1024

   #define RT_LWIP_ETHTHREAD_PRIORITY 12
   #define RT_LWIP_ETHTHREAD_STACKSIZE 1024
   #define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
   #define LWIP_NO_TX_THREAD
   #define LWIP_NO_RX_THREAD

源码里,这部分还有很大优化空间,具体见下文详解。
7. `LWIP_NETIF_STATUS_CALLBACK` 和前边的 SAL_INTERNET_CHECK 有关,这里设置网络连接回调。可以通知应用层连接上 INTERNET 了。
8. `LWIP_NETIF_LINK_CALLBACK` 网卡连接状态,仅表示物理连接接入网络,有可能是和电脑直连,或者交换机、路由器等等。
9. `SO_REUSE` 端口复用,这个在组播,而且是 UDP 协议才有用。不需要就定义成 0
10. `LWIP_SO_SNDTIMEO` `LWIP_SO_RCVTIMEO` `LWIP_SO_RCVBUF` 这三个,如果 rtconf.h 里没有定义, lwipopts.h 会定义,所以不需要就定义成 0。
其中 LWIP_SO_RCVBUF 接收缓冲,涉及到接收缓冲上限。多数情况下不会有影响,只有网络数据多的时候才可能达到这个缓存上限。
11. `RT_LWIP_USING_PING` 这个和前面的 NETDEV_USING_PING RT_LWIP_ICMP 有关。
12. `RT_LWIP_STATS` 这是一组 stat 的总开关,详细细节查看 lwipopts.h 文件内的定义。或者取消 RT_LWIP_STATS 定义,关闭所有 stat 项,或者单独修改 lwipopts.h 文件中某些 stat 定义。

13. 修改 eth_rx_thread 和 eth_tx_thread ,启用 RT_USING_HEAP 后,添加动态创建线程。这两个线程被初始化在 INIT_PREV_EXPORT 阶段。片上内存堆和片外内地堆初始化注册都在 INIT_BOARD_EXPORT 阶段,可以申请使用动态内存。

erx etx 两个线程

以 etx 为例。`ethernetif_linkoutput` 函数主要操作如下:

   if (rt_mb_send(ð_tx_thread_mb, (rt_uint32_t) &msg) == RT_EOK)
   {
       /* waiting for ack */
       rt_sem_take(&(enetif->tx_ack), RT_WAITING_FOREVER);
   }

发送了一个邮箱,然后等待一个信号量。这个信号量从哪儿来?看下面的 etx 线程入口函数。

static void eth_tx_thread_entry(void* parameter)
{
   struct eth_tx_msg* msg;
   while (1)
   {
       if (rt_mb_recv(ð_tx_thread_mb, (rt_ubase_t *)&msg, RT_WAITING_FOREVER) == RT_EOK)
       {
           struct eth_device* enetif;

           RT_ASSERT(msg->netif != RT_NULL);
           RT_ASSERT(msg->buf   != RT_NULL);

           enetif = (struct eth_device*)msg->netif->state;
           if (enetif != RT_NULL)
           {
               /* call driver's interface */
               if (enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
               {
                   /* transmit eth packet failed */
               }
           }

           /* send ACK */
           rt_sem_release(&(enetif->tx_ack));
       }
   }
}

etx 等待 `ethernetif_linkoutput` 的邮件消息,然后调用 eth 驱动接口函数,完成后释放信号量给 `ethernetif_linkoutput`一个应答。

从这里看,用上这个线程,需要额外增加两次 ipc 消息。
去掉 etx 之后呢?`ethernetif_linkoutput` 变成下面的样子。

static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
{
   struct eth_device* enetif;
   RT_ASSERT(netif != RT_NULL);
   enetif = (struct eth_device*)netif->state;

   if (enetif->eth_tx(&(enetif->parent), p) != RT_EOK)
   {
       return ERR_IF;
   }
   return ERR_OK;
}

与使用 etx 线程唯一不同的是:使用线程时,发送数据操作 eth 驱动都在 etx 线程里进行的;如果去掉,就有可能多个应用线程同时发送数据,出现多个线程竞争 eth 驱动资源的现象。但是,这个可以经过优化应用层业务逻辑进行规避。

更多关于不使用 etx 和 erx 线程的修改,请移步我的 gitee 仓库。

本系列提到的所有代码更改已经提交到 gitee ,欢迎大家测试
https://gitee.com/thewon/rt_thread_repo

审核编辑:汤梓红

  • LwIP
    +关注

    关注

    1

    文章

    51

    浏览量

    23121
  • 裁剪
    +关注

    关注

    0

    文章

    7

    浏览量

    6520
  • RT-Thread
    +关注

    关注

    27

    文章

    413

    浏览量

    33889
收藏 人收藏

    评论

    相关推荐

    RT-Thread是如何从内部Flash读取WAV音频播放呢

    开始实验前,开发板 SDK 请选择 1.0.7 之后的版本 最终的工程可以在这里下载 wav_player_rom.zip 使能相关组件 需要使用到...
    发表于 07-01 11:53 471次 阅读

    RT-Thread Studio IDE使用的基础介绍

    rt-thread studio 安装 首先需要确保已经安装 rt-thread studio 在工具栏找到 SDK 管理器,点击后在弹出窗口,Board_Supp...
    发表于 07-01 11:41 340次 阅读

    RT-Thread记录(十一、UART设备—源码解析)

    一文带你深入理解 RT-Thread I/O 设备模型 — UART 设备源码分析。
    的头像 矜辰所致 发表于 07-01 11:24 229次 阅读
    RT-Thread记录(十一、UART设备—源码解析)

    基于Art-Pi的NTP同步时钟+DHT11获取温度的设计实现

    开发环境:RT-Thread Studio 开发板:Art-Pi OS版本:4.0.3 硬件 显示屏:金逸晨GMG12864-03A 温湿度:DHT1...
    发表于 07-01 11:24 245次 阅读

    网络TCP通信程序卡在while死循环中怎么去修复呢

    问题发生位置:drv_eth.c文件rt_stm32_eth_tx函数中(254行) 修复方法:stm32f4xx_hal_eth.h头文件631行Lock成员变量定义为...
    发表于 07-01 11:12 359次 阅读

    浅析在Windows系统中将RT-Thread移植到Zynq的步骤

    一、功能简介 在window系统中将rtthread移植到zynq 在sdk中实现无bsp的zynq工程调试 在zynq中演示rtthread的shell功能 二、配...
    发表于 07-01 10:48 667次 阅读

    RT Smart上RIL通信组件及应用的移植和开发工作简述

    1、Linux RIL的概述与驱动 在移动网络通信中,尤其是智能手机,平板等智能设备中,RIL是一个非常重要的组件,RIL使各...
    发表于 07-01 10:29 1009次 阅读

    Linux Ril中使用共享内存交互相关资料分享

    1、移植RIL到ART-Smart之共享内存简析 本次移植的linux ril中,rild作为一个client与modem通过AT命令交互,同时也作为...
    发表于 07-01 10:17 1072次 阅读

    是否可以使用simulator来测一下STM32L496的功能呢

    事情还是得从RTTHREAD 官方的文档Keil 模拟器 STM32F103 上手指南 说起,用了很久的KEIL,相信大家很少有人用...
    发表于 06-30 17:12 3254次 阅读

    大佬带你理解RT-Thread内核并上手实践

    内核是操作系统最重要的部分,学习RT-Thread也是从最基本的内核开始。   RT-Thread内....
    发表于 06-30 17:10 90次 阅读

    如何对Numaker-IoT-M487开发板上的CRYPTO模块功能进行测试呢

    硬件介绍 NuMaker-IoT-M487 开发板以 NuMicro M487 系列微控制器为主控核心,主频 192MHz,512KB FLASH,160K...
    发表于 06-30 17:01 3175次 阅读

    关于Rt-Thread系统自带的Stack问题?

    MCU启动文件(startup.s)里定义的 Stack 是 1KB Stack_Size EQU 0x00000400 Rt-Thread 也定义了一个 Stack 请...
    发表于 06-30 16:52 5755次 阅读

    通过Uboot TFTP启动rt-smart内核

    介绍Windows下通过 Uboot  TFTP 方式下载和启动rt-smart 内核
    的头像 RT-thread 发表于 06-30 12:34 1100次 阅读
    通过Uboot TFTP启动rt-smart内核

    RT-Thread记录(十、全面认识 I/O 设备模型)

    学完 RT-Thread 内核,从本文开始熟悉了解 RT-Thread I/O 设备管理相关知识。
    的头像 矜辰所致 发表于 06-30 10:38 1225次 阅读
    RT-Thread记录(十、全面认识 I/O 设备模型)

    imageCropSmart PHP图片智能裁剪工具包

    ./oschina_soft/imageCropSmart.zip
    发表于 06-30 09:09 10次 阅读
    imageCropSmart PHP图片智能裁剪工具包

    基于RT-Thread的麻雀一号无人值守门禁系统

    采用麻雀一号为主控设备来实现,摄像头数据,人体红外感应或门开关来判断是否有人闯入机房。通过Node-....
    的头像 极速紫韵 发表于 06-30 06:45 1341次 阅读
    基于RT-Thread的麻雀一号无人值守门禁系统

    基于RT-Thread设备运行数据分析预警系统

    本项目采用到硬件方案是:通过ART-Pi STM32H750主板上的I2C引脚和UART以及一个普通....
    的头像 极速紫韵 发表于 06-30 06:22 1304次 阅读
    基于RT-Thread设备运行数据分析预警系统

    基于RT-Thread和AB32VG1开发板实现家庭安全检测功能

    基于RT-Thread和中蓝讯科开发板,实现按键触发语音报警和NodeRed收集报警信息并上报腾讯云....
    的头像 极速紫韵 发表于 06-30 00:36 1172次 阅读
    基于RT-Thread和AB32VG1开发板实现家庭安全检测功能

    STM32L051上使用RT-Thread (五、完结篇)

    应用篇-在STM32L051上使用RT-Thread 第五篇,也是本次应用的完结篇。
    的头像 矜辰所致 发表于 06-29 10:34 1466次 阅读
    STM32L051上使用RT-Thread (五、完结篇)

    STM32L051上使用RT-Thread (四、串口通讯)

    应用篇-在STM32L051上使用RT-Thread 第四篇,巧妙的使用信号量处理串口通讯。
    的头像 矜辰所致 发表于 06-28 10:59 1499次 阅读
    STM32L051上使用RT-Thread (四、串口通讯)

    STM32L051上使用RT-Threa (三、I2C通讯)

    应用篇-在STM32L051上使用RT-Thread 第三篇,学习RT-Thread Studio如....
    的头像 矜辰所致 发表于 06-27 10:32 1431次 阅读
    STM32L051上使用RT-Threa (三、I2C通讯)

    STM32L051上使用RT-Th (二、CubeMX配置)

    应用篇-在STM32L051上使用RT-Thread 第二篇,使用STM32CubeMX 进行对应外....
    的头像 矜辰所致 发表于 06-26 14:02 2175次 阅读
    STM32L051上使用RT-Th (二、CubeMX配置)

    RT-Thread自动初始化详解

    我们知道,在写裸机程序时,当我们完成硬件初始化后,就需要在主函数中进行调用。当我们使用RT-Thre....
    的头像 嵌入式大杂烩 发表于 06-25 21:38 3252次 阅读
    RT-Thread自动初始化详解

    STM32L051上使用RT-Thread (一、新建项目)

    学完了 RT-Thread 内核基础,来使用 RT-Thread 实现一个小应用。 硬件平台:ST....
    的头像 矜辰所致 发表于 06-25 20:45 3440次 阅读
    STM32L051上使用RT-Thread (一、新建项目)

    基于ESP32C3运行RT-THREAD

    在ESP32上面运行 RT-THREAD.
    的头像 Thomas的小火车 发表于 06-25 07:58 3113次 阅读
    基于ESP32C3运行RT-THREAD

    RT-Thread记录(九、RTT中断处理与阶段小结)

    RT-Thread 内核部分最后一个点 中断管理,顺带着对前面所学知识做个小结。
    的头像 矜辰所致 发表于 06-24 10:25 3392次 阅读
    RT-Thread记录(九、RTT中断处理与阶段小结)

    HKClipperDemo图片剪裁工具

    ./oschina_soft/HKClipperDemo.zip
    发表于 06-24 10:12 6次 阅读
    HKClipperDemo图片剪裁工具

    NUC980开发板应用 基于NK-980IoT的国学唐诗学习机

    基于NK-980IoT的国学唐诗学习机 1 项目背景 最近一直在陪小孩学习国学精髓,比如唐诗、宋词这....
    的头像 RTThread物联网操作系统 发表于 06-23 14:55 1258次 阅读

    基于RT-Thread+RA6M4的智能安防系统详解

      无论是在家里还是在公司,安防都尤为的重要,与其亡羊补牢,更重要的是防患于未然。安全是目的,防范是....
    的头像 物联网技术分享 发表于 06-23 14:34 161次 阅读
    基于RT-Thread+RA6M4的智能安防系统详解

    RT-Thread记录(八、理解RT-Thread内存管理)

    记得最初学习 RT-Thread ,对于内存管理我也是简单看看然后一笔带过,当时觉得用不上,在我做的....
    的头像 矜辰所致 发表于 06-23 10:11 270次 阅读
    RT-Thread记录(八、理解RT-Thread内存管理)

    rt-thread 驱动篇(八)hwtimer 重载算法优化

    区别于 rt-thread 内核实现的两种定时器,这种定时器依赖芯片内置的定时器外设,依靠稳定高速的....
    的头像 出出 发表于 06-23 10:10 1522次 阅读
    rt-thread 驱动篇(八)hwtimer 重载算法优化

    rt-thread 优化系列(四)信号对 ipc 的影响

    信号 signal,并不是线程间同步的信号量 semaphore。后者是线程间同步机制的一种,而前者....
    的头像 出出 发表于 06-23 09:51 1478次 阅读

    rt-thread优化系列(三)软定时器的定时漂移问题分析

    所谓软定时器,是由一个线程运行维护的定时器列表。由线程调用定时器回调函数。
    的头像 出出 发表于 06-23 09:35 1487次 阅读

    GD32 RISC-V系列 BSP框架制作与移植

      手把手教你使用RT-Thread制作GD32 RISC-V系列BSP 熟悉RT-Thread的朋....
    的头像 嵌入式大杂烩 发表于 06-22 19:44 2081次 阅读
    GD32 RISC-V系列 BSP框架制作与移植

    RT-Thread记录(七、IPC机制之邮箱、消息队列)

    讲完了线程同步的机制,我们要开始线程通讯的学习,
    的头像 矜辰所致 发表于 06-22 10:06 253次 阅读
    RT-Thread记录(七、IPC机制之邮箱、消息队列)

    rt-thread 驱动篇(三) serialX 压力测试

    本周笔者花了好多天的时间,计划从多个方面对串口驱动做个比较。下面就从以下几个角度做个对比测试。
    的头像 出出 发表于 06-22 09:22 1363次 阅读

    rt-thread 驱动篇(二) serialX 理论实现

    在前一篇文章里,大致提出了我的串口驱动框架理论。里面做了一些对串口驱动特性的幻想。也在 NUC970....
    的头像 出出 发表于 06-22 09:03 1471次 阅读
    rt-thread 驱动篇(二) serialX 理论实现

    GD32407V-START开发板的BSP框架制作与移植

    熟悉RT-Thread的朋友都知道,RT-Thread提供了许多BSP,但不是所有的板子都能找到相应....
    的头像 嵌入式大杂烩 发表于 06-22 08:54 1484次 阅读
    GD32407V-START开发板的BSP框架制作与移植

    RT-Thread记录(六、IPC机制之信号量互斥量事件集)

    上文说到 RT-Thread 对临界区的处理方式有多种,其中已经分析了关闭调度器和屏蔽中断的方式, ....
    的头像 矜辰所致 发表于 06-21 10:40 2733次 阅读
    RT-Thread记录(六、IPC机制之信号量互斥量事件集)

    rt-thread 驱动篇(一) serialX 框架理论

    串口驱动三种工作模式:轮询、中断、DMA。
    的头像 出出 发表于 06-21 10:37 2203次 阅读
    rt-thread 驱动篇(一) serialX 框架理论

    rt-thread 优化系列(二) 之 同步和消息关中断分析

    书接前文,上篇优化聊的是关中断操作,在很多地方过保护,导致关中断时间太久,可能引起其它中断不能及时响....
    的头像 出出 发表于 06-21 09:47 1931次 阅读

    rt-thread 优化系列(一) 之 过多关中断

    关于优化的话题永远不过时,没期限。
    的头像 出出 发表于 06-21 09:03 1481次 阅读

    rt-thread 优化系列(0) SysTick 优化分析

    论坛里有人提出了一个疑问,说 STM32 系列 bsp 在初始化系统时钟的过程中使用到了 tick ....
    的头像 出出 发表于 06-21 08:55 1321次 阅读

    RT-Thread记录(五、RT-Thread 临界区保护)

    本文聊聊临界区,以及RT-Thread对临界区的处理
    的头像 矜辰所致 发表于 06-20 16:06 2205次 阅读
    RT-Thread记录(五、RT-Thread 临界区保护)

    usbhost驱动相关疑问与调试记录

    调试 stm32 的usb host 的艰辛历程。希望有遇到相同问题的人能从中发现点儿什么。
    的头像 出出 发表于 06-20 15:24 265次 阅读

    RT-Thread记录(四、RTT时钟节拍和软件定时器)

    RT-Thread第4课,听听 RT-Thread 的心跳,再学习一下基于心跳的软件定时器使用。
    的头像 矜辰所致 发表于 06-20 11:50 2293次 阅读
    RT-Thread记录(四、RTT时钟节拍和软件定时器)

    rt-thread 驱动篇(六)serialX弊端及解决方法

    serialX 作为一个非阻塞串口驱动框架,在遇到一些异常时,需要做一些特殊处理,今天,笔者带大家来....
    的头像 出出 发表于 06-20 11:43 328次 阅读

    RT-Thread记录(三、RT-Thread线程操作函数)

    讲完了RT-Thread开发环境,启动流程,启动以后当然是开始跑线程了,那么自然我们得学会如何创建线....
    的头像 矜辰所致 发表于 06-20 00:31 1840次 阅读
    RT-Thread记录(三、RT-Thread线程操作函数)

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 矜辰所致 发表于 06-20 00:30 1894次 阅读
    RT-Thread记录(二、RT-Thread内核启动流程)

    RT-Thread记录(一、版本开发环境及配合CubeMX)

    RT-Thread 学习记录的第一篇文章,RT-Thread记录(一、RT-Thread 版本、RT....
    的头像 矜辰所致 发表于 06-20 00:28 2205次 阅读
    RT-Thread记录(一、版本开发环境及配合CubeMX)

    基于Select/Poll实现并发服务器(二)

    开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5.3....
    的头像 嵌入式大杂烩 发表于 06-20 00:26 1941次 阅读
    基于Select/Poll实现并发服务器(二)

    基于Select/Poll实现并发服务器(一)

      开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5....
    的头像 嵌入式大杂烩 发表于 06-20 00:20 1849次 阅读
    基于Select/Poll实现并发服务器(一)

    MPU6050简介及rt-thread软件包使用

    小伙伴们大家好,好久不更新RT-Thread实战笔记啦,今天来搞一搞MPU6050,话不多说,淦!
    的头像 RTThread物联网操作系统 发表于 06-17 10:42 287次 阅读

    使用memheap内存管理算法对片内RAM和片外SDRAM进行管理的方法

      在开发中由于单片机自带的 RAM 空间比较小,有时候需要扩展片外的 RAM 以供使用,RT-Th....
    的头像 RT-Thread 操作系统 发表于 06-17 08:53 329次 阅读
    使用memheap内存管理算法对片内RAM和片外SDRAM进行管理的方法

    RT-Thread自动初始化机制

      在分析之前首先查阅 RT-Thread 的官方文档 [RT-Thread 自动初始化机制](ht....
    的头像 RT-Thread 操作系统 发表于 06-17 08:52 265次 阅读
    RT-Thread自动初始化机制

    rt-thread 驱动篇(五)serialX 小试牛刀

    终于来到了 serialX 的实践篇,期待很久了。
    的头像 出出 发表于 06-16 11:29 314次 阅读
    rt-thread 驱动篇(五)serialX 小试牛刀

    AT组件的实现过程和代码的调用逻辑

    AT组件的核心处理逻辑是将收到的 AT 模组的应答信息放到 recv_line_buf 缓冲区中,然....
    的头像 RT-Thread 操作系统 发表于 06-15 09:21 275次 阅读
    AT组件的实现过程和代码的调用逻辑

    想要使用AI却不会AI建模吗

    人类经历了三次工业革命,无论是蒸汽机、电力还是电子信息技术,每一次革命都给人类的生产力带来了几十倍的....
    的头像 科技绿洲 发表于 06-14 14:29 772次 阅读

    nr_micro_shell介绍及使用方法

    在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_s....
    的头像 MCU开发加油站 发表于 06-13 16:58 415次 阅读

    rt-thread 驱动篇(七)GPIO驱动

    一提 GPIO 可能会让很多人觉得不屑,这么简单的东西有什么可说的,也就是一个拉低拉高,谁不会呢。
    的头像 出出 发表于 06-13 09:48 483次 阅读