OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3759|回复: 3

原子哥,左神,请教一个战舰LWIP移植的骚操作,没看明白

[复制链接]

24

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2016-3-16
在线时间
202 小时
发表于 2018-1-26 09:32:19 | 显示全部楼层 |阅读模式
96金钱
如题,最近在移植LWIP,参考原子战舰V3,由于我的系统没实现内存管理,因此,涉及到malloc的函数我全部使用全局数据区来开辟空间(暂时先这么粗略地实现),但对内存池的内存分配我实现是没看明白,在memp.c中,这个memp_get_memorysize函数获取需要分配内存池大小的时候,操作比较野:
//得到memp_memory数组大小u32_t memp_get_memorysize(void)
{
        u32_t length=0;
        length=(
                        MEM_ALIGNMENT-1 //全局型数组 为所有POOL分配的内存空间
                        //MEMP_SIZE表示需要在每个POOL头部预留的空间  MEMP_SIZE = 0
                        #define LWIP_MEMPOOL(name,num,size,desc)+((num)*(MEMP_SIZE+MEMP_ALIGN_SIZE(size)))
                        #include "lwip/memp_std.h"
                        );
        return length;
}

想请教一下各位,这个实现是运行时实现,还是初始化实现呢?也就是是在编译期间就定下来length长度了,还是程序运行期间通过运算得出来的。我想要将这个函数改为宏定义,使用宏在全局数据区以数组的方式开辟一段内存给内存池应该如何做,一点小分,小白奉上,大神请来收。


最佳答案

查看完整内容[请看2#楼]

这个大小其实就是LWIP里面定义的,LWIP里面默认的内存吃是数组memp_memory,此数组定义如下: 这个函数就是用的这个数组大小的定义,你要用回LWIP自己的就直接取消掉这些注销
路漫漫其修远兮,戒骄戒躁。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-1-26 09:32:20 | 显示全部楼层
本帖最后由 zuozhongkai 于 2018-1-26 10:13 编辑

这个大小其实就是LWIP里面定义的,LWIP里面默认的内存吃是数组memp_memory,此数组定义如下: QF`Q}N%R`3G35I7T%UT{6DH.png
这个函数就是用的这个数组大小的定义,你要用回LWIP自己的就直接取消掉这些注销
回复

使用道具 举报

24

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2016-3-16
在线时间
202 小时
 楼主| 发表于 2018-1-26 10:49:43 | 显示全部楼层
zuozhongkai 发表于 2018-1-26 10:12
这个大小其实就是LWIP里面定义的,LWIP里面默认的内存吃是数组memp_memory,此数组定义如下:
这个函数就 ...

受教了左神!原来如此,那么这段代码:

{
MEM_ALIGNMENT-1 //全局型数组 为所有POOL分配的内存空间
                        //MEMP_SIZE表示需要在每个POOL头部预留的空间  MEMP_SIZE = 0
                        #define LWIP_MEMPOOL(name,num,size,desc)+((num)*(MEMP_SIZE+MEMP_ALIGN_SIZE(size)))
                        #include "lwip/memp_std.h"
}

它是在编译预处理阶段就决定length大小了吗?

还有,在移植中我发现一个问题,sys_arch.c中的sys_msleep()函数LWIP已经在lwip_sys.c中用信号量实现了一遍了,为什么左神当时你移植的时候还要再在sys_arch.c中实现一遍?我编译不过,ADS编译器直接说重复定义了~跪问大神!
路漫漫其修远兮,戒骄戒躁。
回复

使用道具 举报

24

主题

192

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2016-3-16
在线时间
202 小时
 楼主| 发表于 2018-1-27 15:27:29 | 显示全部楼层
参考原子哥程序,现在LWIP1.4.1已经在我S3C2440/ucosII_2.86/DM9000AEP/稳定运行,但是现在出现了了新的问题,因为板子没做关机资源回收处理,直接掉电后程序截然而止,第二次开机后,导致不能DHCP分配地址失败,不知道这是什么原因导致的,是因为没有回收局域网IP资源吗?(似乎PC关机都不会强行掉电,会有资源回收处理的),排查问题中,请各位大佬支招--有奖竞答,答案靠谱者留下any_wallet_ID,我给你发红包。
路漫漫其修远兮,戒骄戒躁。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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