document.write('
')

必威体育betway登录手机

创作

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

3天内不再提示

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

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

前言

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

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

必威体育betway登录手机 以下说明不限于 lwip ,sal 部分也有涉及。

裁剪详解

sal 可裁剪优化项

1. `SAL_INTERNET_CHECK`: 网络检测,使用到了 workqueue 。检测原理就是尝试连接 "link.rt-thre.org::8101",发送检测数据。
这个或者可以去掉检测,或者换成自家服务器。
2. `#define SAL_SOCKETS_NUM 4`: 这个可能是支持创建 socket 的最大数量。
3. `RT_USING_NETDEV`: 网络设备,没有终端操作的情况下可以优化掉。其中,`NETDEV_USING_CONFIG` `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 fai */
               }
           }

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

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

从这里看,用上这个线程,需要额外增加两次 ipc 消息。
必威体育betway登录手机 去掉 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 ,欢迎大家
http://gitee.com/thewon/rt_thread_repo

必威体育betway登录手机 审核编辑:汤梓红

  • LwIP
    +关注

    关注

    1

    文章

    51

    浏览量

    23056
  • 裁剪
    +关注

    关注

    0

    文章

    6

    浏览量

    6499
  • RT-Thread
    +关注

    关注

    27

    文章

    404

    浏览量

    33779
收藏 人收藏

    评论

    相关推荐

    1、ART-Pi Smart 环境快速搭建硬件环境搭建电源输入:5V,500 mA,通过开发板 USB-TypeC(下面)供电。如下图所示,...
    发表于 06-27 15:16 8次 阅读

    RT-Thread 现在可以在带MMU的ARM上跑吗?
    发表于 06-27 14:44 31次 阅读

    RT-Thread-rt_device.user_data 分析: 大部分uart驱动都不安全 问题描述:在使用该组件的时候,不能正常发送数据 硬件GD3...
    发表于 06-27 11:46 293次 阅读

    最近在学习 RT-Thread 中的 NimBLE 软件包,使用 menuconfig 配置选中 NimBLE 软件包,设置各种选项后,成功通过编译...
    发表于 06-27 11:18 310次 阅读

    说明本仓库为基于 RT-Thread v4.0.5 版本实现的 HPM6750 Bootloader,识别 download 分区中的固件并搬运到 APP 分区中...
    发表于 06-27 11:01 480次 阅读

    最近在用N9H30的开发板学习LVGL。用于参加嵌入式GUI竞赛。我的这块开发板一直有触摸屏误触发的问题。控件少了还好,无所...
    发表于 06-27 10:52 540次 阅读

    开始本篇实验前,需要搭建RT-Thread开发环境在HPM6750上使用RT-Thread驱动SD卡实现文件读写只需要三步:配置FATF...
    发表于 06-27 10:44 480次 阅读

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

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

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

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

    RT-Thread自动初始化详解

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

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

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

    基于ESP32C3运行RT-THREAD

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

    在目前RT-Thread对ARM的支持上,RT-Thread只能工作于ARM状态。 Cortex-M3内核干脆都不支持ARM指令,中断也在T...
    发表于 06-24 15:43 919次 阅读

    想要移植rt thread 2.0.1 到飞思卡尔的KE06Z ARM M0内核 能直接用源码里提供的M0内核 其他型号芯片工程 替换掉芯片 实现...
    发表于 06-24 15:30 949次 阅读

    1、基于ESP32C3运行RT-THREAD的设计实现 最近发现一款性价比超级高的开发板9.9,试了一下,居然可以debug,完全不需...
    发表于 06-24 15:19 2634次 阅读

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

    RT-Thread 内核部分最后一个点 中断管理,顺带着对前面所学知识做个小结。
    的头像 矜辰所致 发表于 06-24 10:25 3254次 阅读

    HKClipperDemo图片剪裁工具

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

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

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

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

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

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

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

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

    区别于 rt-thread 内核实现的两种定时器,这种定时器依赖芯片内置的定时器外设,依靠稳定高速的....
    的头像 出出 发表于 06-23 10:10 1462次 阅读

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

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

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

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

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

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

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

    讲完了线程同步的机制,我们要开始线程通讯的学习,
    的头像 矜辰所致 发表于 06-22 10:06 218次 阅读

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

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

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

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

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

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

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

    上文说到 RT-Thread 对临界区的处理方式有多种,其中已经分析了关闭调度器和屏蔽中断的方式, ....
    的头像 矜辰所致 发表于 06-21 10:40 2470次 阅读

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

    串口驱动三种工作模式:轮询、中断、DMA。
    的头像 出出 发表于 06-21 10:37 2072次 阅读

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

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

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

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

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

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

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

    本文聊聊临界区,以及RT-Thread对临界区的处理
    的头像 矜辰所致 发表于 06-20 16:06 2153次 阅读

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

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

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

    RT-Thread第4课,听听 RT-Thread 的心跳,再学习一下基于心跳的软件定时器使用。
    的头像 矜辰所致 发表于 06-20 11:50 2202次 阅读

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

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

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

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

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

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

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

    RT-Thread 学习记录的第一篇文章,RT-Thread记录(一、RT-Thread 版本、RT....
    的头像 矜辰所致 发表于 06-20 00:28 2117次 阅读

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

    开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5.3....
    的头像 嵌入式大杂烩 发表于 06-20 00:26 1891次 阅读

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

      开发环境: RT-Thread版本:4.0.3 操作系统:Windows10 Keil版本:V5....
    的头像 嵌入式大杂烩 发表于 06-20 00:20 1822次 阅读

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

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

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

      在开发中由于单片机自带的 RAM 空间比较小,有时候需要扩展片外的 RAM 以供使用,RT-Th....
    的头像 RT-Thread 操作系统 发表于 06-17 08:53 296次 阅读

    RT-Thread自动初始化机制

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

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

    终于来到了 serialX 的实践篇,期待很久了。
    的头像 出出 发表于 06-16 11:29 271次 阅读

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

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

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

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

    nr_micro_shell介绍及使用方法

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

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

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

    rt-thread 驱动篇(四)serialX 多架构适配

    自笔者提出 serialX 串口驱动到今天近半年了,当初只在 STM32F4 NUC970 两个系列....
    的头像 出出 发表于 06-10 10:21 323次 阅读

    RT-Thread专业版实现对于龙芯全系列处理器支持

    近日,在龙芯中科与睿赛德科技的共同努力下,RT-Thread专业版已实现了对LoongArch32和....
    的头像 科技绿洲 发表于 06-09 16:45 780次 阅读

    龙芯中科LoongArch自主指令系统为产业生态保驾护航

    目前,龙芯中科业务已全部转向 LoongArch 自主指令系统架构,龙芯 2K1000LA 处理器的....
    的头像 科技绿洲 发表于 06-08 11:10 341次 阅读

    LwIP应用开发实战指南-基于野火STM32全系列(M4/7)开发板

    TCP/IP 是一个庞大的协议族,它是众多网络协议的集合,包括:ARP、IP、ICMP、 UDP、....
    发表于 06-08 09:50 36次 阅读

    STM32F103ZE开发板 LWIP网络协议栈应用之连接腾讯云

    lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) ....
    的头像 嵌入式技术 发表于 06-02 08:51 4289次 阅读

    STM32之LWIP网络协议栈TCP服务器创建

    lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) ....
    的头像 嵌入式技术 发表于 06-02 08:44 4301次 阅读

    RT-Thread 4.1.0正式添加对Arm Compiler 6支持

    在 RT-Thread 4.1.0 正式发布版中,添加了对 Arm Compiler 6 的支持,用....
    的头像 科技绿洲 发表于 06-01 15:20 351次 阅读

    RT-Thread 4.1.0 正式发布版中的ArmClang

    ArmClang 相较于 Armcc, 支持的架构更多,Armcc支持到Armv7架构,armcla....
    的头像 RTThread物联网操作系统 发表于 06-01 09:24 282次 阅读

    STM32之LWIP网络协议栈移植步骤与方案

    LwIP是Light Weight(轻型)IP 协议,有无操作系统的支持都可以运行。LwIP 实现的....
    的头像 嵌入式技术 发表于 06-01 08:35 4100次 阅读

    RT-Thread Studio如何测试Ethernet连网

    RT-Thread 是一款开源实时操作系统,包括 RT-Thread 内核、FinSH 命令行工具、....
    的头像 科技绿洲 发表于 05-31 11:17 378次 阅读

    出出

    文章:15 被阅读:17623

    关注 4人关注
    必威精装版app官方下载 太阳集团娱乐app 必威体育手机app 澳门威尼斯人官方平台 必威体育app官方版下载 必威体育app专业版 澳门威尼斯人线上娱乐场 Betway必威中文官网 澳门威尼斯人网上 必威体育app手机版 必威体育3.0app下载 必威体育app手机下载 必威体育精装版下载 澳门在线威尼斯人注册 必威精装版app手机 必威手机下载版 必威体育app手机下载版 必威体育app手机版 必威平台官方地址 老威尼斯娱乐棋牌下载 威尼斯人彩票网站 必威体育中文app 必威体育客户端精装 必威体育精装版app官网 澳门威尼斯人线上 必威体育官网app下载 必威体育app官方版下载 必威体育app官方版下载 必威体育精装版本下载 威尼斯人娱乐场手机板