1 onps栈移植说明——onps栈的配置及裁剪( 二 )


协议栈在很多情形下需要动态申请不同大小的内存以供接下来的逻辑处理过程使用 。所以 , 为了最大限度地提高协议栈运行过程中的内存利用率并尽可能地减少内存碎片 , 我们还单独设计了一个独立的内存管理单元(mmu) 。考虑协议栈的目标系统为资源受限的单片机系统 , 这种系统的内存资源往往都是极度紧张的 , 因此我们提供了配置宏让用户决定分配多少字节的内存空间给协议栈的mmu:
//* 内存管理单元(mmu)相关配置项 , 其直接影响协议栈能分配多少个socket给用户使用//* ===============================================================================================#define BUDDY_PAGE_SIZE32//* 系统能够分配的最小页面大小 , 其值必须是2的整数次幂#define BUDDY_ARER_COUNT 9//* 指定buddy算法管理的内存块数组单元数量#define BUDDY_MEM_SIZE8192 //* buddy算法管理的内存总大小 , 其值由BUDDY_PAGE_SIZE、BUDDY_ARER_COUNT两个宏计算得到://* 32 * (2 ^ (9 - 1)) , 即BUDDY_MEM_SIZE = BUDDY_PAGE_SIZE * (2 ^ (BUDDY_ARER_COUNT - 1))//* 之所以在此定义好要管理的内存大小 , 原因是buddy管理的内存其实就是一块提前分配好的静态存储时期的字节型//* 一维数组 , 以此来确保协议栈不占用宝贵的堆空间//* ===============================================================================================协议栈的内存管理单元采用了buddy伙伴算法 。上述三个宏的关系参见BUDDY_MEM_SIZE宏的注释 。前面说过 , mmu管理的内存用于协议栈的不同业务情形 , 其中最核心的一种业务情形就是socket , 用户分配的内存大小直接决定了用户编写网络应用时能够申请的socket数量 。如果你在申请分配一个新的socket时报ERRREQMEMTOOLARGE(The requested memory is too large, please refer to the macro definition BUDDY_MEM_SIZE)或ERRNOFREEMEM(The mmu has no memory available)错误 , 则意味着内存已经不够用了 , 需要你增加内存或者检视你的代码看是否存在未及时释放的socket句柄 。另外 , 决定内存利用效率的关键配置项是BUDDY_PAGE_SIZE宏 , 因为mmu分配内存的最小单位就是“页” 。这个宏设置单个内存页的大小 , 单位为字节 , 其值必须是2的整数次幂 。如果你的通讯报文不大 , 建议把页面大小调整的小一些 , 比如16字节、32字节等 , 以尽量减少单个页面的空余字节数 。
sys_config.h文件的其余宏均为协议层相关的配置项 。这其中有几个与底层网络接口相关的配置项需要特别关注:
#define SUPPORT_PPP 1 //* 是否支持ppp模块:1 , 支持;0 , 不支持 , 如果选择支持 , 则系统会将ppp模块代码加入到协议栈中#if SUPPORT_PPP#define APN_DEFAULT"4gnet"//* 根据实际情况在这里设置缺省APN#define AUTH_USER_DEFAULT"card"//* ppp认证缺省用户名#define AUTH_PASSWORD_DEFAULT "any_char" //* ppp认证缺省口令#define PPP_NETLINK_NUM1 //* 协议栈加载几路ppp链路(系统存在几个modem这里就指定几就行)#define SUPPORT_ECHO1 //* 对端是否支持echo链路探测#define WAIT_ACK_TIMEOUT_NUM 5 //* 在这里指定连续几次接收不到对端的应答报文就进入协议栈故障处理流程(STACKFAULT) , 这意味着当前链路已经因严重故障终止了#else#define PPP_NETLINK_NUM 0#endif#define SUPPORT_ETHERNET 1 //* 是否支持ethernet:1 , 支持;0 , 不支持#if SUPPORT_ETHERNET#define ETHERNET_NUM 1//* 要添加几个ethernet网卡(实际存在几个就添加几个)#define ARPENTRY_NUM 32 //* arp条目缓存表的大小 , 只要不小于局域网内目标通讯节点的个数即可确保arp寻址次数为1 , 否则就会出现频繁寻址的可能 , 当然这也不会妨碍正常通讯逻辑 , 只不过这会降低通讯效率#else#define ETHERNET_NUM 0#endif

经验总结扩展阅读