查看: 1678|回复: 1

[MQX] 【经验分享】如何减少MQX RTCS 使用内存

[复制链接]

该用户从未签到

7

主题

196

帖子

0

中级会员

Rank: 3Rank: 3

积分
380
最后登录
1970-1-1
发表于 2014-8-27 10:10:35 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_DANIEL 于 2014-8-27 14:43 编辑

嵌入式系统内存非常有限,在开发基于RTCS的应用程序时,我们经常会碰到TCP/IP内存不足的问题。如何降低内存,同时又满足嵌入式系统的需求是每个开发者需要考虑的问题。本文主要介绍RTCS的初始化参数及如何合理的配置来降低嵌入式系统的内存。
        RTCS协议栈中有一些全局变量,应用程序创建RTCS协议栈时对这些变量赋值。这些变量包括_RTCSPCB_RTCS_msgpool _RTCS_socket_partTxWindow Size and Rx Window Size 所有的变量都有一个默认值,如果你想改变这些默认值,必须在创建RTCS之前。
1    _RTCSPCB / _RTCS_msgpool /_RTCS_socket_part
RTCSPCB 表示数据包控制块 指的是你希望RTCS协议栈能够处理的包的数量,如果你发现有丢包现象,可能与此参数有关,你需要增加该值。
RTCS_msgpool表示RTCS消息池, 它用来封装对RTCS协议栈的应用请求,该值指的是应用程式同时能发多少个请求给RTCS协议栈。
RTCS_Sockets指的是应用中创建的所有的socket的数量.
“_init”是在RTCS创建时分配的数量. 在运行时,当RTCS需要更多的资源,它可以根据“grow”值来增加。“max”是指定的能够分配的最大值。这些参数必须在RTCS启动前修改。
RTCS协议栈中,这些参数的默认值为以下这些宏,RTCSCFG_PCBS_INIT,RTCSCFG_PCBS_GROW,  RTCS_PCBS_MAX,  RTCSCFG_MSGPOOL_INIT, RTCSCFG_MSGPOOL_GROW,RTCSCFG_PCBS_MAX, RTCSCFG_SOCKET_PART_INIT, RTCSCFG_SOCKET_PART_GROW,  RTCSCFG_SOCKET_PART_MAX.  在项目中我可以自己定义这些变量,也可以在user_config.h中指定。
rtcs-config.gif

怎样来配置这些参数?   对于具体的应用没有一个固定的方法.我们可以从默认值开始, 然后花时间来调试。可以用它RTCSTAD工具来观察各资源占用的内存情况,然后根据具体的需求来修改
Example:  theconfiguration in web_hvac demo
   _RTCSPCB_init = 4;
   _RTCSPCB_grow = 2;
   _RTCSPCB_max = 20;
   _RTCS_msgpool_init = 4;
   _RTCS_msgpool_grow = 2;
   _RTCS_msgpool_max  = 20;
   _RTCS_socket_part_init = 4;
   _RTCS_socket_part_grow = 2;
   _RTCS_socket_part_max  = 20;
   RTCS_Create();

2  Tx Window Size and Rx WindowSize
每个socket都有一个发送buffer和接收buffer.Each socket requires to allocation Tx and Rx window size for a listening socketand then for each connected client.  默认的 txwindow size rx window size 4380 字节. 使用 TAD调试工具, 我们可以观察到每个新的TCP socket连接需要使用内存是500+4392x2+148=9432B    见下:
MQX -> Lightweight Memory BlockSummary
Size (Decimal) Owner    Type
500      0x10001 TCP Control Block;RTCS/TCP
4392  0x10001  TCP Tx Window;RTCS/TCP
4392  0x10001  TCP Rx Window;RTCS/TCP
148    0x10001  TCP Send Clock;RTCS/TCP
(TCP/IP Task id is 0x10001)
如果我们使用 setsockopt() 来减小tx rx buffer, for example,            
uint_32 value;
value = 1024;
setsockopt(sock, SOL_TCP,OPT_TBSIZE,&value,sizeof(value));
setsockopt(sock, SOL_TCP,OPT_RBSIZE,&value,sizeof(value));

则创建新的socket需要的内存的详细:
MQX -> LightweightMemory Block Summary
Size (Decimal)Owner    Type
500  -> 500   0x10001  TCP Control Block;RTCS/TCP
4392 -> 1108   0x10001 TCP Tx Window;RTCS/TCP
4392 -> 1108   0x10001 TCP Rx Window;RTCS/TCP
148  ->  84   0x10001  TCP Send Clock;RTCS/TCP

我们可以看到,建立新的socket 需要内存  500+1108*2+84=2800


http://community.freescale.com/docs/DOC-102077


我知道答案 目前已有1人回答

RTCS-memory.pdf

285.85 KB, 下载次数: 22, 下载积分: 威望 1

回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    5970
    最后登录
    2020-9-28
    发表于 2014-8-27 11:16:04 | 显示全部楼层
    支持一下
    MQX的经验分享以后将会陆续推出。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-2 10:23 , Processed in 0.127635 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表