Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Audio Reach

Audio Weaver

Developed for power constrained mobile products. Single use case.

Developed for high-performance automotive audio. Multiple concurrent use cases.

Variable processing load.

Constant / deterministic real-time load

Must keep cores loaded < 70%

Can load cores to 90%

Separate AMS framework needed for low latency support. End-to-end digital latency of 3 x block size.

Native low-latency support. End-to-end digital latency of 2 x block size.

TDM ports aligned within 12 samples

TDM ports aligned within 1 sample

SysMon does not provide actionable information to fully load the system.

Easy to understand profiling. Per module, per thread, and per core. Show average and peak CPU load.

Only supports Hexagon DSPs; no Arm.

Supports all cores including Arm.

QXDM is a poor fit for real-time debugging.

Includes integrated visual debugging tools and legacy QXDM.

Numerous side effects. Many features can only be supported by Qualcomm.

Architecture is fully documented and information is publicly available.

Anchor
_

...

The R4.0 system uses an XML file to configure the Audio Weaver and the underlying BSP. This is converted to a binary file and loaded at system boot. An annotated version of the XML file is shown below.

<config platform="8755">

<awe_process>

<!--Unused. Will be removed in the future-->

<enable type="BOOL">true</enable>

</awe_process>

<params>

<log_level type="UINT32" max_level="2">

<!-- Specifies the log levels for each core. -->

<adsp type="UINT32">0</adsp>

<gpdsp0 type="UINT32">0</gpdsp0>

<gpdsp1 type="UINT32">0</gpdsp1>

<arm type="UINT32">0</arm>

</log_level>

<thread_num>

<!-- Number of child audio processing threads per core-->

<adsp type="UINT8">4</adsp>

<gpdsp0 type="UINT8">10</gpdsp0>

<gpdsp1 type="UINT8">10</gpdsp1>

<arm type="UINT8">4</arm>

</thread_num>

<adsp_thread_priority>

<!-- thread_parent is the priority of the main audio processing interrupt.

This is the highest priority audio thread. -->

<thread_parent type="UINT8">50</thread_parent>

<thread_child>

<!-- Next separate priorities for each child thread.

The number of child threads is specified above.

The child threads should be in decreasing priority from the parent_thread. -->

<thread_0 type="UINT8">51</thread_0>

<thread_1 type="UINT8">52</thread_1>

<thread_2 type="UINT8">53</thread_2>

<thread_3 type="UINT8">54</thread_3>

</thread_child>

</adsp_thread_priority>

<gpdsp0_thread_priority>

<thread_parent type="UINT8">50</thread_parent>

<thread_child>

<thread_0 type="UINT8">51</thread_0>

<thread_1 type="UINT8">52</thread_1>

<thread_2 type="UINT8">53</thread_2>

<thread_3 type="UINT8">54</thread_3>

<thread_4 type="UINT8">55</thread_4>

<thread_5 type="UINT8">56</thread_5>

<thread_6 type="UINT8">57</thread_6>

<thread_7 type="UINT8">58</thread_7>

<thread_8 type="UINT8">59</thread_8>

<thread_9 type="UINT8">60</thread_9>

</thread_child>

</gpdsp0_thread_priority>

<gpdsp1_thread_priority>

<thread_parent type="UINT8">50</thread_parent>

<thread_child>

<thread_0 type="UINT8">51</thread_0>

<thread_1 type="UINT8">52</thread_1>

<thread_2 type="UINT8">53</thread_2>

<thread_3 type="UINT8">54</thread_3>

<thread_4 type="UINT8">55</thread_4>

<thread_5 type="UINT8">56</thread_5>

<thread_6 type="UINT8">57</thread_6>

<thread_7 type="UINT8">58</thread_7>

<thread_8 type="UINT8">59</thread_8>

<thread_9 type="UINT8">60</thread_9>

</thread_child>

</gpdsp1_thread_priority>

<arm_thread_priority>

<thread_parent type="UINT8">63</thread_parent>

<thread_child>

<thread_0 type="UINT8">62</thread_0>

<thread_1 type="UINT8">61</thread_1>

<thread_2 type="UINT8">60</thread_2>

<thread_3 type="UINT8">59</thread_3>

</thread_child>

</arm_thread_priority>

<!-- Number of audio processing cores -->

<num_of_instances type="UINT32">4</num_of_instances>

<adsp>

<!-- Core ID (or instance ID) of the core. -->

<coreID type="UINT8">0</coreID>

<!-- Sizes of the Audio Weaver heaps, in units of 32-bit words. -->

<fastheapA type="UINT32">250000</fastheapA>

<fastheapB type="UINT32">250000</fastheapB>

<slowheap type="UINT32">250000</slowheap>

<cpuclock type="UINT32" unit="KHz">1344000</cpuclock>

</adsp>

<gpdsp0>

<coreID type="UINT8">1</coreID>

<fastheapA type="UINT32">250000</fastheapA>

<fastheapB type="UINT32">250000</fastheapB>

<slowheap type="UINT32">250000</slowheap>

<cpuclock type="UINT32" unit="KHz">1708800</cpuclock>

</gpdsp0>

<gpdsp1>

<coreID type="UINT8">2</coreID>

<fastheapA type="UINT32">250000</fastheapA>

<fastheapB type="UINT32">250000</fastheapB>

<slowheap type="UINT32">250000</slowheap>

<cpuclock type="UINT32" unit="KHz">1708800</cpuclock>

</gpdsp1>

<arm>

<coreID type="UINT8">3</coreID>

<fastheapA type="UINT32">7000000</fastheapA>

<fastheapB type="UINT32">70000</fastheapB>

<slowheap type="UINT32">70000</slowheap>

<cpuclock type="UINT32" unit="KHz">2100000</cpuclock>

</arm>

<!-- Size of the shared memory heap. This is visible to all cores.

In units of 32-bit words -->

<shared_heap_size type="UINT32" unit="UINT32">262000</shared_heap_size>

<!-- These values specify the "targetInfo" which is read back by the Audio Weaver

Server when it connects to the target. This will be removed in the future. -->

<block_size type="UINT16">48</block_size>

<sample_rate type="UINT16">48000</sample_rate>

<in_channel type="UINT16">16</in_channel>

<out_channel type="UINT16">16</out_channel>

</params>

</config>

Anchor
_v8auwf32nh2v
_v8auwf32nh2v
Appendix B: Performance Benchmarks

...