内存


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)

Alt text

图2-1 Cache内存申请

void* CamOsMemRelease(void* pPtr)

Alt text

图2-2 Cache内存释放

用法示例:

Alt text

图2-3 Cache内存的申请和释放

2.1.2. Non-Cache

CamOsRet_e CamOsDirectMemAlloc(const char* szName,
                                32      nSize,
                                void**  ppUserPtr,
                                u64*    pMiuAddr,
                                u64*    lpPhysAddr)

Alt text

图2-4 Non-Cache内存申请

CamOsRet_e CamOsDirectMemRelease(void* pUserPtr, u32 nSize)

Alt text

图2-5 Non-Cache内存释放

用法示例:

Alt text

图2-6 Non-Cache内存的申请和释放

2.1.3. 虚拟地址和物理地址

Alt text

图2-7 虚拟地址和物理地址互换

Alt text

图2-8 物理地址转为MIU地址

2.2. 地址对齐

申请内存时,系统将在新申请内存的开始地址前24bytes填入header和footer信息,用于监看内存块使用情况。

通过这些信息可以了解到此内存大小以及被谁申请,何时申请,何处( 通过lr 信息)发生的申请。

对新申请的内存大小做32bytes对齐。

对新申请的内存的开始地址做64byte对齐。

释放内存时需同时清除用于内存标记的header和footer信息。

Alt text

图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 内存用量为例。

Alt text

图4-1 REC Mode 预览模式下内存使用情况

从中可以看到内存使用基本是紧密连续的,其中FREE为104 bytes部分是申请内存地址做64 bytes对齐的开销,FREE为4008 bytes部分是内存地址做4KB对齐(硬件DMA使用地址)的开销。

Alt text

图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>

Alt text

图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>

Alt text

图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

Alt text

图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,可以了解到是一开机就申请了的,还是后面释放再重新申请的;可以尝试调整内存申请时间,尽可能的把剩余内存连成一个大整块;
  • 切换模式前后对比,可以查看专属内存是否没在完全被释放掉;