CI110X系列芯片SDK内存分配(icf)调整指南¶
1. CI1102¶
1.1. 内存区域说明¶
-
define symbol ROM_SIZE:代码和常量占用的空间 异常表现:编译报错
-
define symbol FHEAP_SIZE:FreeRTOS的堆空间,任务堆栈,操作系统资源,很多模块使用到的资源,命令词excel 表格加大后,可能该区域会不够。 异常表现:运行中可能出现错误警告
-
define symbol RAM_SIZE:全局变量,全局数组 异常表现:编译报错
-
define symbol ASR_USED_SIZE:识别解码相关,词条占用该部分空间,词条过多,该部分在程序运行中可能不够。 异常表现:运行中无法识别,【请在人声干扰噪音下测试1小时,如不出现无法识别情况,则表示正常】
-
define symbol STACK_SIZE:中断栈,不建议修改 异常表现:无法预测,所以强烈不建议修改。
1.2. 调整基本规则¶
-
在调整过程中,始终要保证 ROM_SIZE+FHEAP_SIZE+RAM_SIZE+ASR_USED_SIZE = 528*1024。
-
RAM_SIZE 不能小于16*1024。
-
ROM_SIZE ,RAM_SIZE 刚够就好,剩余的空间可以分给 ASR_USED_SIZE 。
1.3. 代码空间(ROM_SIZE)不够¶
1.3.1. 现象¶
- 编译时,在从0x1ffb0000开始的区域中分配不到内存:
Error[Lp011]: section placement failed unable to allocate space for sections/blocks with a total estimated minimum size of 0x1’d4b8 bytes (max align 0x4) in <[0x1ffb‘0000-0x1ffb‘9fff]> (total uncommitted space 0x9f00).
1.3.2. 调整策略¶
增大 ROM_SIZE, 减小 ASR_USED_SIZE,不要调整太多,刚好够就行,尽量把空间留给 ASR_USED_SIZE。
1.4. 全局变量区(RAM_SIZE)不够¶
1.4.1. 现象¶
- 编译时,在从0x20020000后面的区域中分配不到内存: Error[Lp011]: section placement failed unable to allocate space for sections/blocks with a total estimated minimum size of 0x5298 bytes (max align 0x8) in <[0x2002’f000-0x2003‘3fff]> (total uncommitted space 0x5000).
1.4.2. 调整策略¶
增大 RAM_SIZE, 减小 ASR_USED_SIZE,不要调整太多,刚好够就行,尽量把空间留给 ASR_USED_SIZE。
1.5. FreeRTOS 堆不够¶
1.5.1. 现象¶
-
运行时,使用接口 pvPortMalloc 申请内存失败。
-
运行时,log日志:“asr init fail”。
- 运行时,log日志:“not enough memory”。
- 运行时,log日志:“alloc error”。
- 运行时,log日志:“malloc err!”。
- 运行时,log日志:“malloc audio source data error”。
1.5.2. 调整策略¶
-
先调整 ROM_SIZE,调整到刚好够就行,剩余的加到 FHEAP_SIZE。
-
再调整 RAM_SIZE,调整到刚好够就行,剩余的加到 FHEAP_SIZE。
-
如果还不够,可以试着从 ASR_USED_SIZE 调整部分空间到 FHEAP_SIZE。
1.6. iar堆不够¶
1.6.1. 现象¶
-
运行时,使用接口 malloc 申请内存失败。
-
运行时,log日志:“decoder_manage.c,L: xxx”,然后卡住不动或重启。
1.6.2. 调整策略¶
-
先调整 ROM_SIZE,调整到刚好够就行,剩余的加到 ASR_USED_SIZE。
-
再调整 RAM_SIZE,调整到刚好够就行,剩余的加到 ASR_USED_SIZE。
-
如果还不够,可以试着从 FHEAP_SIZE 调整部分空间到 ASR_USED_SIZE。
2. CI1103¶
2.1. 内存区域说明¶
- define symbol ROM_SIZE:代码和常量占用的空间,通常增加代码会导致对该区域内存大小需求增加,此区域size建议以sdk发布时为准。 异常表现:编译报错
- define symbol DECODER_CODE_RW_SIZE:对应语音识别系统代码段和全局变量内存需要,此区域size建议以sdk发布时为准。 异常表现:编译报错
- define symbol RAM_SIZE:全局变量,全局数组,对应用户数据区,通常增加全局变量会导致对该区域内存大小需求增加。 异常表现:编译报错
- define symbol DECODER_USED_SIZE:对应sdk中语音识别、aec、denoise等算法申请数据区大小,此区域通常情况是不需要变更的,但是注意在裁剪功能时可以对此区域进行减小,例如不需要使用aec、denoise、deforming、doa等算法时,且其他用户代码对内存要求较多时可以适量减小此区域大小。 异常表现:详见6.1
- define symbol RODATA_SIZE:为只读数据段,通常增加const变量会导致对该区域内存大小需求增加。 异常表现:编译报错
- define symbol FHEAP_SIZE:用户堆区,通常用户使用pvPortMalloc函数申请动态内存即从此区域申请,同时freertos中的相关接口也从该区域申请内存,例如创建任务、信号量、队列、事件组等,若用户程序增加了以上内容则需要适量增加该区域大小。 异常表现:运行中可能出现错误警告
- define symbol NO_CACHE_PSRAM_SIZE: 异常表现:仅用于语音识别系统内dnn输出使用,此区域size以sdk发布时为准不可修改。
- define symbol STACK_SIZE:中断栈,不建议修改 异常表现:无法预测,所以强烈不建议修改。
2.2. 调整基本规则¶
在调整过程中,始终要保证以下规则:
2.2.1. 规则(一)¶
- ROM_SIZE+DECODER_CODE_RW_SIZE+DECODER_USED_SIZE+RAM_SIZE+RODATA_SIZE+FHEAP_SIZE+NO_CACHE_PSRAM_SIZE = (2 * 1024 * 1024 + 1 * 512 * 1024)
2.2.2. 规则(二)¶
- DECODER_CODE_RW_SIZE+DECODER_USED_SIZE+RAM_SIZE = (512 * 1024)
2.2.3. 规则(三)¶
- ROM_SIZE,RAM_SIZE 刚够就好。
2.3. 代码空间(ROM_SIZE)不够¶
2.3.1. 现象¶
编译时,在 0x1ff30000 ~ 0x1ffaffff 之间的区域中分配不到内存:
- Error[Lp011]: section placement failed
unable to allocate space for sections/blocks with a total estimated minimum size of 0x2’ac8b bytes (max align 0x4) in <[0x1ff8‘9000-0x1ffa’ffff]> (total uncommitted space 0x2‘6ec4).
计算方法:
- 0x2ac8b - 0x26ec4 = 0x3C00 ,0x3C00转换为十进制是15360, 15360/1024 = 15,能整除,意味着大概还需要增加16K(1K为1024)的ROM_SIZE空间,根据步骤2的规则(一),可以相应减少FHEAP_SIZE的空间大小。
例如这样修改:
define symbol ROM_SIZE = 1024*(256+16);
define symbol FHEAP_SIZE = 1024*(1506-16);
修改过后,再出现下列错误,说明ROM空间还不够,再依次增加1K,FHEAP_SIZE减少1K,直到编译不报错。
- Error[Lp015]: section placement failure: overcommitted content in [0x1ff8‘5000-0x1ffa’ffff]
2.3.2. 调整策略¶
- 增大 ROM_SIZE,减小 FHEAP_SIZE,不要调整太多,刚好够就行,以免用用户堆区不够。
- 依照步骤2的规则(一)调整。
2.4. 语音识别系统代码段和全局变量区(DECODER_CODE_RW_SIZE)不够¶
2.4.1. 现象¶
编译时,在 0x1ffb0000 后的区域中分配不到内存:
- Error[Lp011]: section placement failed
unable to allocate space for sections/blocks with a total estimated minimum size of 0x4138 bytes (max align 0x4) in <[0x1ffb‘0000-0x1ffb‘3fff]> (total uncommitted space 0x3f00).
计算方法:
- 0x4138 - 0x3f00 = 0x238 ,0x238转换为十进制是568,568/1034 = 0,意味着大概还需要增加1K的DECODER_CODE_RW_SIZE空间,根据步骤2的规则(二),可以相应减少DECODER_USED_SIZE的空间大小。
例如这样修改:
define symbol DECODER_CODE_RW_SIZE = 1024*(16+1);
define symbol DECODER_USED_SIZE = 1024*(419-3-2-6-1);
2.4.2. 调整策略¶
- 增大 DECODER_CODE_RW_SIZE,减小 DECODER_USED_SIZE,不要调整太多,刚好够就行,尽量把空间留给 DECODER_USED_SIZE。
- 依照步骤2的规则(二)调整。
2.5. 全局变量区(RAM_SIZE)不够¶
2.5.1. 现象¶
编译时,在 0x1ffb4c00 后面的区域中分配不到内存:
- Error[Lp011]: section placement failed
unable to allocate space for sections/blocks with a total estimated minimum size of 0x1‘53f8 bytes (max align 0x8) in <[0x1ffb‘4c00-0x1ffc‘87ff]> (total uncommitted space 0x1‘3c00).
计算方法:
- 0x153f8 - 0x13c00 = 0x1400 ,0x1400转换为十进制是5120,5120/1024 = 5,能整除,意味着大概还需要增加 6K 的 RAM_SIZE 空间,根据步骤2的规则(二),可以相应减少 DECODER_USED_SIZE 的空间大小。
例如这样修改:
define symbol RAM_SIZE = 1024*(74+3+2+6);
define symbol DECODER_USED_SIZE = 1024*(419-3-2-6);
2.5.2. 调整策略¶
- 增大 RAM_SIZE, 减小 DECODER_USED_SIZE,不要调整太多,刚好够就行,尽量把空间留给 DECODER_USED_SIZE。
- 依照步骤2的规则(二)调整。
2.6. asr堆(DECODER_USED_SIZE)不够¶
2.6.1. 现象¶
- 运行时,使用接口 malloc 申请内存失败。
- 运行时,log日志:“decoder_manage.c,L: xxx”,然后卡住不动或重启。
2.6.2. 调整策略¶
- 先调整 DECODER_CODE_RW_SIZE,调整到刚好够就行,剩余的加到 DECODER_USED_SIZE。
- 再调整 RAM_SIZE,调整到刚好够就行,剩余的加到 DECODER_USED_SIZE。
- 依照步骤2的规则(二)调整。
2.7. 只读数据段(RODATA_SIZE)不够¶
2.7.1. 现象¶
编译时,在 0x20030000 后面的区域中分配不到内存:
- Error[Lp011]: section placement failed
unable to allocate space for sections/blocks with a total estimated minimum size of 0x3194 bytes (max align 0x4) in <[0x2003‘0000-0x2003‘27ff]> (total uncommitted space 0x2800).
计算方法:
- 0x3194 - 0x2800 = 0x994 ,0x1400转换为十进制是2452,5120/1024 = 2.39,不能整除,意味着大概还需要增加 3K 的 RODATA_SIZE 空间,根据步骤2的规则(一),可以相应减少 FHEAP_SIZE 的空间大小。
例如这样修改:
define symbol RODATA_SIZE = 1024*(10+3);
define symbol FHEAP_SIZE = 1024*(1506+20-3);
2.7.2. 调整策略¶
- 增大 RODATA_SIZE,减小 FHEAP_SIZE,不要调整太多,刚好够就行。
- 依照步骤2的规则(一)调整。
2.8. FreeRTOS 堆(FHEAP_SIZE)不够¶
2.8.1. 现象¶
- 运行时,使用接口 pvPortMalloc 申请内存失败。
- 运行时,log日志:“asr init fail”。
- 运行时,log日志:“not enough memory”。
- 运行时,log日志:“alloc error”。
- 运行时,log日志:“malloc err!”。
- 运行时,log日志:“malloc audio source data error”。
2.8.2. 调整策略¶
- 先调整 ROM_SIZE,调整到刚好够就行,剩余的加到 FHEAP_SIZE。
- 再调整 RODATA_SIZE,调整到刚好够就行,剩余的加到 FHEAP_SIZE。
- 依照步骤2的规则(一),规则(二)调整。