雷达编程实战之Firmware内存优化( 二 )


上述代码将为起点的32MB数据区域设置为了non-(意味着所有都可以观察该内存的实际值),not (如果被多个使用Non-内存,无序的读写的操作顺序会导致异常) 。当然,在设置MPU 时,建议将cache与MPU失能,配置完成之后再使能 。
Data
在基带模块中主要涉及的数据类型如下:
定点实数/复数
下图是一个8位定点实数的Bit图,高四位是整数,第四位是小数 。实数1.5对应表示为 。
定点的复数如下图为高32位为实部,低32位为虚部 。0-12bit位为虚部的小数部分,13-31bit为虚部的整数部分 。32-44bit为实部小数部分,45-63bit为实部的整数部分 。
浮点复数
如下图所示,浮点复数的实部和虚部是由两个符合标准的单精度短浮点数的标准的32位数表示 。
单精度短浮点数的由1位符号位,8位指数位和23位有效数字位构成 。实际上有效数字位是24位,因为第一位有效数字总是“1”,不必存储 。有效数字位是一个二进制纯小数 。8位指数位中第一位是符号位,这符号位和一般的符号位不同,它用“1”代表正,用”0“代表负 。整个单精度短浮点数的符号位用“1”代表负,“0”代表正 。指数位为正代表有效数字位需要右移指数+1,为负则代表需要左翼左移指数按位取反 。距离举个转换的例子:
伪浮点复数
伪浮点复数这种数据存储格式能够有效的减少内存压力,它将需要64位存储的浮点复数用32位来存储 。结构如下:

雷达编程实战之Firmware内存优化

文章插图
实部和虚部都以14位数表示,他们的浮点位置由高4位计算得出 。复数的实数部分数值=
,复数的虚数部分数值=
。下面举个例子,复数-7+4i在内存中以伪浮点复数存储为 。
Map
雷达的MCU一般都是多核的,成本高一点的会是多个ARM核与DSP核,成本低一点的也会有ARM核与各种加速核 。这些核心都有对RAM进行读写的需要 。我们针对低成本芯片集成电路蓝本,大约简化以下几个主体 。
我们把RAM分为两部分,BUF1和BUF2,BUF1存储包括FFT的原始与结果数据,BUF2存储一些窗口数据 。MCU中的每个核心都对RAM有不同位宽的读写需求,核心直接也有相互写入的需求 。我们把数据想象成水流,而各个加速核想象成水处理池,而我们嵌入式工程师就像是水管工,将核心根据需要用RAM中的数据连接起来,来搭建一个信号处理流程 。下表是这些核心与RAM不同位宽的读写关系图(纵向表头为请求方,表格中的读写是请求方的读写,横向为响应方) 。
P1_ZO
FFT
P2
CFAR
BUF1
BUF2
BUS
32/64读/写
32/64读/写
【雷达编程实战之Firmware内存优化】16写
32写
32写
8/16/32/64读
8/16/32写
雷达编程实战之Firmware内存优化

文章插图
8/16/32/64读
8/16/32写
PREP
64写
P1
32写
32写
FFT
32写
16/32读
32写
P2
32写
32读
32写
32读
32写
CFAR
32读
64写
BUF1可以根据存储的数据种类进一步划分,比如可以划分为存储AD回波数据的区域,存储距离维FFT结果数据区,速度维FFT结果数据,这么存储可以进行更好的调试信号处理调试以及更灵活的信号处理流程搭建,但是一旦流程固定之后,我们完全可以将一些数据区域复用,比如与可以指向一个地址,这样处理可以大大减少对内存空间的压力 。
除了上述的可供ARM核心读写的BUF1+BUF2内存区域(我们称之为原始数据区),具有加速核的雷达SOC还有一些"影子RAM",这么称呼是因为他们仿佛是原始数据区域的影子一样,这些区域ARM核心并不能直接写,但是可以读,每当我们向原始数据区写入的后,不同的影子RAM会自动写入对应原始数据经过一种固定运算或者更改存储格式后的数据.