nemonic27

nemonic27

0个粉丝

6

问答

0

专栏

0

资料

nemonic27  发布于  2016-04-17 15:10:54
采纳率 0%
6个问答
10975

有关hi3531 os管理的内存和mmz管理的内存

 
DEMO板DDR内存管理示意:(见图片)

~~~~~~~~~~~~~~~~~~
HI3531的默认内存分配图片所示, OS只管理64M。 这样是不是有点小,如果跑一些软件业务的话,例如SIP协议的话,是不是就会不够用了?

所以各位大神,我想问一下,HI3531 4路高清编码的话 mmz模块到底需不需要这么大, 能不能再分一部分给OS, 各位有没有修改过?


谢谢。
我来回答
回答8个
时间排序
认可量排序

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-04-18 05:38:01
认可0
本帖最后由 ngswfx 于 2016-4-18 06:00 编辑

自己调整,64M运行有些紧张,128M-256足够了,1G内存很富余的,4路高清编码,MMZ用不了那么多,通常需要用内存的地方还包括解码,图像缩放,处理,即便如此,肯定不会超过512M,你自己估算,1920*1080*2 ,也就是4M左右 3帧缓冲12M,4路图像48M。

折腾好几个地方处理,编码最多48*5=200多兆,而且后续的数据都是压缩过的,其实是一个最大帧1920*1080*3/4,除非你要搞的高清分辨率,是更大分辨率的。

程序部分就是分配些线程,分配些自己用的缓冲,我感觉128M应该够用,实在不放心,就256M。


不过话说回来,如果拿出做单片机的精神来搞,严格分配各种内存,能用4个char 绝不用 5个char,64M内存也是好大呀,怎么都用不完,呵呵:lol

我们写程序,习惯了,随意就是char str[255];,其实用不了这么多。

我这边的程序,rtspServer,rtspClient,onvif服务器客户端,网络串口,网络似有协议获取流,又是解码,还有PC控制,WEB服务器,好多东西,主程序都1M多了,还有6-7个库,不知道开了多少线程,也就25M左右内存使用。

48M系统内存我都跑过,能跑起来。自己按照自己的实际用途,实际需求规划吧。

假如你要做一个支持超级多路数转发能力的设备,系统内存就可以搞大点。例如流媒体转发模块。通常吃内存的就是各种缓冲。文件流缓冲,编码数据流缓冲等等。



话说回来,这种分内存的事,都是边写程序,边调整,哪里重要就侧重哪里。一个命令行的事,随时调整即可。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-18 08:20:57
认可0
本帖最后由 zhuangweiye 于 2016-4-26 08:09 编辑

先不用考虑OS的情况,先把海思工作在想要的状态比如楼主的四路高清(可以用sample来代替),然后cat /proc/media-mem

比如看到
---MMZ_USE_INFO:
total size=133120KB(130MB),used=55392KB(54MB + 96KB),remain=77728KB(75MB + 928KB),zone_number=1,block_number=49

表示 MMZ一共130M,用掉近55M, 还有75M空闲
那么这样就可以移60-70M给OS用了

3531有点特别,内存分为两块(起始物理地址分别为0x80000000,0xC0000000),一般OS只用到前面一块
可以通过修改load3531.sh中加载驱动来修改
比如下面是3531接512M内存,OS使用126M的情况
insmod mmz.ko mmz=anonymous,0,0x88200000,130M:ddr1,0,0xC0000000,256M anony=1 || report_error

可以通过修改 mmz=anonymous,0,0x88200000,130M 中后两个参数来调整MMZ使用的内存,当然bootarg也要相应修改mem=126M,

不过3531修改MMZ使用大小比较麻烦,要在代码中为VI/VENC/VDEC/VPSS/VO指定使用内存的位置

nemonic27

0个粉丝

6

问答

0

专栏

0

资料

nemonic27 2016-04-24 11:29:19
认可0
@ngswfx 64M是够用,但是在跑gdb的时候就捉襟见肘了,所以才想修改一下os使用的mem大小。
@zhuangweiye 我现在确实已经修改了load3531.sh和bootargs, 但是在某一个demo板上修改后有些问题,venc sample例程提示内存分配失败(OS分配256M有问题,但是分配128M就没有问题, 我能保证load3531.sh和bootargs的修改肯定是正确的,我改完之后计算了更改之后的区域大小和首地址)。不知道是不是和你说的“要在代码中为VI/VENC/VDEC/VPSS/VO指定使用内存的位置” 这里有关系?


