DSP 的音频编码程序需要使用OMAP1510 板SDRAM。这些内存需要通过ARM设置DSP MMU 映射到DSP 的内存空间中去。DSP 的音频编码程序共使用两个SDRAM内存块, 分别是用于DSP BOOT 的内存和DSP 工作内存。
应用程序使用DSP 编码程序时, 必须采用EMIF16 BOOTLOAD 的DSP BOOT 模式(DSP BOOT模式3) 。在BOOT DSP 前, 需要将DSP 的BOOTTABLE 存放到SDRAM的某个内存空间中, 其物理地址( 注意: 不是虚拟地址) 的首地址dsp_boot_base 必须16 bit 对齐( 即低16 位为“0”) , 大小为128 KB。设置DSP MMU, 将其首地址dsp_boot_base 映射到DSP 地址空间中的0x080000(BYTE 地址) , 将dsp_boot_base+0x00010000 映射到DSP 地址空间的0x090000(BYTE地址) 。
由于DSP 的片内内存有限, DSP 的编码程序需要使用一定数量的外部内存; 同时, 为了方便DSP 和ARM交换数据, 需要设置DSP MMU 使得DSP 可以访问OMAP 板上的SDRAM。DSP 的工作内存共1 MB。在BOOT DSP 前, 设置DSP MMU, 将首地址( 物理地址)为dsp_work_base 的1 MB 内存映射到DSP 地址空间的0x400000(BYTE 地址) 。DSP 工作内存的详细使用情况如表1 所示。
这些数据段的详细描述如下:
(1)DSP 私用数据— —这128KB 供DSP 编码使用,ARM禁止访问这块内存。
( 2) 音频缓冲区标志— —这8 KB 的前8 个32 bitWORD 分别标志ARM是否已从音频缓冲区中对应的8 个2 KB 段中取走已编码的数据。ARM将第n 个音频缓冲区的编码数据读走后, 需要将音频缓冲区标志的第n 个WORD 清“0”。
( 3) 音频缓冲区— —这块内存分为8 块, 每块2KB。DSP 会将编码后的每帧音频数据依次、循环地写入每块中。ARM端需要及时将这些数据读走, 并将音频缓冲区标志中的相应WORD 清零。(DSP 在写一块音频数据帧之前会检查音频缓冲区标志中的对应WORD 是否为“0”, 在写入一块音频数据帧后会将其置“1”) 。
( 4) 保留—— 这段内存为以后应用保留。
( 5)DSP 代码空间—— 这127.5 KB 内存用于存放DSP 的部分代码, ARM禁止访问。Mailbox 是OMAP1510 中ARM 和DSP 通信的主要方式之一。每个Mailbox 可以传递2 个16 bit 字— —命令号和数据。在音频编码程序中, 命令号指定对方处理器进行何种操作, 其中的数据表示操作的参数( 如果有的话) 。ARM端的应用程序通过Mailbox 和DSP 端的编码程序进行通信, 以达到协调工作的目的。表2 和表3 分别描述了ARM发给DSP 及DSP 发给ARM的Mailbox 中各命令号所代表的含义。
ARM 程序
总的说来ARM端应用程序要完成I2C 驱动程序,
为DSP 分配引导和工作内存, DSP MMU 的设置, 以及与DSP 之间的Mailbox 中断服务。具体按下列操作进行, 程序流程图如图2 所示。
( 1) 获取128 KB 的内存空间, 作为DSP BOOT 内存, 并将DSP BOOT TABLE 拷贝到这个内存空间。
( 2) 获取1 MB 的内存空间, 作为DSP 工作内存。
( 3) 设置DSP MMU, 将DSP BOOT 内存映射到DSP 内存空间0x080000(BYTE 地址) ; 将DSP 工作内存映射到DSP 内存空间0x400000(BYTE 地址) 。
( 4)BOOT DSP 并等待DSP 发过来的Mailbox。
( 5) 收到DSP 的第一个Mailbox 后, 运行ARM端的编码程序, 在需要DSP 启动编码时, 向DSP 发送命令号为0x0F60 的Mailbox, 如果同时进行音频编码, 需要在这个Mailbox 的数据中设置音频编码参数。同时,将读音频码流的指针指向DSP 工作内存中音频缓冲区的第一个2 KB 块。
( 6) 在应用程序运行过程中, 如果收到DSP 发来的命令号为0xF001 的Mailbox, 则: ( 1) 从Mailbox 的数据寄存器中读取数据长度length; ( 2) 从读音频码流的指针处读取长度为length 的字节; ( 3) 将相应的音频缓冲区标志清“0”; ( 4) 将读音频码流的指针指向音频缓冲区的下一个2 KB 块。
( 7) 在应用程序运行过程中, 如果收到DSP 发来的命令号为0x0F40 的Mailbox, 则结束程序。
( 8) 当应用程序结束编码时, 向DSP 发送一个命令号为0x0F70 的Mailbox, 要求DSP 结束编码。由此可以看出, 要想让ARM核和DSP 核协调工作并达到高效运行, 就必须把任务合理地分配给两个处理器, 双核通信在其中所起的巨大作用显而易见。可以将繁重的数据处理任务交给DSP 来完成, 而ARM处理器只需执行有限的命令来控制, 这样就可以保持最小的处理开销, 大大降低了功率。 |