内存
1. 内存管理¶
1.1. 存储管理单元(MMU)¶
RTK系统通过预设的方法来区分cache区域和non-cache区域,在scatter file里定义不同的section,将需要设为non-cacheable的内存块放置到特定的section里。
CPU启动时读取这些配置文件,对不同的section配置MMU,把non-cache的section映射到CPU认识的地址。当CPU再访问内存的时候,通过MMU就会知道这块内存是cacheable还是non-cacheable的了。
SSC8339配置的区域为: Cache: 0x20000000 ~ 0x28000000 Non-Cache: 0x90000000 ~ 0x98000000
1.1.1. Cache的优缺点¶
在SSC8X39系列中,Cache存在意义就是拉近CPU和DDR之间读写性能差异,提高整个系统性能。
比如CPU要执行DDR里的指令,可以一次性读一块区域的指令到cache里,下次就可以直接从cache里获取指令,而不用反复的去访问速度较慢的DDR;
然而Cache具有强随机性。
比如CPU要写一块数据到DDR里,它可以将数据快速地写到cache里,需要在合适的时候手动刷新(将cache里的数据flush到DDR里)或无效(Invalidate,将cache里的内容清掉,下次再读取的时候需要去DDR里读最新的内容),避免读写到非期望的内容。
2. 内存的申请和释放¶
2.1. API¶
2.1.1. Cache¶
void* CamOsMemAlloc(u32 nSize)
图2-1 Cache内存申请
void* CamOsMemRelease(void* pPtr)
图2-2 Cache内存释放
用法示例:
图2-3 Cache内存的申请和释放
2.1.2. Non-Cache¶
CamOsRet_e CamOsDirectMemAlloc(const char* szName, 32 nSize, void** ppUserPtr, u64* pMiuAddr, u64* lpPhysAddr)
图2-4 Non-Cache内存申请
CamOsRet_e CamOsDirectMemRelease(void* pUserPtr, u32 nSize)
图2-5 Non-Cache内存释放
用法示例:
图2-6 Non-Cache内存的申请和释放
2.1.3. 虚拟地址和物理地址¶
图2-7 虚拟地址和物理地址互换
图2-8 物理地址转为MIU地址
2.2. 地址对齐¶
申请内存时,系统将在新申请内存的开始地址前24bytes填入header和footer信息,用于监看内存块使用情况。
通过这些信息可以了解到此内存大小以及被谁申请,何时申请,何处( 通过lr 信息)发生的申请。
对新申请的内存大小做32bytes对齐。
对新申请的内存的开始地址做64byte对齐。
释放内存时需同时清除用于内存标记的header和footer信息。
图2-9 内存管理之header和footer信息图
3. 工作模式¶
基于RTK OS设计的行车记录仪产品,主要有以下几种工作模式:
- REC Mode
- DSC Mode
- Browser Mode
- Playback Mode
- Menu/Setting Mode
记录仪工作时,除了各模式共享资源申请的内存外,当前模式专属资源也需要申请内存。
-
共享资源
包括音频文件,UI图标,文件系统,语音识别等等;
为了避免内存碎片,开机时申请后将不再释放和再申请;
-
专属资源
模式切换时,被切换掉的模式申请的专属内存必须完整释放掉,等待下一个模式动态申请;
3.1. 共享资源¶
-
音频文件
播放音频文件,实现与用户交互的语音提示;
-
UI图标
用户界面绘图和管理;
-
文件系统
RTK OS文件系统支持FAT,FAT32,支持对NOR FLASH,SDMMC,DDR上文件的各类操作;
-
语音识别
通过语音控制设备与用户交互;
-
通用模块
比如UART,TASK,SDMMC等等;
3.2. 专属资源¶
3.2.1. REC Mode¶
- 支持各种分辨率下的录影;
- 支持MP4,AVI,TS等各种视频封装格式;
- 使用到的硬件资源有vif, isp, scale, dip, venc, jpeg enc, mvop;
3.2.2. DSC Mode¶
- 支持各种分辨率的拍照;
- 支持JPEG封装;
- 使用到的硬件资源有vif, isp, scale, dip, jpeg enc, mvop;
3.2.3. Browser Mode¶
- 可回放本机录影和拍照文件;
- 使用到的硬件资源有scale, dip, jpeg dec, vdec, mvop;
4. 内存监控¶
系统启动后任何时刻通过都可以通过输入memusage获得内存信息,包含总内存已用量,内存未被使用量,内存使用块数量,最大内存使用量等信息。
命令格式:memusage [param0] –t [param1]
Param0=on,周期性的输出内存使用情况,此时param1是信息输出间隔。
Param0=off,停止周期性的输出内存使用情况,此时param1无意义。
4.1. 共享资源¶
通过模式的切换,共享资源申请的内存开机后一直存在,通过memusage 我们抓出Rec Mode 和 Browser Mode 内存用量为例。
图4-1 REC Mode 预览模式下内存使用情况
从中可以看到内存使用基本是紧密连续的,其中FREE为104 bytes部分是申请内存地址做64 bytes对齐的开销,FREE为4008 bytes部分是内存地址做4KB对齐(硬件DMA使用地址)的开销。
图4-2 Browser Mode内存使用情况
上面两图Timestamp中,可以确认UART和FS申请的BUFFER一直存在;
Alloc [UART] Size[8192] VA 0x9115E000, PA 0x2115E000, MIU 0x0115E000 Alloc [FS_Buffer] Size[589824] VA 0x91299000, PA 0x21299000, MIU 0x01299000
4.2. 专属资源¶
4.2.1. Rec Mode¶
<b>
Idle Mode –> Preview Mode </b>
图4-3 Rec Mode Preview 内存使用情况
系统主要申请的内存有:
Alloc [Comp SCL0_PRM] Size[12533760] VA 0x915B1000, PA 0x215B1000, MIU 0x015B1000 Alloc [Comp SCL1_PRM] Size[2826240] VA 0x926A3000, PA 0x226A3000, MIU 0x026A3000 Alloc [Comp DIP_R0] Size[921600] VA 0x92956000, PA 0x22956000, MIU 0x02956000 Alloc [Comp DIP_R0] Size[921600] VA 0x92A38000, PA 0x22A38000, MIU 0x02A38000 Alloc [IspWorkQ] Size[2560] VA 0x92CA8000, PA 0x22CA8000, MIU 0x02CA8000
<b>
Preview Mode -> Recording Mode </b>
图4-4 Rec Mode Recording内存使用情况
Alloc [FileName] Size[256] VA 0x92CAA000, PA 0xEA000006, MIU 0xEA000006 Alloc [AudioComp] Size[2097152] VA 0x92CDD000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR Thumb] Size[336] VA 0x92CAC000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR Thumb] Size[336] VA 0x914CF000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR Thumb] Size[336] VA 0x914D1000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR Thumb] Size[336] VA 0x914D3000, PA 0xEA000006, MIU 0xEA000006 Alloc [Comp MFE0] Size[20679648] VA 0x92EDE000, PA 0x22EDE000, MIU 0x02EDE000 Alloc [SPS] Size[48] VA 0x914D5000, PA 0xEA000006, MIU 0xEA000006 Alloc [PPS] Size[16] VA 0x94298000, PA 0xEA000006, MIU 0xEA000006 Alloc [Comp MGR0] Size[1048576] VA 0x9429A000, PA 0x2429A000, MIU 0x0429A000 Alloc [Aux Video Size Table] Size[4096] VA 0x9439B000, PA 0xEA000006, MIU 0xEA000006 Alloc [Aux Video Time Table] Size[2048] VA 0x9439D000, PA 0xEA000006, MIU 0xEA000006 Alloc [Tail Buf] Size[1048576] VA 0x9439F000, PA 0xEA000006, MIU 0xEA000006 Alloc [Comp DIP_S7] Size[195840] VA 0x944A0000, PA 0x244A0000, MIU 0x044A0000 Alloc [Comp JPE12] Size[137088] VA 0x944D1000, PA 0x244D1000, MIU 0x044D1000 Alloc [Comp JPE12] Size[137088] VA 0x944F4000, PA 0x244F4000, MIU 0x044F4000 Alloc [Comp JPE12] Size[137088] VA 0x94517000, PA 0x24517000, MIU 0x04517000 Alloc [Comp JPE12] Size[137088] VA 0x9453A000, PA 0x2453A000, MIU 0x0453A000 Alloc [Comp JPE12] Size[137088] VA 0x9455D000, PA 0x2455D000, MIU 0x0455D000 Alloc [Comp JPE12] Size[137088] VA 0x94580000, PA 0x24580000, MIU 0x04580000 Alloc [Comp JPE12] Size[137088] VA 0x945A3000, PA 0x245A3000, MIU 0x045A3000 Alloc [Comp JPE12] Size[137088] VA 0x945C6000, PA 0x245C6000, MIU 0x045C6000 Alloc [Comp JPE12] Size[137088] VA 0x945E9000, PA 0x245E9000, MIU 0x045E9000 Alloc [Comp JPE12] Size[137088] VA 0x9460C000, PA 0x2460C000, MIU 0x0460C000 Alloc [Comp JPE12] Size[137088] VA 0x9462F000, PA 0x2462F000, MIU 0x0462F000 Alloc [Comp JPE12] Size[137088] VA 0x94652000, PA 0x24652000, MIU 0x04652000 Alloc [Comp JPE12] Size[137088] VA 0x94675000, PA 0x24675000, MIU 0x04675000 Alloc [Comp JPE12] Size[137088] VA 0x94698000, PA 0x24698000, MIU 0x04698000 Alloc [Comp JPE12] Size[137088] VA 0x946BB000, PA 0x246BB000, MIU 0x046BB000 Alloc [VR ThumbQ] Size[32] VA 0x947B1000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR ThumbQ] Size[32] VA 0x947B3000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR ThumbQM] Size[137088] VA 0x947B5000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR ThumbQM] Size[137088] VA 0x947D8000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR ThumbQM] Size[137088] VA 0x947FB000, PA 0xEA000006, MIU 0xEA000006 Alloc [VR ThumbQM] Size[137088] VA 0x9481E000, PA 0xEA000006, MIU 0xEA000006 Alloc [ROI & GN] Size[19456] VA 0x94841000, PA 0x24841000, MIU 0x04841000 Alloc [PMBR] Size[65792] VA 0x94847000, PA 0x24847000, MIU 0x04847000 Alloc [REF & REC] Size[3133440] VA 0x94859000, PA 0x24859000, MIU 0x04859000 Alloc [REF & REC] Size[3133440] VA 0x94B57000, PA 0x24B57000, MIU 0x04B57000
4.2.2 Playback Mode¶
图4-5 Playback Mode 内存使用情况
Alloc [ALOC_FW_END] Size[3145728] VA 0x91580000, PA 0x21580000, MIU 0x01580000 Alloc [HVD_FW] Size[788480] VA 0x91881000, PA 0x21881000, MIU 0x01881000 Alloc [HVD_FB] Size[27255296] VA 0x92CD1000, PA 0x22CD1000, MIU 0x02CD1000 Alloc [Comp DIP_S0] Size[1228800] VA 0x91943000, PA 0x21943000, MIU 0x01943000 Alloc [Comp DIP_S0] Size[1228800] VA 0x91A70000, PA 0x21A70000, MIU 0x01A70000 Alloc [Comp DIP_S0] Size[1228800] VA 0x91B9D000, PA 0x21B9D000, MIU 0x01B9D000 Alloc [Comp DIP_S0] Size[1228800] VA 0x91CCA000, PA 0x21CCA000, MIU 0x01CCA000 Alloc [Comp DIP_R0] Size[1228800] VA 0x91DF7000, PA 0x21DF7000, MIU 0x01DF7000 Alloc [Comp DIP_R0] Size[1228800] VA 0x91F24000, PA 0x21F24000, MIU 0x01F24000 Alloc [Comp DIP_R0] Size[1228800] VA 0x92051000, PA 0x22051000, MIU 0x02051000 Alloc [Comp DIP_R0] Size[1228800] VA 0x9217E000, PA 0x2217E000, MIU 0x0217E000
4.3. Timestamp用法¶
- 通过查看Timestamp可知,时间相近的内存一般都是前后紧接着申请的;
- 某些时候剩余内存被分割,通过查看Timestamp,可以了解到是一开机就申请了的,还是后面释放再重新申请的;可以尝试调整内存申请时间,尽可能的把剩余内存连成一个大整块;
- 切换模式前后对比,可以查看专属内存是否没在完全被释放掉;