非常感谢2位详尽的回答哈,我不是每天都在线,回帖有点慢,不好意思。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-25 08:40:29
认可0
对于3531来说如果只是简单修改load3531.sh和bootargs,可能会导致原来MMZ内存够用的程序,在看起来MMZ内存大小够用的情况下报MMZ不够的错误

一般来说, 海思默认把所有的模块使用的MMZ都放在ddr0上(就是mmz=anonymous的那块内存上)

对于3531要用到ddr1,0,0xC0000000,XXM的话,就必须在程序里为每个模块(确切地说是VB或者每个模块的每个channel/group)指定位置

比如:
    for(i = 0;i < dec_cnt; i++)
    {                   
        pcMmzName = "ddr1";
               
            stMppChn.enModId = HI_ID_VDEC;
        stMppChn.s32DevId = 0;
        stMppChn.s32ChnId = i;

        s32Ret = HI_MPI_SYS_SetMemConf(&stMppChn,pcMmzName);
        if (s32Ret)
        {
            SAMPLE_PRT("HI_MPI_SYS_SetMemConf VDEC ERR !\n");
        }
    }

意思是把 0 --- dec_cnt-1 的vdec放到 MMZ名字为“ddr1”的内存上

而VB就直接
        ...
        stVbConf.astCommPool[3].u32BlkSize = u32BlkSize;
        stVbConf.astCommPool[3].u32BlkCnt = 10 ;
        strcpy(stVbConf.astCommPool[3].acMmzName,"ddr1");
       ...
        s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);

意思在MMZ名字为“ddr1”的内存上,开10块大小为u32BlkSize的VB

其实看一下 /proc/media-mem就可,可以知道两块内存各还有多少空余(海思在3531上做的不够贴心,显示的空余是总的)
如果 ddr0上不够了就要调整部分模块或VB到ddr1上去或者反过来,可能要反复几次

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-04-25 14:53:17
认可0
本帖最后由 ngswfx 于 2016-4-25 14:57 编辑

从应用角度将,这些配置,这的确有些繁杂了,我还没涉及到这么深入。学习了。:lol

好些sample里面默认的参数,我程序里都是默认的,没有细细研究,只能了解大概,不可能全部都了解细致,精力有限呀。

hehe,我得赶紧去研究我的代码,看能不能省点内存

nemonic27

0个粉丝

6

问答

0

专栏

0

资料

nemonic27 2016-04-28 21:13:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29033&ptid=11012]zhuangweiye 发表于 2016-4-25 08:40[/url]
对于3531来说如果只是简单修改load3531.sh和bootargs,可能会导致原来MMZ内存够用的程序,在看起来MMZ内存 ...[/quote]

十分感谢。这个方法我实验一下。
这个帖子暂时结贴了,多谢回答。  

Joey

1个粉丝

15

问答

0

专栏

0

资料

Joey 2017-09-14 15:34:52
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29076&ptid=11012]ngswfx 发表于 2016-4-25 14:53[/url]
从应用角度将,这些配置,这的确有些繁杂了,我还没涉及到这么深入。学习了。

好些sample里面默认的 ...[/quote]

我已经陷入这个内存的大坑当中去了。

Joey

1个粉丝

15

问答

0

专栏

0

资料

Joey 2017-09-14 16:05:40
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29381&ptid=11012]nemonic27 发表于 2016-4-28 21:13[/url]
十分感谢。这个方法我实验一下。
这个帖子暂时结贴了,多谢回答。[/quote]

你好,我遇到的问题和你一样。
(OS分配256M有问题,但是分配128M就没有问题, 我能保证load3531.sh和bootargs的修改肯定是正确的,我改完之后计算了更改之后的区域大小和首地址)

但是上面那位说的什么要改VI/VENC/VDEC/VPSS/VO指定使用内存的位置” ,这里修改是在应用程序里的。我是和你那样改之后,系统都不能跑起来
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区