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